From 07771a40521a63111b2e69ebe12e9686a0a443d7 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 21 Oct 2021 15:53:23 +0200 Subject: [PATCH 001/341] Flame: starting with otio export modul --- openpype/hosts/flame/otio/__init__.py | 0 openpype/hosts/flame/otio/flame_export.py | 448 ++++++++++++++++++++++ openpype/hosts/flame/otio/utils.py | 80 ++++ 3 files changed, 528 insertions(+) create mode 100644 openpype/hosts/flame/otio/__init__.py create mode 100644 openpype/hosts/flame/otio/flame_export.py create mode 100644 openpype/hosts/flame/otio/utils.py diff --git a/openpype/hosts/flame/otio/__init__.py b/openpype/hosts/flame/otio/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py new file mode 100644 index 0000000000..af4322e3d9 --- /dev/null +++ b/openpype/hosts/flame/otio/flame_export.py @@ -0,0 +1,448 @@ +""" compatibility OpenTimelineIO 0.12.0 and newer +""" + +import os +import re +import sys +import ast +from compiler.ast import flatten +import opentimelineio as otio +from . import utils +import hiero.core +import hiero.ui + +self = sys.modules[__name__] +self.track_types = { + hiero.core.VideoTrack: otio.schema.TrackKind.Video, + hiero.core.AudioTrack: otio.schema.TrackKind.Audio +} +self.project_fps = None +self.marker_color_map = { + "magenta": otio.schema.MarkerColor.MAGENTA, + "red": otio.schema.MarkerColor.RED, + "yellow": otio.schema.MarkerColor.YELLOW, + "green": otio.schema.MarkerColor.GREEN, + "cyan": otio.schema.MarkerColor.CYAN, + "blue": otio.schema.MarkerColor.BLUE, +} +self.timeline = None +self.include_tags = True + + +def get_current_hiero_project(remove_untitled=False): + projects = flatten(hiero.core.projects()) + if not remove_untitled: + return next(iter(projects)) + + # if remove_untitled + for proj in projects: + if "Untitled" in proj.name(): + proj.close() + else: + return proj + + +def create_otio_rational_time(frame, fps): + return otio.opentime.RationalTime( + float(frame), + float(fps) + ) + + +def create_otio_time_range(start_frame, frame_duration, fps): + return otio.opentime.TimeRange( + start_time=create_otio_rational_time(start_frame, fps), + duration=create_otio_rational_time(frame_duration, fps) + ) + + +def _get_metadata(item): + if hasattr(item, 'metadata'): + return {key: value for key, value in dict(item.metadata()).items()} + return {} + + +def create_time_effects(otio_clip, track_item): + # get all subtrack items + subTrackItems = flatten(track_item.parent().subTrackItems()) + speed = track_item.playbackSpeed() + + otio_effect = None + # retime on track item + if speed != 1.: + # make effect + otio_effect = otio.schema.LinearTimeWarp() + otio_effect.name = "Speed" + otio_effect.time_scalar = speed + otio_effect.metadata = {} + + # freeze frame effect + if speed == 0.: + otio_effect = otio.schema.FreezeFrame() + otio_effect.name = "FreezeFrame" + otio_effect.metadata = {} + + if otio_effect: + # add otio effect to clip effects + otio_clip.effects.append(otio_effect) + + # loop trought and get all Timewarps + for effect in subTrackItems: + if ((track_item not in effect.linkedItems()) + and (len(effect.linkedItems()) > 0)): + continue + # avoid all effect which are not TimeWarp and disabled + if "TimeWarp" not in effect.name(): + continue + + if not effect.isEnabled(): + continue + + node = effect.node() + name = node["name"].value() + + # solve effect class as effect name + _name = effect.name() + if "_" in _name: + effect_name = re.sub(r"(?:_)[_0-9]+", "", _name) # more numbers + else: + effect_name = re.sub(r"\d+", "", _name) # one number + + metadata = {} + # add knob to metadata + for knob in ["lookup", "length"]: + value = node[knob].value() + animated = node[knob].isAnimated() + if animated: + value = [ + ((node[knob].getValueAt(i)) - i) + for i in range( + track_item.timelineIn(), track_item.timelineOut() + 1) + ] + + metadata[knob] = value + + # make effect + otio_effect = otio.schema.TimeEffect() + otio_effect.name = name + otio_effect.effect_name = effect_name + otio_effect.metadata = metadata + + # add otio effect to clip effects + otio_clip.effects.append(otio_effect) + + +def create_otio_reference(clip): + metadata = _get_metadata(clip) + media_source = clip.mediaSource() + + # get file info for path and start frame + file_info = media_source.fileinfos().pop() + frame_start = file_info.startFrame() + path = file_info.filename() + + # get padding and other file infos + padding = media_source.filenamePadding() + file_head = media_source.filenameHead() + is_sequence = not media_source.singleFile() + frame_duration = media_source.duration() + fps = utils.get_rate(clip) or self.project_fps + extension = os.path.splitext(path)[-1] + + if is_sequence: + metadata.update({ + "isSequence": True, + "padding": padding + }) + + # add resolution metadata + metadata.update({ + "openpype.source.colourtransform": clip.sourceMediaColourTransform(), + "openpype.source.width": int(media_source.width()), + "openpype.source.height": int(media_source.height()), + "openpype.source.pixelAspect": float(media_source.pixelAspect()) + }) + + otio_ex_ref_item = None + + if is_sequence: + # if it is file sequence try to create `ImageSequenceReference` + # the OTIO might not be compatible so return nothing and do it old way + try: + dirname = os.path.dirname(path) + otio_ex_ref_item = otio.schema.ImageSequenceReference( + target_url_base=dirname + os.sep, + name_prefix=file_head, + name_suffix=extension, + start_frame=frame_start, + frame_zero_padding=padding, + rate=fps, + available_range=create_otio_time_range( + frame_start, + frame_duration, + fps + ) + ) + except AttributeError: + pass + + if not otio_ex_ref_item: + reformat_path = utils.get_reformated_path(path, padded=False) + # in case old OTIO or video file create `ExternalReference` + otio_ex_ref_item = otio.schema.ExternalReference( + target_url=reformat_path, + available_range=create_otio_time_range( + frame_start, + frame_duration, + fps + ) + ) + + # add metadata to otio item + add_otio_metadata(otio_ex_ref_item, media_source, **metadata) + + return otio_ex_ref_item + + +def get_marker_color(tag): + icon = tag.icon() + pat = r'icons:Tag(?P\w+)\.\w+' + + res = re.search(pat, icon) + if res: + color = res.groupdict().get('color') + if color.lower() in self.marker_color_map: + return self.marker_color_map[color.lower()] + + return otio.schema.MarkerColor.RED + + +def create_otio_markers(otio_item, item): + for tag in item.tags(): + if not tag.visible(): + continue + + if tag.name() == 'Copy': + # Hiero adds this tag to a lot of clips + continue + + frame_rate = utils.get_rate(item) or self.project_fps + + marked_range = otio.opentime.TimeRange( + start_time=otio.opentime.RationalTime( + tag.inTime(), + frame_rate + ), + duration=otio.opentime.RationalTime( + int(tag.metadata().dict().get('tag.length', '0')), + frame_rate + ) + ) + # add tag metadata but remove "tag." string + metadata = {} + + for key, value in tag.metadata().dict().items(): + _key = key.replace("tag.", "") + + try: + # capture exceptions which are related to strings only + _value = ast.literal_eval(value) + except (ValueError, SyntaxError): + _value = value + + metadata.update({_key: _value}) + + # Store the source item for future import assignment + metadata['hiero_source_type'] = item.__class__.__name__ + + marker = otio.schema.Marker( + name=tag.name(), + color=get_marker_color(tag), + marked_range=marked_range, + metadata=metadata + ) + + otio_item.markers.append(marker) + + +def create_otio_clip(track_item): + clip = track_item.source() + speed = track_item.playbackSpeed() + # flip if speed is in minus + source_in = track_item.sourceIn() if speed > 0 else track_item.sourceOut() + + duration = int(track_item.duration()) + + fps = utils.get_rate(track_item) or self.project_fps + name = track_item.name() + + media_reference = create_otio_reference(clip) + source_range = create_otio_time_range( + int(source_in), + int(duration), + fps + ) + + otio_clip = otio.schema.Clip( + name=name, + source_range=source_range, + media_reference=media_reference + ) + + # Add tags as markers + if self.include_tags: + create_otio_markers(otio_clip, track_item) + create_otio_markers(otio_clip, track_item.source()) + + # only if video + if not clip.mediaSource().hasAudio(): + # Add effects to clips + create_time_effects(otio_clip, track_item) + + return otio_clip + + +def create_otio_gap(gap_start, clip_start, tl_start_frame, fps): + return otio.schema.Gap( + source_range=create_otio_time_range( + gap_start, + (clip_start - tl_start_frame) - gap_start, + fps + ) + ) + + +def _create_otio_timeline(): + project = get_current_hiero_project(remove_untitled=False) + metadata = _get_metadata(self.timeline) + + metadata.update({ + "openpype.timeline.width": int(self.timeline.format().width()), + "openpype.timeline.height": int(self.timeline.format().height()), + "openpype.timeline.pixelAspect": int(self.timeline.format().pixelAspect()), # noqa + "openpype.project.useOCIOEnvironmentOverride": project.useOCIOEnvironmentOverride(), # noqa + "openpype.project.lutSetting16Bit": project.lutSetting16Bit(), + "openpype.project.lutSetting8Bit": project.lutSetting8Bit(), + "openpype.project.lutSettingFloat": project.lutSettingFloat(), + "openpype.project.lutSettingLog": project.lutSettingLog(), + "openpype.project.lutSettingViewer": project.lutSettingViewer(), + "openpype.project.lutSettingWorkingSpace": project.lutSettingWorkingSpace(), # noqa + "openpype.project.lutUseOCIOForExport": project.lutUseOCIOForExport(), + "openpype.project.ocioConfigName": project.ocioConfigName(), + "openpype.project.ocioConfigPath": project.ocioConfigPath() + }) + + start_time = create_otio_rational_time( + self.timeline.timecodeStart(), self.project_fps) + + return otio.schema.Timeline( + name=self.timeline.name(), + global_start_time=start_time, + metadata=metadata + ) + + +def create_otio_track(track_type, track_name): + return otio.schema.Track( + name=track_name, + kind=self.track_types[track_type] + ) + + +def add_otio_gap(track_item, otio_track, prev_out): + gap_length = track_item.timelineIn() - prev_out + if prev_out != 0: + gap_length -= 1 + + gap = otio.opentime.TimeRange( + duration=otio.opentime.RationalTime( + gap_length, + self.project_fps + ) + ) + otio_gap = otio.schema.Gap(source_range=gap) + otio_track.append(otio_gap) + + +def add_otio_metadata(otio_item, media_source, **kwargs): + metadata = _get_metadata(media_source) + + # add additional metadata from kwargs + if kwargs: + metadata.update(kwargs) + + # add metadata to otio item metadata + for key, value in metadata.items(): + otio_item.metadata.update({key: value}) + + +def create_otio_timeline(): + + def set_prev_item(itemindex, track_item): + # Add Gap if needed + if itemindex == 0: + # if it is first track item at track then add + # it to previouse item + return track_item + + else: + # get previouse item + return track_item.parent().items()[itemindex - 1] + + # get current timeline + self.timeline = hiero.ui.activeSequence() + self.project_fps = self.timeline.framerate().toFloat() + + # convert timeline to otio + otio_timeline = _create_otio_timeline() + + # loop all defined track types + for track in self.timeline.items(): + # skip if track is disabled + if not track.isEnabled(): + continue + + # convert track to otio + otio_track = create_otio_track( + type(track), track.name()) + + for itemindex, track_item in enumerate(track): + # Add Gap if needed + if itemindex == 0: + # if it is first track item at track then add + # it to previouse item + prev_item = track_item + + else: + # get previouse item + prev_item = track_item.parent().items()[itemindex - 1] + + # calculate clip frame range difference from each other + clip_diff = track_item.timelineIn() - prev_item.timelineOut() + + # add gap if first track item is not starting + # at first timeline frame + if itemindex == 0 and track_item.timelineIn() > 0: + add_otio_gap(track_item, otio_track, 0) + + # or add gap if following track items are having + # frame range differences from each other + elif itemindex and clip_diff != 1: + add_otio_gap(track_item, otio_track, prev_item.timelineOut()) + + # create otio clip and add it to track + otio_clip = create_otio_clip(track_item) + otio_track.append(otio_clip) + + # Add tags as markers + if self.include_tags: + create_otio_markers(otio_track, track) + + # add track to otio timeline + otio_timeline.tracks.append(otio_track) + + return otio_timeline + + +def write_to_file(otio_timeline, path): + otio.adapters.write_to_file(otio_timeline, path) diff --git a/openpype/hosts/flame/otio/utils.py b/openpype/hosts/flame/otio/utils.py new file mode 100644 index 0000000000..4c5d46bd51 --- /dev/null +++ b/openpype/hosts/flame/otio/utils.py @@ -0,0 +1,80 @@ +import re +import opentimelineio as otio + + +def timecode_to_frames(timecode, framerate): + rt = otio.opentime.from_timecode(timecode, 24) + return int(otio.opentime.to_frames(rt)) + + +def frames_to_timecode(frames, framerate): + rt = otio.opentime.from_frames(frames, framerate) + return otio.opentime.to_timecode(rt) + + +def frames_to_secons(frames, framerate): + rt = otio.opentime.from_frames(frames, framerate) + return otio.opentime.to_seconds(rt) + + +def get_reformated_path(path, padded=True): + """ + Return fixed python expression path + + Args: + path (str): path url or simple file name + + Returns: + type: string with reformated path + + Example: + get_reformated_path("plate.[0001-1008].exr") > plate.%04d.exr + + """ + if "%" in path: + padding_pattern = r"(\d+)" + padding = int(re.findall(padding_pattern, path).pop()) + num_pattern = r"(%\d+d)" + if padded: + path = re.sub(num_pattern, "%0{}d".format(padding), path) + else: + path = re.sub(num_pattern, "%d", path) + return path + + +def get_padding_from_path(path): + """ + Return padding number from DaVinci Resolve sequence path style + + Args: + path (str): path url or simple file name + + Returns: + int: padding number + + Example: + get_padding_from_path("plate.[0001-1008].exr") > 4 + + """ + padding_pattern = "(\\d+)(?=-)" + if "[" in path: + return len(re.findall(padding_pattern, path).pop()) + + return None + + +def get_rate(item): + if not hasattr(item, 'framerate'): + return None + + num, den = item.framerate().toRational() + + try: + rate = float(num) / float(den) + except ZeroDivisionError: + return None + + if rate.is_integer(): + return rate + + return round(rate, 4) From f38e4ce44ca09b7390aa4380671f38f14d3c0e8a Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 22 Oct 2021 11:26:21 +0200 Subject: [PATCH 002/341] Flame: testing passing selection from timeline --- openpype/hosts/flame/__init__.py | 2 ++ openpype/hosts/flame/api/menu.py | 15 ++++++++------- .../plugins/publish/collect_test_selection.py | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 openpype/hosts/flame/plugins/publish/collect_test_selection.py diff --git a/openpype/hosts/flame/__init__.py b/openpype/hosts/flame/__init__.py index dc3d3e7cba..28b7aa8ea5 100644 --- a/openpype/hosts/flame/__init__.py +++ b/openpype/hosts/flame/__init__.py @@ -51,6 +51,7 @@ INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory") app_framework = None apps = [] +selection = None __all__ = [ @@ -65,6 +66,7 @@ __all__ = [ "app_framework", "apps", + "selection", # pipeline "install", diff --git a/openpype/hosts/flame/api/menu.py b/openpype/hosts/flame/api/menu.py index 65d1535beb..d6788f3f52 100644 --- a/openpype/hosts/flame/api/menu.py +++ b/openpype/hosts/flame/api/menu.py @@ -7,7 +7,6 @@ from copy import deepcopy from .lib import rescan_hooks from openpype.tools.utils.host_tools import HostToolsHelper - menu_group_name = 'OpenPype' default_flame_export_presets = { @@ -16,6 +15,10 @@ default_flame_export_presets = { 'Thumbnail': {'PresetVisibility': 3, 'PresetType': 0, 'PresetFile': 'Generate Thumbnail.xml'} } +def send_selection(selection): + import openpype.hosts.flame as opflame + opflame.selection = selection + print(opflame.selection) class _FlameMenuApp(object): def __init__(self, framework): @@ -99,10 +102,12 @@ class FlameMenuProjectconnect(_FlameMenuApp): }) menu['actions'].append({ "name": "Create ...", + "isVisible": send_selection, "execute": lambda x: self.tools_helper.show_creator() }) menu['actions'].append({ "name": "Publish ...", + "isVisible": send_selection, "execute": lambda x: self.tools_helper.show_publish() }) menu['actions'].append({ @@ -119,9 +124,6 @@ class FlameMenuProjectconnect(_FlameMenuApp): }) return menu - def get_projects(self, *args, **kwargs): - pass - def refresh(self, *args, **kwargs): self.rescan() @@ -163,10 +165,12 @@ class FlameMenuTimeline(_FlameMenuApp): menu['actions'].append({ "name": "Create ...", + "isVisible": send_selection, "execute": lambda x: self.tools_helper.show_creator() }) menu['actions'].append({ "name": "Publish ...", + "isVisible": send_selection, "execute": lambda x: self.tools_helper.show_publish() }) menu['actions'].append({ @@ -180,9 +184,6 @@ class FlameMenuTimeline(_FlameMenuApp): return menu - def get_projects(self, *args, **kwargs): - pass - def refresh(self, *args, **kwargs): self.rescan() diff --git a/openpype/hosts/flame/plugins/publish/collect_test_selection.py b/openpype/hosts/flame/plugins/publish/collect_test_selection.py new file mode 100644 index 0000000000..6534894f2e --- /dev/null +++ b/openpype/hosts/flame/plugins/publish/collect_test_selection.py @@ -0,0 +1,15 @@ +import pyblish.api +import openpype.hosts.flame as opflame +import flame + +@pyblish.api.log +class CollectTestSelection(pyblish.api.ContextPlugin): + """testing selection sharing + """ + + order = pyblish.api.CollectorOrder + label = "test selection" + hosts = ["flame"] + + def process(self, context): + self.log.info(opflame.selection) \ No newline at end of file From fabfaac3f56df68e7096402f9223623ce6e35e58 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 16 Nov 2021 09:43:42 +0100 Subject: [PATCH 003/341] OP-2019 - extracted headless_publish function to lib --- openpype/lib/remote_publish.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/openpype/lib/remote_publish.py b/openpype/lib/remote_publish.py index f7d7955b79..79b130913f 100644 --- a/openpype/lib/remote_publish.py +++ b/openpype/lib/remote_publish.py @@ -11,6 +11,21 @@ from openpype.lib.mongo import OpenPypeMongoConnection from openpype.lib.plugin_tools import parse_json +def headless_publish(log): + """Runs publish in a opened host with a context and closes Python process. + + Host is being closed via ClosePS pyblish plugin which triggers 'exit' + method in ConsoleTrayApp. + """ + dbcon = get_webpublish_conn() + _id = os.environ.get("BATCH_LOG_ID") + if not _id: + log.warning("Unable to store log records, batch will be unfinished!") + return + + publish_and_log(dbcon, _id, log, 'CloseAE') + + def get_webpublish_conn(): """Get connection to OP 'webpublishes' collection.""" mongo_client = OpenPypeMongoConnection.get_mongo_client() From 939eabfc41f6e284c826cd225fc718865bf952cf Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 16 Nov 2021 09:44:16 +0100 Subject: [PATCH 004/341] OP-2019 - remote publish needs to have order of methods flipped --- .../hosts/aftereffects/plugins/publish/extract_local_render.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py b/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py index 37337e7fee..b36ab24bde 100644 --- a/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py +++ b/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py @@ -19,10 +19,9 @@ class ExtractLocalRender(openpype.api.Extractor): staging_dir = instance.data["stagingDir"] self.log.info("staging_dir::{}".format(staging_dir)) - stub.render(staging_dir) - # pull file name from Render Queue Output module render_q = stub.get_render_info() + stub.render(staging_dir) if not render_q: raise ValueError("No file extension set in Render Queue") _, ext = os.path.splitext(os.path.basename(render_q.file_name)) From 6b45101ed087e8a49d59a8efa01477a6e725a120 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 16 Nov 2021 09:44:49 +0100 Subject: [PATCH 005/341] OP-2019 - added test classes for remote publish --- .../aftereffects/plugins/publish/closeAE.py | 29 ++++++ .../test_publish_in_aftereffects.py | 96 +++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 openpype/hosts/aftereffects/plugins/publish/closeAE.py create mode 100644 tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py diff --git a/openpype/hosts/aftereffects/plugins/publish/closeAE.py b/openpype/hosts/aftereffects/plugins/publish/closeAE.py new file mode 100644 index 0000000000..e6e9623474 --- /dev/null +++ b/openpype/hosts/aftereffects/plugins/publish/closeAE.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +"""Close AE after publish. For Webpublishing only.""" +import os + +import pyblish.api + +from avalon import aftereffects + + +class CloseAE(pyblish.api.ContextPlugin): + """Close AE after publish. For Webpublishing only. + """ + + order = pyblish.api.IntegratorOrder + 14 + label = "Close AE" + optional = True + active = True + + hosts = ["aftereffects"] + targets = ["remotepublish"] + + def process(self, context): + self.log.info("CloseAE") + + stub = aftereffects.stub() + self.log.info("Shutting down AE") + stub.save() + stub.close() + self.log.info("AE closed") diff --git a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py new file mode 100644 index 0000000000..f709e40120 --- /dev/null +++ b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py @@ -0,0 +1,96 @@ +import pytest +import os +import shutil + +from tests.lib.testing_classes import PublishTest + + +class TestPublishInAfterEffects(PublishTest): + """Basic test case for publishing in AfterEffects + + Uses generic TestCase to prepare fixtures for test data, testing DBs, + env vars. + + Opens AfterEffects, run publish on prepared workile. + + Then checks content of DB (if subset, version, representations were + created. + Checks tmp folder if all expected files were published. + + """ + PERSIST = True + + TEST_FILES = [ + ("1qsrq6OJWVpOeXE2LTWrdbsLqEVu155Uf", + "test_aftereffects_publish.zip", + "") + ] + + APP = "aftereffects" + APP_VARIANT = "2021" + + APP_NAME = "{}/{}".format(APP, APP_VARIANT) + + TIMEOUT = 120 # publish timeout + + @pytest.fixture(scope="module") + def last_workfile_path(self, download_test_data): + """Get last_workfile_path from source data. + + Maya expects workfile in proper folder, so copy is done first. + """ + src_path = os.path.join(download_test_data, + "input", + "workfile", + "test_project_test_asset_TestTask_v001.aep") + dest_folder = os.path.join(download_test_data, + self.PROJECT, + self.ASSET, + "work", + self.TASK) + os.makedirs(dest_folder) + dest_path = os.path.join(dest_folder, + "test_project_test_asset_TestTask_v001.aep") + shutil.copy(src_path, dest_path) + + yield dest_path + + @pytest.fixture(scope="module") + def startup_scripts(self, monkeypatch_session, download_test_data): + """Points AfterEffects to userSetup file from input data""" + os.environ["HEADLESS_PUBLISH"] = "true" + + def test_db_asserts(self, dbcon, publish_finished): + """Host and input data dependent expected results in DB.""" + print("test_db_asserts") + assert 5 == dbcon.count_documents({"type": "version"}), \ + "Not expected no of versions" + + assert 0 == dbcon.count_documents({"type": "version", + "name": {"$ne": 1}}), \ + "Only versions with 1 expected" + + assert 1 == dbcon.count_documents({"type": "subset", + "name": "modelMain"}), \ + "modelMain subset must be present" + + assert 1 == dbcon.count_documents({"type": "subset", + "name": "workfileTest_task"}), \ + "workfileTest_task subset must be present" + + assert 11 == dbcon.count_documents({"type": "representation"}), \ + "Not expected no of representations" + + assert 2 == dbcon.count_documents({"type": "representation", + "context.subset": "modelMain", + "context.ext": "abc"}), \ + "Not expected no of representations with ext 'abc'" + + assert 2 == dbcon.count_documents({"type": "representation", + "context.subset": "modelMain", + "context.ext": "ma"}), \ + "Not expected no of representations with ext 'abc'" + + +if __name__ == "__main__": + test_case = TestPublishInAfterEffects() From af1a06c00052743f928cbe67d75ce448bc86fe6d Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 18 Nov 2021 18:02:06 +0100 Subject: [PATCH 006/341] OP-2019 - bump up version of PS --- tests/integration/hosts/photoshop/test_publish_in_photoshop.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py index 396468a966..3fdfce7cc0 100644 --- a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py +++ b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py @@ -25,7 +25,7 @@ class TestPublishInPhotoshop(PublishTest): ] APP = "photoshop" - APP_VARIANT = "2020" + APP_VARIANT = "2021" APP_NAME = "{}/{}".format(APP, APP_VARIANT) From 04fd46f9e91e6b42089957581c25b18ad51062b0 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 18 Nov 2021 18:02:42 +0100 Subject: [PATCH 007/341] OP-2019 - added AE 2022 --- .../defaults/system_settings/applications.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/openpype/settings/defaults/system_settings/applications.json b/openpype/settings/defaults/system_settings/applications.json index cc80a94d3f..8c119658be 100644 --- a/openpype/settings/defaults/system_settings/applications.json +++ b/openpype/settings/defaults/system_settings/applications.json @@ -1098,6 +1098,23 @@ "linux": [] }, "environment": {} + }, + "2022": { + "enabled": true, + "variant_label": "2022", + "executables": { + "windows": [ + "C:\\Program Files\\Adobe\\Adobe After Effects 2022\\Support Files\\AfterFX.exe" + ], + "darwin": [], + "linux": [] + }, + "arguments": { + "windows": [], + "darwin": [], + "linux": [] + }, + "environment": {} } } }, From 1369098454ac40bc474283706e6508d756dd8bcb Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 18 Nov 2021 18:07:07 +0100 Subject: [PATCH 008/341] OP-2019 - added IS_TEST env var Used to differentiate between regular REMOTE_PUBLISH and automatic tests --- tests/integration/hosts/photoshop/test_publish_in_photoshop.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py index 3fdfce7cc0..f8be8599ee 100644 --- a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py +++ b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py @@ -57,6 +57,7 @@ class TestPublishInPhotoshop(PublishTest): def startup_scripts(self, monkeypatch_session, download_test_data): """Points Maya to userSetup file from input data""" os.environ["IS_HEADLESS"] = "true" + os.environ["IS_TEST"] = "true" def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" From 30e39bebabc7352bcc998850931a58b7bc95ec65 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 18 Nov 2021 18:15:08 +0100 Subject: [PATCH 009/341] OP-2019 - removed setting env vars in class Necessary env vars should be configured in testing zip file --- tests/integration/hosts/photoshop/test_publish_in_photoshop.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py index f8be8599ee..b634d422f3 100644 --- a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py +++ b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py @@ -56,8 +56,7 @@ class TestPublishInPhotoshop(PublishTest): @pytest.fixture(scope="module") def startup_scripts(self, monkeypatch_session, download_test_data): """Points Maya to userSetup file from input data""" - os.environ["IS_HEADLESS"] = "true" - os.environ["IS_TEST"] = "true" + pass def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" From 35153fca3ae5d83a64334f9bda14bcd40e011a60 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 18 Nov 2021 18:16:56 +0100 Subject: [PATCH 010/341] OP-2019 - added working test case for After Effects --- .../hosts/aftereffects/test_publish_in_aftereffects.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py index f709e40120..d4e88dfd4c 100644 --- a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py +++ b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py @@ -58,7 +58,7 @@ class TestPublishInAfterEffects(PublishTest): @pytest.fixture(scope="module") def startup_scripts(self, monkeypatch_session, download_test_data): """Points AfterEffects to userSetup file from input data""" - os.environ["HEADLESS_PUBLISH"] = "true" + pass def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" From 7456d0c3805f7d26e867ba46a08c75ccef97e632 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 18 Nov 2021 18:17:21 +0100 Subject: [PATCH 011/341] OP-2019 - added remote publishing method for automatic tests --- openpype/lib/remote_publish.py | 45 ++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/openpype/lib/remote_publish.py b/openpype/lib/remote_publish.py index 79b130913f..3483898af7 100644 --- a/openpype/lib/remote_publish.py +++ b/openpype/lib/remote_publish.py @@ -11,19 +11,23 @@ from openpype.lib.mongo import OpenPypeMongoConnection from openpype.lib.plugin_tools import parse_json -def headless_publish(log): +def headless_publish(log, close_plugin_name=None, is_test=False): """Runs publish in a opened host with a context and closes Python process. Host is being closed via ClosePS pyblish plugin which triggers 'exit' method in ConsoleTrayApp. """ - dbcon = get_webpublish_conn() - _id = os.environ.get("BATCH_LOG_ID") - if not _id: - log.warning("Unable to store log records, batch will be unfinished!") - return + if not is_test: + dbcon = get_webpublish_conn() + _id = os.environ.get("BATCH_LOG_ID") + if not _id: + log.warning("Unable to store log records, " + "batch will be unfinished!") + return - publish_and_log(dbcon, _id, log, 'CloseAE') + publish_and_log(dbcon, _id, log, close_plugin_name) + else: + publish(log, 'CloseAE') def get_webpublish_conn(): @@ -51,6 +55,33 @@ def start_webpublish_log(dbcon, batch_id, user): }).inserted_id +def publish(log, close_plugin_name=None): + """Loops through all plugins, logs to console. Used for tests. + + Args: + log (OpenPypeLogger) + close_plugin_name (str): name of plugin with responsibility to + close host app + """ + # Error exit as soon as any error occurs. + error_format = "Failed {plugin.__name__}: {error} -- {error.traceback}" + + close_plugin = _get_close_plugin(close_plugin_name, log) + + for result in pyblish.util.publish_iter(): + for record in result["records"]: + log.info("{}: {}".format( + result["plugin"].label, record.msg)) + + if result["error"]: + log.error(error_format.format(**result)) + uninstall() + if close_plugin: # close host app explicitly after error + context = pyblish.api.Context() + close_plugin().process(context) + sys.exit(1) + + def publish_and_log(dbcon, _id, log, close_plugin_name=None): """Loops through all plugins, logs ok and fails into OP DB. From bcdca93cacbcc015d7b09babf3d23ca446b5cf8a Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 18 Nov 2021 18:17:56 +0100 Subject: [PATCH 012/341] OP-2019 - removed unwanted host --- openpype/hooks/pre_foundry_apps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hooks/pre_foundry_apps.py b/openpype/hooks/pre_foundry_apps.py index 7df1a6a833..85f68c6b60 100644 --- a/openpype/hooks/pre_foundry_apps.py +++ b/openpype/hooks/pre_foundry_apps.py @@ -13,7 +13,7 @@ class LaunchFoundryAppsWindows(PreLaunchHook): # Should be as last hook because must change launch arguments to string order = 1000 - app_groups = ["nuke", "nukex", "hiero", "nukestudio", "photoshop"] + app_groups = ["nuke", "nukex", "hiero", "nukestudio"] platforms = ["windows"] def execute(self): From 1154f61ac1a0d9382b3f9cd4304d77e2be9c65da Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 19 Nov 2021 12:26:28 +0100 Subject: [PATCH 013/341] OP-2019 - added details into documentation --- tests/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/README.md b/tests/README.md index 6317b2ab3c..d0578f8059 100644 --- a/tests/README.md +++ b/tests/README.md @@ -14,12 +14,12 @@ How to run: ---------- - single test class could be run by PyCharm and its pytest runner directly - OR -- use Openpype command 'runtests' from command line --- `${OPENPYPE_ROOT}/start.py runtests` +- use Openpype command 'runtests' from command line (`.venv` in ${OPENPYPE_ROOT} must be activated to use configured Python!) +-- `${OPENPYPE_ROOT}/python start.py runtests` By default, this command will run all tests in ${OPENPYPE_ROOT}/tests. Specific location could be provided to this command as an argument, either as absolute path, or relative path to ${OPENPYPE_ROOT}. -(eg. `${OPENPYPE_ROOT}/start.py runtests ../tests/integration`) will trigger only tests in `integration` folder. +(eg. `${OPENPYPE_ROOT}/python start.py runtests ../tests/integration`) will trigger only tests in `integration` folder. See `${OPENPYPE_ROOT}/cli.py:runtests` for other arguments. From fbb9d3e23279b6725a3d326ca1a93928c53cdedd Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Mon, 22 Nov 2021 13:58:51 +0100 Subject: [PATCH 014/341] Add parent asset in anatomy --- openpype/lib/avalon_context.py | 5 +++++ .../plugins/publish/collect_anatomy_context_data.py | 5 +++++ openpype/tools/workfiles/app.py | 11 ++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index 372e116f43..581e4b9dbd 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -486,6 +486,10 @@ def get_workdir_data(project_doc, asset_doc, task_name, host_name): project_task_types = project_doc["config"]["tasks"] task_code = project_task_types.get(task_type, {}).get("short_name") + parent = project_doc["name"] + if len(asset_doc["data"]["parents"]) != 0: + parent = asset_doc["data"]["parents"][-1] + data = { "project": { "name": project_doc["name"], @@ -497,6 +501,7 @@ def get_workdir_data(project_doc, asset_doc, task_name, host_name): "short": task_code, }, "asset": asset_doc["name"], + "parent": parent, "app": host_name, "user": getpass.getuser(), "hierarchy": hierarchy, diff --git a/openpype/plugins/publish/collect_anatomy_context_data.py b/openpype/plugins/publish/collect_anatomy_context_data.py index 6b95979b76..b0c9eea576 100644 --- a/openpype/plugins/publish/collect_anatomy_context_data.py +++ b/openpype/plugins/publish/collect_anatomy_context_data.py @@ -60,12 +60,17 @@ class CollectAnatomyContextData(pyblish.api.ContextPlugin): project_task_types = project_entity["config"]["tasks"] task_code = project_task_types.get(task_type, {}).get("short_name") + parent = project_entity["name"] + if len(asset_entity["data"]["parents"]) != 0: + parent = asset_entity["data"]["parents"][-1] + context_data = { "project": { "name": project_entity["name"], "code": project_entity["data"].get("code") }, "asset": asset_entity["name"], + "parent": parent, "hierarchy": hierarchy.replace("\\", "/"), "task": { "name": task_name, diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index a4b1717a1c..4253f7450a 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -68,12 +68,16 @@ class NameWindow(QtWidgets.QDialog): "config.tasks": True, } ) + asset_doc = io.find_one( { "type": "asset", "name": asset_name }, - {"data.tasks": True} + { + "data.tasks": True, + "data.parents": True + } ) task_type = asset_doc["data"]["tasks"].get(task_name, {}).get("type") @@ -81,6 +85,10 @@ class NameWindow(QtWidgets.QDialog): project_task_types = project_doc["config"]["tasks"] task_short = project_task_types.get(task_type, {}).get("short_name") + parent = project_doc["name"] + if len(asset_doc["data"]["parents"]) != 0: + parent = asset_doc["data"]["parents"][-1] + self.data = { "project": { "name": project_doc["name"], @@ -92,6 +100,7 @@ class NameWindow(QtWidgets.QDialog): "type": task_type, "short": task_short, }, + "parent": parent, "version": 1, "user": getpass.getuser(), "comment": "", From 41a02fddc4b6241602f01620b3756d2887be9e54 Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Fri, 29 Oct 2021 11:34:26 +0200 Subject: [PATCH 015/341] add parent asset to doc --- website/docs/admin_settings_project_anatomy.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/website/docs/admin_settings_project_anatomy.md b/website/docs/admin_settings_project_anatomy.md index 30784686e2..e897b0ffab 100644 --- a/website/docs/admin_settings_project_anatomy.md +++ b/website/docs/admin_settings_project_anatomy.md @@ -57,9 +57,14 @@ We have a few required anatomy templates for OpenPype to work properly, however | `project[code]` | Project's code | | `hierarchy` | All hierarchical parents as subfolders | | `asset` | Name of asset or shot | +<<<<<<< HEAD | `task[name]` | Name of task | | `task[type]` | Type of task | | `task[short]` | Shortname of task | +======= +| `parent` | Name of parent folder | +| `task` | Name of task | +>>>>>>> add7db0c0... add parent asset to doc | `version` | Version number | | `subset` | Subset name | | `family` | Main family name | From dfdc1798cff1c3e7af7f42eb1ea86102d697770c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Nov 2021 21:40:46 +0000 Subject: [PATCH 016/341] Bump algoliasearch-helper from 3.4.4 to 3.6.2 in /website Bumps [algoliasearch-helper](https://github.com/algolia/algoliasearch-helper-js) from 3.4.4 to 3.6.2. - [Release notes](https://github.com/algolia/algoliasearch-helper-js/releases) - [Changelog](https://github.com/algolia/algoliasearch-helper-js/blob/develop/CHANGELOG) - [Commits](https://github.com/algolia/algoliasearch-helper-js/compare/3.4.4...3.6.2) --- updated-dependencies: - dependency-name: algoliasearch-helper dependency-type: indirect ... Signed-off-by: dependabot[bot] --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index ae40005384..89da2289de 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -1961,9 +1961,9 @@ ajv@^6.1.0, ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" algoliasearch-helper@^3.3.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.4.4.tgz#f2eb46bc4d2f6fed82c7201b8ac4ce0a1988ae67" - integrity sha512-OjyVLjykaYKCMxxRMZNiwLp8CS310E0qAeIY2NaublcmLAh8/SL19+zYHp7XCLtMem2ZXwl3ywMiA32O9jszuw== + version "3.6.2" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.6.2.tgz#45e19b12589cfa0c611b573287f65266ea2cc14a" + integrity sha512-Xx0NOA6k4ySn+R2l3UMSONAaMkyfmrZ3AP1geEMo32MxDJQJesZABZYsldO9fa6FKQxH91afhi4hO1G0Zc2opg== dependencies: events "^1.1.1" From baba65d5e7b2a36e8363bc3ba0a269bb28f690fb Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 26 Nov 2021 15:39:06 +0100 Subject: [PATCH 017/341] use composite_images from 'tvpaint.lib' --- openpype/hosts/tvpaint/api/lib.py | 19 ------------------- .../plugins/publish/extract_sequence.py | 7 ++++--- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/openpype/hosts/tvpaint/api/lib.py b/openpype/hosts/tvpaint/api/lib.py index 539cebe646..8e63c9e5b2 100644 --- a/openpype/hosts/tvpaint/api/lib.py +++ b/openpype/hosts/tvpaint/api/lib.py @@ -4,25 +4,6 @@ import avalon.io from avalon.tvpaint.lib import execute_george -def composite_images(input_image_paths, output_filepath): - """Composite images in order from passed list. - - Raises: - ValueError: When entered list is empty. - """ - if not input_image_paths: - raise ValueError("Nothing to composite.") - - img_obj = None - for image_filepath in input_image_paths: - _img_obj = Image.open(image_filepath) - if img_obj is None: - img_obj = _img_obj - else: - img_obj.alpha_composite(_img_obj) - img_obj.save(output_filepath) - - def set_context_settings(asset_doc=None): """Set workfile settings by asset document data. diff --git a/openpype/hosts/tvpaint/plugins/publish/extract_sequence.py b/openpype/hosts/tvpaint/plugins/publish/extract_sequence.py index 6235b6211d..31f685919e 100644 --- a/openpype/hosts/tvpaint/plugins/publish/extract_sequence.py +++ b/openpype/hosts/tvpaint/plugins/publish/extract_sequence.py @@ -2,17 +2,18 @@ import os import copy import tempfile +from PIL import Image + import pyblish.api from avalon.tvpaint import lib -from openpype.hosts.tvpaint.api.lib import composite_images from openpype.hosts.tvpaint.lib import ( calculate_layers_extraction_data, get_frame_filename_template, fill_reference_frames, composite_rendered_layers, - rename_filepaths_by_frame_start + rename_filepaths_by_frame_start, + composite_images ) -from PIL import Image class ExtractSequence(pyblish.api.Extractor): From ced7ff99377a227cb0a4dcba62b3626a387ea511 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 26 Nov 2021 15:39:37 +0100 Subject: [PATCH 018/341] copied communication server to openpype --- .../hosts/tvpaint/api/communication_server.py | 939 ++++++++++++++++++ 1 file changed, 939 insertions(+) create mode 100644 openpype/hosts/tvpaint/api/communication_server.py diff --git a/openpype/hosts/tvpaint/api/communication_server.py b/openpype/hosts/tvpaint/api/communication_server.py new file mode 100644 index 0000000000..6c8aca5445 --- /dev/null +++ b/openpype/hosts/tvpaint/api/communication_server.py @@ -0,0 +1,939 @@ +import os +import json +import time +import subprocess +import collections +import asyncio +import logging +import socket +import platform +import filecmp +import tempfile +import threading +import shutil +from queue import Queue +from contextlib import closing + +from aiohttp import web +from aiohttp_json_rpc import JsonRpc +from aiohttp_json_rpc.protocol import ( + encode_request, encode_error, decode_msg, JsonRpcMsgTyp +) +from aiohttp_json_rpc.exceptions import RpcError + +from avalon import api +from openpype.hosts.tvpaint.tvpaint_plugin import get_plugin_files_path + +log = logging.getLogger(__name__) +log.setLevel(logging.DEBUG) + + +class CommunicationWrapper: + # TODO add logs and exceptions + communicator = None + + log = logging.getLogger("CommunicationWrapper") + + @classmethod + def create_qt_communicator(cls, *args, **kwargs): + """Create communicator for Artist usage.""" + communicator = QtCommunicator(*args, **kwargs) + cls.set_communicator(communicator) + return communicator + + @classmethod + def set_communicator(cls, communicator): + if not cls.communicator: + cls.communicator = communicator + else: + cls.log.warning("Communicator was set multiple times.") + + @classmethod + def client(cls): + if not cls.communicator: + return None + return cls.communicator.client() + + @classmethod + def execute_george(cls, george_script): + """Execute passed goerge script in TVPaint.""" + if not cls.communicator: + return + return cls.communicator.execute_george(george_script) + + +class WebSocketServer: + def __init__(self): + self.client = None + + self.loop = asyncio.new_event_loop() + self.app = web.Application(loop=self.loop) + self.port = self.find_free_port() + self.websocket_thread = WebsocketServerThread( + self, self.port, loop=self.loop + ) + + @property + def server_is_running(self): + return self.websocket_thread.server_is_running + + def add_route(self, *args, **kwargs): + self.app.router.add_route(*args, **kwargs) + + @staticmethod + def find_free_port(): + with closing( + socket.socket(socket.AF_INET, socket.SOCK_STREAM) + ) as sock: + sock.bind(("", 0)) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + port = sock.getsockname()[1] + return port + + def start(self): + self.websocket_thread.start() + + def stop(self): + try: + if self.websocket_thread.is_running: + log.debug("Stopping websocket server") + self.websocket_thread.is_running = False + self.websocket_thread.stop() + except Exception: + log.warning( + "Error has happened during Killing websocket server", + exc_info=True + ) + + +class WebsocketServerThread(threading.Thread): + """ Listener for websocket rpc requests. + + It would be probably better to "attach" this to main thread (as for + example Harmony needs to run something on main thread), but currently + it creates separate thread and separate asyncio event loop + """ + def __init__(self, module, port, loop): + super(WebsocketServerThread, self).__init__() + self.is_running = False + self.server_is_running = False + self.port = port + self.module = module + self.loop = loop + self.runner = None + self.site = None + self.tasks = [] + + def run(self): + self.is_running = True + + try: + log.debug("Starting websocket server") + + self.loop.run_until_complete(self.start_server()) + + log.info( + "Running Websocket server on URL:" + " \"ws://localhost:{}\"".format(self.port) + ) + + asyncio.ensure_future(self.check_shutdown(), loop=self.loop) + + self.server_is_running = True + self.loop.run_forever() + + except Exception: + log.warning( + "Websocket Server service has failed", exc_info=True + ) + finally: + self.server_is_running = False + # optional + self.loop.close() + + self.is_running = False + log.info("Websocket server stopped") + + async def start_server(self): + """ Starts runner and TCPsite """ + self.runner = web.AppRunner(self.module.app) + await self.runner.setup() + self.site = web.TCPSite(self.runner, "localhost", self.port) + await self.site.start() + + def stop(self): + """Sets is_running flag to false, 'check_shutdown' shuts server down""" + self.is_running = False + + async def check_shutdown(self): + """ Future that is running and checks if server should be running + periodically. + """ + while self.is_running: + while self.tasks: + task = self.tasks.pop(0) + log.debug("waiting for task {}".format(task)) + await task + log.debug("returned value {}".format(task.result)) + + await asyncio.sleep(0.5) + + log.debug("## Server shutdown started") + + await self.site.stop() + log.debug("# Site stopped") + await self.runner.cleanup() + log.debug("# Server runner stopped") + tasks = [ + task for task in asyncio.all_tasks() + if task is not asyncio.current_task() + ] + list(map(lambda task: task.cancel(), tasks)) # cancel all the tasks + results = await asyncio.gather(*tasks, return_exceptions=True) + log.debug(f"Finished awaiting cancelled tasks, results: {results}...") + await self.loop.shutdown_asyncgens() + # to really make sure everything else has time to stop + await asyncio.sleep(0.07) + self.loop.stop() + + +class BaseTVPaintRpc(JsonRpc): + def __init__(self, communication_obj, route_name="", **kwargs): + super().__init__(**kwargs) + self.requests_ids = collections.defaultdict(lambda: 0) + self.waiting_requests = collections.defaultdict(list) + self.responses = collections.defaultdict(list) + + self.route_name = route_name + self.communication_obj = communication_obj + + async def _handle_rpc_msg(self, http_request, raw_msg): + # This is duplicated code from super but there is no way how to do it + # to be able handle server->client requests + host = http_request.host + if host in self.waiting_requests: + try: + _raw_message = raw_msg.data + msg = decode_msg(_raw_message) + + except RpcError as error: + await self._ws_send_str(http_request, encode_error(error)) + return + + if msg.type in (JsonRpcMsgTyp.RESULT, JsonRpcMsgTyp.ERROR): + msg_data = json.loads(_raw_message) + if msg_data.get("id") in self.waiting_requests[host]: + self.responses[host].append(msg_data) + return + + return await super()._handle_rpc_msg(http_request, raw_msg) + + def client_connected(self): + # TODO This is poor check. Add check it is client from TVPaint + if self.clients: + return True + return False + + def send_notification(self, client, method, params=None): + if params is None: + params = [] + asyncio.run_coroutine_threadsafe( + client.ws.send_str(encode_request(method, params=params)), + loop=self.loop + ) + + def send_request(self, client, method, params=None, timeout=0): + if params is None: + params = [] + + client_host = client.host + + request_id = self.requests_ids[client_host] + self.requests_ids[client_host] += 1 + + self.waiting_requests[client_host].append(request_id) + + log.debug("Sending request to client {} ({}, {}) id: {}".format( + client_host, method, params, request_id + )) + future = asyncio.run_coroutine_threadsafe( + client.ws.send_str(encode_request(method, request_id, params)), + loop=self.loop + ) + result = future.result() + + not_found = object() + response = not_found + start = time.time() + while True: + if client.ws.closed: + return None + + for _response in self.responses[client_host]: + _id = _response.get("id") + if _id == request_id: + response = _response + break + + if response is not not_found: + break + + if timeout > 0 and (time.time() - start) > timeout: + raise Exception("Timeout passed") + return + + time.sleep(0.1) + + if response is not_found: + raise Exception("Connection closed") + + self.responses[client_host].remove(response) + + error = response.get("error") + result = response.get("result") + if error: + raise Exception("Error happened: {}".format(error)) + return result + + +class QtTVPaintRpc(BaseTVPaintRpc): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + from openpype.tools.utils import host_tools + self.tools_helper = host_tools.HostToolsHelper() + + route_name = self.route_name + + # Register methods + self.add_methods( + (route_name, self.workfiles_tool), + (route_name, self.loader_tool), + (route_name, self.creator_tool), + (route_name, self.subset_manager_tool), + (route_name, self.publish_tool), + (route_name, self.scene_inventory_tool), + (route_name, self.library_loader_tool), + (route_name, self.experimental_tools) + ) + + # Panel routes for tools + async def workfiles_tool(self): + log.info("Triggering Workfile tool") + item = MainThreadItem(self.tools_helper.show_workfiles) + self._execute_in_main_thread(item) + return + + async def loader_tool(self): + log.info("Triggering Loader tool") + item = MainThreadItem(self.tools_helper.show_loader) + self._execute_in_main_thread(item) + return + + async def creator_tool(self): + log.info("Triggering Creator tool") + item = MainThreadItem(self.tools_helper.show_creator) + await self._async_execute_in_main_thread(item, wait=False) + + async def subset_manager_tool(self): + log.info("Triggering Subset Manager tool") + item = MainThreadItem(self.tools_helper.show_subset_manager) + # Do not wait for result of callback + self._execute_in_main_thread(item, wait=False) + return + + async def publish_tool(self): + log.info("Triggering Publish tool") + item = MainThreadItem(self.tools_helper.show_publish) + self._execute_in_main_thread(item) + return + + async def scene_inventory_tool(self): + """Open Scene Inventory tool. + + Funciton can't confirm if tool was opened becauise one part of + SceneInventory initialization is calling websocket request to host but + host can't response because is waiting for response from this call. + """ + log.info("Triggering Scene inventory tool") + item = MainThreadItem(self.tools_helper.show_scene_inventory) + # Do not wait for result of callback + self._execute_in_main_thread(item, wait=False) + return + + async def library_loader_tool(self): + log.info("Triggering Library loader tool") + item = MainThreadItem(self.tools_helper.show_library_loader) + self._execute_in_main_thread(item) + return + + async def experimental_tools(self): + log.info("Triggering Library loader tool") + item = MainThreadItem(self.tools_helper.show_experimental_tools_dialog) + self._execute_in_main_thread(item) + return + + async def _async_execute_in_main_thread(self, item, **kwargs): + await self.communication_obj.async_execute_in_main_thread( + item, **kwargs + ) + + def _execute_in_main_thread(self, item, **kwargs): + return self.communication_obj.execute_in_main_thread(item, **kwargs) + + +class MainThreadItem: + """Structure to store information about callback in main thread. + + Item should be used to execute callback in main thread which may be needed + for execution of Qt objects. + + Item store callback (callable variable), arguments and keyword arguments + for the callback. Item hold information about it's process. + """ + not_set = object() + sleep_time = 0.1 + + def __init__(self, callback, *args, **kwargs): + self.done = False + self.exception = self.not_set + self.result = self.not_set + self.callback = callback + self.args = args + self.kwargs = kwargs + + def execute(self): + """Execute callback and store it's result. + + Method must be called from main thread. Item is marked as `done` + when callback execution finished. Store output of callback of exception + information when callback raise one. + """ + log.debug("Executing process in main thread") + if self.done: + log.warning("- item is already processed") + return + + callback = self.callback + args = self.args + kwargs = self.kwargs + log.info("Running callback: {}".format(str(callback))) + try: + result = callback(*args, **kwargs) + self.result = result + + except Exception as exc: + self.exception = exc + + finally: + self.done = True + + def wait(self): + """Wait for result from main thread. + + This method stops current thread until callback is executed. + + Returns: + object: Output of callback. May be any type or object. + + Raises: + Exception: Reraise any exception that happened during callback + execution. + """ + while not self.done: + time.sleep(self.sleep_time) + + if self.exception is self.not_set: + return self.result + raise self.exception + + async def async_wait(self): + """Wait for result from main thread. + + Returns: + object: Output of callback. May be any type or object. + + Raises: + Exception: Reraise any exception that happened during callback + execution. + """ + while not self.done: + await asyncio.sleep(self.sleep_time) + + if self.exception is self.not_set: + return self.result + raise self.exception + + +class BaseCommunicator: + def __init__(self): + self.process = None + self.websocket_server = None + self.websocket_rpc = None + self.exit_code = None + self._connected_client = None + + @property + def server_is_running(self): + if self.websocket_server is None: + return False + return self.websocket_server.server_is_running + + def _windows_file_process(self, src_dst_mapping, to_remove): + """Windows specific file processing asking for admin permissions. + + It is required to have administration permissions to modify plugin + files in TVPaint installation folder. + + Method requires `pywin32` python module. + + Args: + src_dst_mapping (list, tuple, set): Mapping of source file to + destination. Both must be full path. Each item must be iterable + of size 2 `(C:/src/file.dll, C:/dst/file.dll)`. + to_remove (list): Fullpath to files that should be removed. + """ + + import pythoncom + from win32comext.shell import shell + + # Create temp folder where plugin files are temporary copied + # - reason is that copy to TVPaint requires administartion permissions + # but admin may not have access to source folder + tmp_dir = os.path.normpath( + tempfile.mkdtemp(prefix="tvpaint_copy_") + ) + + # Copy source to temp folder and create new mapping + dst_folders = collections.defaultdict(list) + new_src_dst_mapping = [] + for old_src, dst in src_dst_mapping: + new_src = os.path.join(tmp_dir, os.path.split(old_src)[1]) + shutil.copy(old_src, new_src) + new_src_dst_mapping.append((new_src, dst)) + + for src, dst in new_src_dst_mapping: + src = os.path.normpath(src) + dst = os.path.normpath(dst) + dst_filename = os.path.basename(dst) + dst_folder_path = os.path.dirname(dst) + dst_folders[dst_folder_path].append((dst_filename, src)) + + # create an instance of IFileOperation + fo = pythoncom.CoCreateInstance( + shell.CLSID_FileOperation, + None, + pythoncom.CLSCTX_ALL, + shell.IID_IFileOperation + ) + # Add delete command to file operation object + for filepath in to_remove: + item = shell.SHCreateItemFromParsingName( + filepath, None, shell.IID_IShellItem + ) + fo.DeleteItem(item) + + # here you can use SetOperationFlags, progress Sinks, etc. + for folder_path, items in dst_folders.items(): + # create an instance of IShellItem for the target folder + folder_item = shell.SHCreateItemFromParsingName( + folder_path, None, shell.IID_IShellItem + ) + for _dst_filename, source_file_path in items: + # create an instance of IShellItem for the source item + copy_item = shell.SHCreateItemFromParsingName( + source_file_path, None, shell.IID_IShellItem + ) + # queue the copy operation + fo.CopyItem(copy_item, folder_item, _dst_filename, None) + + # commit + fo.PerformOperations() + + # Remove temp folder + shutil.rmtree(tmp_dir) + + def _prepare_windows_plugin(self, launch_args): + """Copy plugin to TVPaint plugins and set PATH to dependencies. + + Check if plugin in TVPaint's plugins exist and match to plugin + version to current implementation version. Based on 64-bit or 32-bit + version of the plugin. Path to libraries required for plugin is added + to PATH variable. + """ + + host_executable = launch_args[0] + executable_file = os.path.basename(host_executable) + if "64bit" in executable_file: + subfolder = "windows_x64" + elif "32bit" in executable_file: + subfolder = "windows_x86" + else: + raise ValueError( + "Can't determine if executable " + "leads to 32-bit or 64-bit TVPaint!" + ) + + plugin_files_path = get_plugin_files_path() + # Folder for right windows plugin files + source_plugins_dir = os.path.join(plugin_files_path, subfolder) + + # Path to libraies (.dll) required for plugin library + # - additional libraries can be copied to TVPaint installation folder + # (next to executable) or added to PATH environment variable + additional_libs_folder = os.path.join( + source_plugins_dir, + "additional_libraries" + ) + additional_libs_folder = additional_libs_folder.replace("\\", "/") + if additional_libs_folder not in os.environ["PATH"]: + os.environ["PATH"] += (os.pathsep + additional_libs_folder) + + # Path to TVPaint's plugins folder (where we want to add our plugin) + host_plugins_path = os.path.join( + os.path.dirname(host_executable), + "plugins" + ) + + # Files that must be copied to TVPaint's plugin folder + plugin_dir = os.path.join(source_plugins_dir, "plugin") + + to_copy = [] + to_remove = [] + # Remove old plugin name + deprecated_filepath = os.path.join( + host_plugins_path, "AvalonPlugin.dll" + ) + if os.path.exists(deprecated_filepath): + to_remove.append(deprecated_filepath) + + for filename in os.listdir(plugin_dir): + src_full_path = os.path.join(plugin_dir, filename) + dst_full_path = os.path.join(host_plugins_path, filename) + if dst_full_path in to_remove: + to_remove.remove(dst_full_path) + + if ( + not os.path.exists(dst_full_path) + or not filecmp.cmp(src_full_path, dst_full_path) + ): + to_copy.append((src_full_path, dst_full_path)) + + # Skip copy if everything is done + if not to_copy and not to_remove: + return + + # Try to copy + try: + self._windows_file_process(to_copy, to_remove) + except Exception: + log.error("Plugin copy failed", exc_info=True) + + # Validate copy was done + invalid_copy = [] + for src, dst in to_copy: + if not os.path.exists(dst) or not filecmp.cmp(src, dst): + invalid_copy.append((src, dst)) + + # Validate delete was dones + invalid_remove = [] + for filepath in to_remove: + if os.path.exists(filepath): + invalid_remove.append(filepath) + + if not invalid_remove and not invalid_copy: + return + + msg_parts = [] + if invalid_remove: + msg_parts.append( + "Failed to remove files: {}".format(", ".join(invalid_remove)) + ) + + if invalid_copy: + _invalid = [ + "\"{}\" -> \"{}\"".format(src, dst) + for src, dst in invalid_copy + ] + msg_parts.append( + "Failed to copy files: {}".format(", ".join(_invalid)) + ) + raise RuntimeError(" & ".join(msg_parts)) + + def _launch_tv_paint(self, launch_args): + flags = ( + subprocess.DETACHED_PROCESS + | subprocess.CREATE_NEW_PROCESS_GROUP + ) + env = os.environ.copy() + # Remove QuickTime from PATH on windows + # - quicktime overrides TVPaint's ffmpeg encode/decode which may + # cause issues on loading + if platform.system().lower() == "windows": + new_path = [] + for path in env["PATH"].split(os.pathsep): + if path and "quicktime" not in path.lower(): + new_path.append(path) + env["PATH"] = os.pathsep.join(new_path) + + kwargs = { + "env": env, + "creationflags": flags + } + self.process = subprocess.Popen(launch_args, **kwargs) + + def _create_routes(self): + self.websocket_rpc = BaseTVPaintRpc( + self, loop=self.websocket_server.loop + ) + self.websocket_server.add_route( + "*", "/", self.websocket_rpc.handle_request + ) + + def _start_webserver(self): + self.websocket_server.start() + # Make sure RPC is using same loop as websocket server + while not self.websocket_server.server_is_running: + time.sleep(0.1) + + def _stop_webserver(self): + self.websocket_server.stop() + + def _exit(self, exit_code=None): + self._stop_webserver() + if exit_code is not None: + self.exit_code = exit_code + + def stop(self): + """Stop communication and currently running python process.""" + log.info("Stopping communication") + self._exit() + + def launch(self, launch_args): + """Prepare all required data and launch host. + + First is prepared websocket server as communication point for host, + when server is ready to use host is launched as subprocess. + """ + if platform.system().lower() == "windows": + self._prepare_windows_plugin(launch_args) + + # Launch TVPaint and the websocket server. + log.info("Launching TVPaint") + self.websocket_server = WebSocketServer() + + self._create_routes() + + os.environ["WEBSOCKET_URL"] = "ws://localhost:{}".format( + self.websocket_server.port + ) + + log.info("Added request handler for url: {}".format( + os.environ["WEBSOCKET_URL"] + )) + + self._start_webserver() + + # Start TVPaint when server is running + self._launch_tv_paint(launch_args) + + log.info("Waiting for client connection") + while True: + if self.process.poll() is not None: + log.debug("Host process is not alive. Exiting") + self._exit(1) + return + + if self.websocket_rpc.client_connected(): + log.info("Client has connected") + break + time.sleep(0.5) + + self._on_client_connect() + + api.emit("application.launched") + + def _on_client_connect(self): + self._initial_textfile_write() + + def _initial_textfile_write(self): + """Show popup about Write to file at start of TVPaint.""" + tmp_file = tempfile.NamedTemporaryFile( + mode="w", prefix="a_tvp_", suffix=".txt", delete=False + ) + tmp_file.close() + tmp_filepath = tmp_file.name.replace("\\", "/") + george_script = ( + "tv_writetextfile \"strict\" \"append\" \"{}\" \"empty\"" + ).format(tmp_filepath) + + result = CommunicationWrapper.execute_george(george_script) + + # Remote the file + os.remove(tmp_filepath) + + if result is None: + log.warning( + "Host was probably closed before plugin was initialized." + ) + elif result.lower() == "forbidden": + log.warning("User didn't confirm saving files.") + + def _client(self): + if not self.websocket_rpc: + log.warning("Communicator's server did not start yet.") + return None + + for client in self.websocket_rpc.clients: + if not client.ws.closed: + return client + log.warning("Client is not yet connected to Communicator.") + return None + + def client(self): + if not self._connected_client or self._connected_client.ws.closed: + self._connected_client = self._client() + return self._connected_client + + def send_request(self, method, params=None): + client = self.client() + if not client: + return + + return self.websocket_rpc.send_request( + client, method, params + ) + + def send_notification(self, method, params=None): + client = self.client() + if not client: + return + + self.websocket_rpc.send_notification( + client, method, params + ) + + def execute_george(self, george_script): + """Execute passed goerge script in TVPaint.""" + return self.send_request( + "execute_george", [george_script] + ) + + def execute_george_through_file(self, george_script): + """Execute george script with temp file. + + Allows to execute multiline george script without stopping websocket + client. + + On windows make sure script does not contain paths with backwards + slashes in paths, TVPaint won't execute properly in that case. + + Args: + george_script (str): George script to execute. May be multilined. + """ + temporary_file = tempfile.NamedTemporaryFile( + mode="w", prefix="a_tvp_", suffix=".grg", delete=False + ) + temporary_file.write(george_script) + temporary_file.close() + temp_file_path = temporary_file.name.replace("\\", "/") + self.execute_george("tv_runscript {}".format(temp_file_path)) + os.remove(temp_file_path) + + +class QtCommunicator(BaseCommunicator): + menu_definitions = { + "title": "OpenPype Tools", + "menu_items": [ + { + "callback": "workfiles_tool", + "label": "Workfiles", + "help": "Open workfiles tool" + }, { + "callback": "loader_tool", + "label": "Load", + "help": "Open loader tool" + }, { + "callback": "creator_tool", + "label": "Create", + "help": "Open creator tool" + }, { + "callback": "scene_inventory_tool", + "label": "Scene inventory", + "help": "Open scene inventory tool" + }, { + "callback": "publish_tool", + "label": "Publish", + "help": "Open publisher" + }, { + "callback": "library_loader_tool", + "label": "Library", + "help": "Open library loader tool" + }, { + "callback": "subset_manager_tool", + "label": "Subset Manager", + "help": "Open subset manager tool" + }, { + "callback": "experimental_tools", + "label": "Experimental tools", + "help": "Open experimental tools dialog" + } + ] + } + + def __init__(self, qt_app): + super().__init__() + self.callback_queue = Queue() + self.qt_app = qt_app + + def _create_routes(self): + self.websocket_rpc = QtTVPaintRpc( + self, loop=self.websocket_server.loop + ) + self.websocket_server.add_route( + "*", "/", self.websocket_rpc.handle_request + ) + + def execute_in_main_thread(self, main_thread_item, wait=True): + """Add `MainThreadItem` to callback queue and wait for result.""" + self.callback_queue.put(main_thread_item) + if wait: + return main_thread_item.wait() + return + + async def async_execute_in_main_thread(self, main_thread_item, wait=True): + """Add `MainThreadItem` to callback queue and wait for result.""" + self.callback_queue.put(main_thread_item) + if wait: + return await main_thread_item.async_wait() + + def main_thread_listen(self): + """Get last `MainThreadItem` from queue. + + Must be called from main thread. + + Method checks if host process is still running as it may cause + issues if not. + """ + # check if host still running + if self.process.poll() is not None: + self._exit() + return None + + if self.callback_queue.empty(): + return None + return self.callback_queue.get() + + def _on_client_connect(self): + super()._on_client_connect() + self._build_menu() + + def _build_menu(self): + self.send_request( + "define_menu", [self.menu_definitions] + ) + + def _exit(self, *args, **kwargs): + super()._exit(*args, **kwargs) + api.emit("application.exit") + self.qt_app.exit(self.exit_code) From e36f0fe11ec240e033224c3c23605236e38c0fe0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 26 Nov 2021 15:50:26 +0100 Subject: [PATCH 019/341] copied and modified launch script --- openpype/hosts/tvpaint/api/launch_script.py | 84 +++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 openpype/hosts/tvpaint/api/launch_script.py diff --git a/openpype/hosts/tvpaint/api/launch_script.py b/openpype/hosts/tvpaint/api/launch_script.py new file mode 100644 index 0000000000..ec34442d28 --- /dev/null +++ b/openpype/hosts/tvpaint/api/launch_script.py @@ -0,0 +1,84 @@ +import os +import sys +import signal +import traceback +import ctypes +import platform +import logging + +from Qt import QtWidgets, QtCore, QtGui + +from avalon import api +from openpype import style +from openpype.hosts.tvpaint.api.communication_server import ( + CommunicationWrapper +) +from openpype.hosts.tvpaint import api as tvpaint_host + +log = logging.getLogger(__name__) + + +def safe_excepthook(*args): + traceback.print_exception(*args) + + +def main(launch_args): + # Be sure server won't crash at any moment but just print traceback + sys.excepthook = safe_excepthook + + # Create QtApplication for tools + # - QApplicaiton is also main thread/event loop of the server + qt_app = QtWidgets.QApplication([]) + + # Execute pipeline installation + api.install(tvpaint_host) + + # Create Communicator object and trigger launch + # - this must be done before anything is processed + communicator = CommunicationWrapper.create_communicator(qt_app) + communicator.launch(launch_args) + + def process_in_main_thread(): + """Execution of `MainThreadItem`.""" + item = communicator.main_thread_listen() + if item: + item.execute() + + timer = QtCore.QTimer() + timer.setInterval(100) + timer.timeout.connect(process_in_main_thread) + timer.start() + + # Register terminal signal handler + def signal_handler(*_args): + print("You pressed Ctrl+C. Process ended.") + communicator.stop() + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + + qt_app.setQuitOnLastWindowClosed(False) + qt_app.setStyleSheet(style.load_stylesheet()) + + # Load avalon icon + icon_path = style.app_icon_path() + if icon_path: + icon = QtGui.QIcon(icon_path) + qt_app.setWindowIcon(icon) + + # Set application name to be able show application icon in task bar + if platform.system().lower() == "windows": + ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID( + u"WebsocketServer" + ) + + # Run Qt application event processing + sys.exit(qt_app.exec_()) + + +if __name__ == "__main__": + args = list(sys.argv) + if os.path.abspath(__file__) == os.path.normpath(args[0]): + # Pop path to script + args.pop(0) + main(args) From 21d57f9e74f9244206c8314d99ab82014a185cb2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 26 Nov 2021 15:50:57 +0100 Subject: [PATCH 020/341] copied pipeline.py and added code which was in openpype init --- openpype/hosts/tvpaint/api/pipeline.py | 488 +++++++++++++++++++++++++ 1 file changed, 488 insertions(+) create mode 100644 openpype/hosts/tvpaint/api/pipeline.py diff --git a/openpype/hosts/tvpaint/api/pipeline.py b/openpype/hosts/tvpaint/api/pipeline.py new file mode 100644 index 0000000000..235d5525f4 --- /dev/null +++ b/openpype/hosts/tvpaint/api/pipeline.py @@ -0,0 +1,488 @@ +import os +import json +import contextlib +import tempfile +import logging + +import requests + +import pyblish.api +import avalon.api + +from avalon import io +from avalon.pipeline import AVALON_CONTAINER_ID + +from openpype.hosts import tvpaint +from openpype.api import get_current_project_settings + +from .communication_server import CommunicationWrapper + +log = logging.getLogger(__name__) + +HOST_DIR = os.path.dirname(os.path.abspath(tvpaint.__file__)) +PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "create") + +METADATA_SECTION = "avalon" +SECTION_NAME_CONTEXT = "context" +SECTION_NAME_INSTANCES = "instances" +SECTION_NAME_CONTAINERS = "containers" +# Maximum length of metadata chunk string +# TODO find out the max (500 is safe enough) +TVPAINT_CHUNK_LENGTH = 500 + +"""TVPaint's Metadata + +Metadata are stored to TVPaint's workfile. + +Workfile works similar to .ini file but has few limitation. Most important +limitation is that value under key has limited length. Due to this limitation +each metadata section/key stores number of "subkeys" that are related to +the section. + +Example: +Metadata key `"instances"` may have stored value "2". In that case it is +expected that there are also keys `["instances0", "instances1"]`. + +Workfile data looks like: +``` +[avalon] +instances0=[{{__dq__}id{__dq__}: {__dq__}pyblish.avalon.instance{__dq__... +instances1=...more data... +instances=2 +``` +""" + + +def install(): + """Install Maya-specific functionality of avalon-core. + + This function is called automatically on calling `api.install(maya)`. + + """ + log.info("OpenPype - Installing TVPaint integration") + io.install() + + # Create workdir folder if does not exist yet + workdir = io.Session["AVALON_WORKDIR"] + if not os.path.exists(workdir): + os.makedirs(workdir) + + pyblish.api.register_host("tvpaint") + pyblish.api.register_plugin_path(PUBLISH_PATH) + avalon.api.register_plugin_path(avalon.api.Loader, LOAD_PATH) + avalon.api.register_plugin_path(avalon.api.Creator, CREATE_PATH) + + registered_callbacks = ( + pyblish.api.registered_callbacks().get("instanceToggled") or [] + ) + if on_instance_toggle not in registered_callbacks: + pyblish.api.register_callback("instanceToggled", on_instance_toggle) + + avalon.api.on("application.launched", initial_launch) + avalon.api.on("application.exit", application_exit) + + +def uninstall(): + """Uninstall TVPaint-specific functionality of avalon-core. + + This function is called automatically on calling `api.uninstall()`. + + """ + log.info("OpenPype - Uninstalling TVPaint integration") + pyblish.api.deregister_host("tvpaint") + pyblish.api.deregister_plugin_path(PUBLISH_PATH) + avalon.api.deregister_plugin_path(avalon.api.Loader, LOAD_PATH) + avalon.api.deregister_plugin_path(avalon.api.Creator, CREATE_PATH) + + +def containerise( + name, namespace, members, context, loader, current_containers=None +): + """Add new container to metadata. + + Args: + name (str): Container name. + namespace (str): Container namespace. + members (list): List of members that were loaded and belongs + to the container (layer names). + current_containers (list): Preloaded containers. Should be used only + on update/switch when containers were modified durring the process. + + Returns: + dict: Container data stored to workfile metadata. + """ + + container_data = { + "schema": "openpype:container-2.0", + "id": AVALON_CONTAINER_ID, + "members": members, + "name": name, + "namespace": namespace, + "loader": str(loader), + "representation": str(context["representation"]["_id"]) + } + if current_containers is None: + current_containers = ls() + + # Add container to containers list + current_containers.append(container_data) + + # Store data to metadata + write_workfile_metadata(SECTION_NAME_CONTAINERS, current_containers) + + return container_data + + +@contextlib.contextmanager +def maintained_selection(): + # TODO implement logic + try: + yield + finally: + pass + + +def split_metadata_string(text, chunk_length=None): + """Split string by length. + + Split text to chunks by entered length. + Example: + ```python + text = "ABCDEFGHIJKLM" + result = split_metadata_string(text, 3) + print(result) + >>> ['ABC', 'DEF', 'GHI', 'JKL'] + ``` + + Args: + text (str): Text that will be split into chunks. + chunk_length (int): Single chunk size. Default chunk_length is + set to global variable `TVPAINT_CHUNK_LENGTH`. + + Returns: + list: List of strings wil at least one item. + """ + if chunk_length is None: + chunk_length = TVPAINT_CHUNK_LENGTH + chunks = [] + for idx in range(chunk_length, len(text) + chunk_length, chunk_length): + start_idx = idx - chunk_length + chunks.append(text[start_idx:idx]) + return chunks + + +def get_workfile_metadata_string_for_keys(metadata_keys): + """Read metadata for specific keys from current project workfile. + + All values from entered keys are stored to single string without separator. + + Function is designed to help get all values for one metadata key at once. + So order of passed keys matteres. + + Args: + metadata_keys (list, str): Metadata keys for which data should be + retrieved. Order of keys matters! It is possible to enter only + single key as string. + """ + # Add ability to pass only single key + if isinstance(metadata_keys, str): + metadata_keys = [metadata_keys] + + output_file = tempfile.NamedTemporaryFile( + mode="w", prefix="a_tvp_", suffix=".txt", delete=False + ) + output_file.close() + output_filepath = output_file.name.replace("\\", "/") + + george_script_parts = [] + george_script_parts.append( + "output_path = \"{}\"".format(output_filepath) + ) + # Store data for each index of metadata key + for metadata_key in metadata_keys: + george_script_parts.append( + "tv_readprojectstring \"{}\" \"{}\" \"\"".format( + METADATA_SECTION, metadata_key + ) + ) + george_script_parts.append( + "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' result" + ) + + # Execute the script + george_script = "\n".join(george_script_parts) + CommunicationWrapper.execute_george_through_file(george_script) + + # Load data from temp file + with open(output_filepath, "r") as stream: + file_content = stream.read() + + # Remove `\n` from content + output_string = file_content.replace("\n", "") + + # Delete temp file + os.remove(output_filepath) + + return output_string + + +def get_workfile_metadata_string(metadata_key): + """Read metadata for specific key from current project workfile.""" + result = get_workfile_metadata_string_for_keys([metadata_key]) + if not result: + return None + + stripped_result = result.strip() + if not stripped_result: + return None + + # NOTE Backwards compatibility when metadata key did not store range of key + # indexes but the value itself + # NOTE We don't have to care about negative values with `isdecimal` check + if not stripped_result.isdecimal(): + metadata_string = result + else: + keys = [] + for idx in range(int(stripped_result)): + keys.append("{}{}".format(metadata_key, idx)) + metadata_string = get_workfile_metadata_string_for_keys(keys) + + # Replace quotes plaholders with their values + metadata_string = ( + metadata_string + .replace("{__sq__}", "'") + .replace("{__dq__}", "\"") + ) + return metadata_string + + +def get_workfile_metadata(metadata_key, default=None): + """Read and parse metadata for specific key from current project workfile. + + Pipeline use function to store loaded and created instances within keys + stored in `SECTION_NAME_INSTANCES` and `SECTION_NAME_CONTAINERS` + constants. + + Args: + metadata_key (str): Key defying which key should read. It is expected + value contain json serializable string. + """ + if default is None: + default = [] + + json_string = get_workfile_metadata_string(metadata_key) + if json_string: + try: + return json.loads(json_string) + except json.decoder.JSONDecodeError: + # TODO remove when backwards compatibility of storing metadata + # will be removed + print(( + "Fixed invalid metadata in workfile." + " Not serializable string was: {}" + ).format(json_string)) + write_workfile_metadata(metadata_key, default) + return default + + +def write_workfile_metadata(metadata_key, value): + """Write metadata for specific key into current project workfile. + + George script has specific way how to work with quotes which should be + solved automatically with this function. + + Args: + metadata_key (str): Key defying under which key value will be stored. + value (dict,list,str): Data to store they must be json serializable. + """ + if isinstance(value, (dict, list)): + value = json.dumps(value) + + if not value: + value = "" + + # Handle quotes in dumped json string + # - replace single and double quotes with placeholders + value = ( + value + .replace("'", "{__sq__}") + .replace("\"", "{__dq__}") + ) + chunks = split_metadata_string(value) + chunks_len = len(chunks) + + write_template = "tv_writeprojectstring \"{}\" \"{}\" \"{}\"" + george_script_parts = [] + # Add information about chunks length to metadata key itself + george_script_parts.append( + write_template.format(METADATA_SECTION, metadata_key, chunks_len) + ) + # Add chunk values to indexed metadata keys + for idx, chunk_value in enumerate(chunks): + sub_key = "{}{}".format(metadata_key, idx) + george_script_parts.append( + write_template.format(METADATA_SECTION, sub_key, chunk_value) + ) + + george_script = "\n".join(george_script_parts) + + return CommunicationWrapper.execute_george_through_file(george_script) + + +def get_current_workfile_context(): + """Return context in which was workfile saved.""" + return get_workfile_metadata(SECTION_NAME_CONTEXT, {}) + + +def save_current_workfile_context(context): + """Save context which was used to create a workfile.""" + return write_workfile_metadata(SECTION_NAME_CONTEXT, context) + + +def remove_instance(instance): + """Remove instance from current workfile metadata.""" + current_instances = get_workfile_metadata(SECTION_NAME_INSTANCES) + instance_id = instance.get("uuid") + found_idx = None + if instance_id: + for idx, _inst in enumerate(current_instances): + if _inst["uuid"] == instance_id: + found_idx = idx + break + + if found_idx is None: + return + current_instances.pop(found_idx) + write_instances(current_instances) + + +def list_instances(): + """List all created instances from current workfile.""" + return get_workfile_metadata(SECTION_NAME_INSTANCES) + + +def write_instances(data): + return write_workfile_metadata(SECTION_NAME_INSTANCES, data) + + +# Backwards compatibility +def _write_instances(*args, **kwargs): + return write_instances(*args, **kwargs) + + +def ls(): + return get_workfile_metadata(SECTION_NAME_CONTAINERS) + + +def on_instance_toggle(instance, old_value, new_value): + """Update instance data in workfile on publish toggle.""" + # Review may not have real instance in wokrfile metadata + if not instance.data.get("uuid"): + return + + instance_id = instance.data["uuid"] + found_idx = None + current_instances = list_instances() + for idx, workfile_instance in enumerate(current_instances): + if workfile_instance["uuid"] == instance_id: + found_idx = idx + break + + if found_idx is None: + return + + if "active" in current_instances[found_idx]: + current_instances[found_idx]["active"] = new_value + write_instances(current_instances) + + +def initial_launch(): + # Setup project settings if its the template that's launched. + # TODO also check for template creation when it's possible to define + # templates + last_workfile = os.environ.get("AVALON_LAST_WORKFILE") + if not last_workfile or os.path.exists(last_workfile): + return + + log.info("Setting up project...") + set_context_settings() + + +def application_exit(): + data = get_current_project_settings() + stop_timer = data["tvpaint"]["stop_timer_on_application_exit"] + + if not stop_timer: + return + + # Stop application timer. + webserver_url = os.environ.get("OPENPYPE_WEBSERVER_URL") + rest_api_url = "{}/timers_manager/stop_timer".format(webserver_url) + requests.post(rest_api_url) + + +def set_context_settings(asset_doc=None): + """Set workfile settings by asset document data. + + Change fps, resolution and frame start/end. + """ + if asset_doc is None: + # Use current session asset if not passed + asset_doc = avalon.io.find_one({ + "type": "asset", + "name": avalon.io.Session["AVALON_ASSET"] + }) + + project_doc = avalon.io.find_one({"type": "project"}) + + framerate = asset_doc["data"].get("fps") + if framerate is None: + framerate = project_doc["data"].get("fps") + + if framerate is not None: + CommunicationWrapper.execute_george( + "tv_framerate {} \"timestretch\"".format(framerate) + ) + else: + print("Framerate was not found!") + + width_key = "resolutionWidth" + height_key = "resolutionHeight" + + width = asset_doc["data"].get(width_key) + height = asset_doc["data"].get(height_key) + if width is None or height is None: + width = project_doc["data"].get(width_key) + height = project_doc["data"].get(height_key) + + if width is None or height is None: + print("Resolution was not found!") + else: + CommunicationWrapper.execute_george( + "tv_resizepage {} {} 0".format(width, height) + ) + + frame_start = asset_doc["data"].get("frameStart") + frame_end = asset_doc["data"].get("frameEnd") + + if frame_start is None or frame_end is None: + print("Frame range was not found!") + return + + handles = asset_doc["data"].get("handles") or 0 + handle_start = asset_doc["data"].get("handleStart") + handle_end = asset_doc["data"].get("handleEnd") + + if handle_start is None or handle_end is None: + handle_start = handles + handle_end = handles + + # Always start from 0 Mark In and set only Mark Out + mark_in = 0 + mark_out = mark_in + (frame_end - frame_start) + handle_start + handle_end + + CommunicationWrapper.execute_george("tv_markin {} set".format(mark_in)) + CommunicationWrapper.execute_george("tv_markout {} set".format(mark_out)) From 7f34b6ee432315c7d8032b344cd33a174904d1ff Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 26 Nov 2021 15:52:05 +0100 Subject: [PATCH 021/341] copied workio --- openpype/hosts/tvpaint/api/workio.py | 55 ++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 openpype/hosts/tvpaint/api/workio.py diff --git a/openpype/hosts/tvpaint/api/workio.py b/openpype/hosts/tvpaint/api/workio.py new file mode 100644 index 0000000000..c513bec6cf --- /dev/null +++ b/openpype/hosts/tvpaint/api/workio.py @@ -0,0 +1,55 @@ +"""Host API required for Work Files. +# TODO @iLLiCiT implement functions: + has_unsaved_changes +""" + +from avalon import api +from .lib import ( + execute_george, + execute_george_through_file +) +from .pipeline import save_current_workfile_context + + +def open_file(filepath): + """Open the scene file in Blender.""" + george_script = "tv_LoadProject '\"'\"{}\"'\"'".format( + filepath.replace("\\", "/") + ) + return execute_george_through_file(george_script) + + +def save_file(filepath): + """Save the open scene file.""" + # Store context to workfile before save + context = { + "project": api.Session["AVALON_PROJECT"], + "asset": api.Session["AVALON_ASSET"], + "task": api.Session["AVALON_TASK"] + } + save_current_workfile_context(context) + + # Execute george script to save workfile. + george_script = "tv_SaveProject {}".format(filepath.replace("\\", "/")) + return execute_george(george_script) + + +def current_file(): + """Return the path of the open scene file.""" + george_script = "tv_GetProjectName" + return execute_george(george_script) + + +def has_unsaved_changes(): + """Does the open scene file have unsaved changes?""" + return False + + +def file_extensions(): + """Return the supported file extensions for Blender scene files.""" + return api.HOST_WORKFILE_EXTENSIONS["tvpaint"] + + +def work_root(session): + """Return the default root to browse for work files.""" + return session["AVALON_WORKDIR"] From b745f86cf32bb6e70717d7423270731d359fc431 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 26 Nov 2021 16:03:02 +0100 Subject: [PATCH 022/341] copied lib functions --- openpype/hosts/tvpaint/api/lib.py | 566 +++++++++++++++++++++++++++--- 1 file changed, 519 insertions(+), 47 deletions(-) diff --git a/openpype/hosts/tvpaint/api/lib.py b/openpype/hosts/tvpaint/api/lib.py index 8e63c9e5b2..e41bbb5aad 100644 --- a/openpype/hosts/tvpaint/api/lib.py +++ b/openpype/hosts/tvpaint/api/lib.py @@ -1,66 +1,538 @@ -from PIL import Image +import os +import logging +import tempfile import avalon.io -from avalon.tvpaint.lib import execute_george + +from . import CommunicationWrapper +from .pipeline import ( + list_instances, + write_instances +) + +log = logging.getLogger(__name__) -def set_context_settings(asset_doc=None): - """Set workfile settings by asset document data. +def execute_george(george_script, communicator=None): + if not communicator: + communicator = CommunicationWrapper.communicator + return communicator.execute_george(george_script) - Change fps, resolution and frame start/end. + +def execute_george_through_file(george_script, communicator=None): + """Execute george script with temp file. + + Allows to execute multiline george script without stopping websocket + client. + + On windows make sure script does not contain paths with backwards + slashes in paths, TVPaint won't execute properly in that case. + + Args: + george_script (str): George script to execute. May be multilined. """ - if asset_doc is None: - # Use current session asset if not passed - asset_doc = avalon.io.find_one({ - "type": "asset", - "name": avalon.io.Session["AVALON_ASSET"] - }) + if not communicator: + communicator = CommunicationWrapper.communicator - project_doc = avalon.io.find_one({"type": "project"}) + return communicator.execute_george_through_file(george_script) - framerate = asset_doc["data"].get("fps") - if framerate is None: - framerate = project_doc["data"].get("fps") - if framerate is not None: - execute_george( - "tv_framerate {} \"timestretch\"".format(framerate) - ) +def parse_layers_data(data): + """Parse layers data loaded in 'get_layers_data'.""" + layers = [] + layers_raw = data.split("\n") + for layer_raw in layers_raw: + layer_raw = layer_raw.strip() + if not layer_raw: + continue + ( + layer_id, group_id, visible, position, opacity, name, + layer_type, + frame_start, frame_end, prelighttable, postlighttable, + selected, editable, sencil_state + ) = layer_raw.split("|") + layer = { + "layer_id": int(layer_id), + "group_id": int(group_id), + "visible": visible == "ON", + "position": int(position), + "opacity": int(opacity), + "name": name, + "type": layer_type, + "frame_start": int(frame_start), + "frame_end": int(frame_end), + "prelighttable": prelighttable == "1", + "postlighttable": postlighttable == "1", + "selected": selected == "1", + "editable": editable == "1", + "sencil_state": sencil_state + } + layers.append(layer) + return layers + + +def get_layers_data_george_script(output_filepath, layer_ids=None): + """Prepare george script which will collect all layers from workfile.""" + output_filepath = output_filepath.replace("\\", "/") + george_script_lines = [ + # Variable containing full path to output file + "output_path = \"{}\"".format(output_filepath), + # Get Current Layer ID + "tv_LayerCurrentID", + "current_layer_id = result" + ] + # Script part for getting and storing layer information to temp + layer_data_getter = ( + # Get information about layer's group + "tv_layercolor \"get\" layer_id", + "group_id = result", + "tv_LayerInfo layer_id", + ( + "PARSE result visible position opacity name" + " type startFrame endFrame prelighttable postlighttable" + " selected editable sencilState" + ), + # Check if layer ID match `tv_LayerCurrentID` + "IF CMP(current_layer_id, layer_id)==1", + # - mark layer as selected if layer id match to current layer id + "selected=1", + "END", + # Prepare line with data separated by "|" + ( + "line = layer_id'|'group_id'|'visible'|'position'|'opacity'|'" + "name'|'type'|'startFrame'|'endFrame'|'prelighttable'|'" + "postlighttable'|'selected'|'editable'|'sencilState" + ), + # Write data to output file + "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' line", + ) + + # Collect data for all layers if layers are not specified + if layer_ids is None: + george_script_lines.extend(( + # Layer loop variables + "loop = 1", + "idx = 0", + # Layers loop + "WHILE loop", + "tv_LayerGetID idx", + "layer_id = result", + "idx = idx + 1", + # Stop loop if layer_id is "NONE" + "IF CMP(layer_id, \"NONE\")==1", + "loop = 0", + "ELSE", + *layer_data_getter, + "END", + "END" + )) else: - print("Framerate was not found!") + for layer_id in layer_ids: + george_script_lines.append("layer_id = {}".format(layer_id)) + george_script_lines.extend(layer_data_getter) - width_key = "resolutionWidth" - height_key = "resolutionHeight" + return "\n".join(george_script_lines) - width = asset_doc["data"].get(width_key) - height = asset_doc["data"].get(height_key) - if width is None or height is None: - width = project_doc["data"].get(width_key) - height = project_doc["data"].get(height_key) - if width is None or height is None: - print("Resolution was not found!") - else: - execute_george("tv_resizepage {} {} 0".format(width, height)) +def layers_data(layer_ids=None, communicator=None): + """Backwards compatible function of 'get_layers_data'.""" + return get_layers_data(layer_ids, communicator) - frame_start = asset_doc["data"].get("frameStart") - frame_end = asset_doc["data"].get("frameEnd") - if frame_start is None or frame_end is None: - print("Frame range was not found!") - return +def get_layers_data(layer_ids=None, communicator=None): + """Collect all layers information from currently opened workfile.""" + output_file = tempfile.NamedTemporaryFile( + mode="w", prefix="a_tvp_", suffix=".txt", delete=False + ) + output_file.close() + if layer_ids is not None and isinstance(layer_ids, int): + layer_ids = [layer_ids] - handles = asset_doc["data"].get("handles") or 0 - handle_start = asset_doc["data"].get("handleStart") - handle_end = asset_doc["data"].get("handleEnd") + output_filepath = output_file.name - if handle_start is None or handle_end is None: - handle_start = handles - handle_end = handles + george_script = get_layers_data_george_script(output_filepath, layer_ids) - # Always start from 0 Mark In and set only Mark Out - mark_in = 0 - mark_out = mark_in + (frame_end - frame_start) + handle_start + handle_end + execute_george_through_file(george_script, communicator) - execute_george("tv_markin {} set".format(mark_in)) - execute_george("tv_markout {} set".format(mark_out)) + with open(output_filepath, "r") as stream: + data = stream.read() + + output = parse_layers_data(data) + os.remove(output_filepath) + return output + + +def parse_group_data(data): + """Paser group data collected in 'get_groups_data'.""" + output = [] + groups_raw = data.split("\n") + for group_raw in groups_raw: + group_raw = group_raw.strip() + if not group_raw: + continue + + parts = group_raw.split(" ") + # Check for length and concatenate 2 last items until length match + # - this happens if name contain spaces + while len(parts) > 6: + last_item = parts.pop(-1) + parts[-1] = " ".join([parts[-1], last_item]) + clip_id, group_id, red, green, blue, name = parts + + group = { + "group_id": int(group_id), + "name": name, + "clip_id": int(clip_id), + "red": int(red), + "green": int(green), + "blue": int(blue), + } + output.append(group) + return output + + +def groups_data(communicator=None): + """Backwards compatible function of 'get_groups_data'.""" + return get_groups_data(communicator) + + +def get_groups_data(communicator=None): + """Information about groups from current workfile.""" + output_file = tempfile.NamedTemporaryFile( + mode="w", prefix="a_tvp_", suffix=".txt", delete=False + ) + output_file.close() + + output_filepath = output_file.name.replace("\\", "/") + george_script_lines = ( + # Variable containing full path to output file + "output_path = \"{}\"".format(output_filepath), + "loop = 1", + "FOR idx = 1 TO 12", + "tv_layercolor \"getcolor\" 0 idx", + "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' result", + "END" + ) + george_script = "\n".join(george_script_lines) + execute_george_through_file(george_script, communicator) + + with open(output_filepath, "r") as stream: + data = stream.read() + + output = parse_group_data(data) + os.remove(output_filepath) + return output + + +def get_layers_pre_post_behavior(layer_ids, communicator=None): + """Collect data about pre and post behavior of layer ids. + + Pre and Post behaviors is enumerator of possible values: + - "none" + - "repeat" / "loop" + - "pingpong" + - "hold" + + Example output: + ```json + { + 0: { + "pre": "none", + "post": "loop" + } + } + ``` + + Returns: + dict: Key is layer id value is dictionary with "pre" and "post" keys. + """ + # Skip if is empty + if not layer_ids: + return {} + + # Auto convert to list + if not isinstance(layer_ids, (list, set, tuple)): + layer_ids = [layer_ids] + + # Prepare temp file + output_file = tempfile.NamedTemporaryFile( + mode="w", prefix="a_tvp_", suffix=".txt", delete=False + ) + output_file.close() + + output_filepath = output_file.name.replace("\\", "/") + george_script_lines = [ + # Variable containing full path to output file + "output_path = \"{}\"".format(output_filepath), + ] + for layer_id in layer_ids: + george_script_lines.extend([ + "layer_id = {}".format(layer_id), + "tv_layerprebehavior layer_id", + "pre_beh = result", + "tv_layerpostbehavior layer_id", + "post_beh = result", + "line = layer_id'|'pre_beh'|'post_beh", + "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' line" + ]) + + george_script = "\n".join(george_script_lines) + execute_george_through_file(george_script, communicator) + + # Read data + with open(output_filepath, "r") as stream: + data = stream.read() + + # Remove temp file + os.remove(output_filepath) + + # Parse data + output = {} + raw_lines = data.split("\n") + for raw_line in raw_lines: + line = raw_line.strip() + if not line: + continue + parts = line.split("|") + if len(parts) != 3: + continue + layer_id, pre_beh, post_beh = parts + output[int(layer_id)] = { + "pre": pre_beh.lower(), + "post": post_beh.lower() + } + return output + + +def get_layers_exposure_frames(layer_ids, layers_data=None, communicator=None): + """Get exposure frames. + + Easily said returns frames where keyframes are. Recognized with george + function `tv_exposureinfo` returning "Head". + + Args: + layer_ids (list): Ids of a layers for which exposure frames should + look for. + layers_data (list): Precollected layers data. If are not passed then + 'get_layers_data' is used. + communicator (BaseCommunicator): Communicator used for communication + with TVPaint. + + Returns: + dict: Frames where exposure is set to "Head" by layer id. + """ + + if layers_data is None: + layers_data = get_layers_data(layer_ids) + _layers_by_id = { + layer["layer_id"]: layer + for layer in layers_data + } + layers_by_id = { + layer_id: _layers_by_id.get(layer_id) + for layer_id in layer_ids + } + tmp_file = tempfile.NamedTemporaryFile( + mode="w", prefix="a_tvp_", suffix=".txt", delete=False + ) + tmp_file.close() + tmp_output_path = tmp_file.name.replace("\\", "/") + george_script_lines = [ + "output_path = \"{}\"".format(tmp_output_path) + ] + + output = {} + layer_id_mapping = {} + for layer_id, layer_data in layers_by_id.items(): + layer_id_mapping[str(layer_id)] = layer_id + output[layer_id] = [] + if not layer_data: + continue + first_frame = layer_data["frame_start"] + last_frame = layer_data["frame_end"] + george_script_lines.extend([ + "line = \"\"", + "layer_id = {}".format(layer_id), + "line = line''layer_id", + "tv_layerset layer_id", + "frame = {}".format(first_frame), + "WHILE (frame <= {})".format(last_frame), + "tv_exposureinfo frame", + "exposure = result", + "IF (CMP(exposure, \"Head\") == 1)", + "line = line'|'frame", + "END", + "frame = frame + 1", + "END", + "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' line" + ]) + + execute_george_through_file("\n".join(george_script_lines), communicator) + + with open(tmp_output_path, "r") as stream: + data = stream.read() + + os.remove(tmp_output_path) + + lines = [] + for line in data.split("\n"): + line = line.strip() + if line: + lines.append(line) + + for line in lines: + line_items = list(line.split("|")) + layer_id = line_items.pop(0) + _layer_id = layer_id_mapping[layer_id] + output[_layer_id] = [int(frame) for frame in line_items] + + return output + + +def get_exposure_frames( + layer_id, first_frame=None, last_frame=None, communicator=None +): + """Get exposure frames. + + Easily said returns frames where keyframes are. Recognized with george + function `tv_exposureinfo` returning "Head". + + Args: + layer_id (int): Id of a layer for which exposure frames should + look for. + first_frame (int): From which frame will look for exposure frames. + Used layers first frame if not entered. + last_frame (int): Last frame where will look for exposure frames. + Used layers last frame if not entered. + + Returns: + list: Frames where exposure is set to "Head". + """ + if first_frame is None or last_frame is None: + layer = layers_data(layer_id)[0] + if first_frame is None: + first_frame = layer["frame_start"] + if last_frame is None: + last_frame = layer["frame_end"] + + tmp_file = tempfile.NamedTemporaryFile( + mode="w", prefix="a_tvp_", suffix=".txt", delete=False + ) + tmp_file.close() + tmp_output_path = tmp_file.name.replace("\\", "/") + george_script_lines = [ + "tv_layerset {}".format(layer_id), + "output_path = \"{}\"".format(tmp_output_path), + "output = \"\"", + "frame = {}".format(first_frame), + "WHILE (frame <= {})".format(last_frame), + "tv_exposureinfo frame", + "exposure = result", + "IF (CMP(exposure, \"Head\") == 1)", + "IF (CMP(output, \"\") == 1)", + "output = output''frame", + "ELSE", + "output = output'|'frame", + "END", + "END", + "frame = frame + 1", + "END", + "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' output" + ] + + execute_george_through_file("\n".join(george_script_lines), communicator) + + with open(tmp_output_path, "r") as stream: + data = stream.read() + + os.remove(tmp_output_path) + + lines = [] + for line in data.split("\n"): + line = line.strip() + if line: + lines.append(line) + + exposure_frames = [] + for line in lines: + for frame in line.split("|"): + exposure_frames.append(int(frame)) + return exposure_frames + + +def get_scene_data(communicator=None): + """Scene data of currently opened scene. + + Result contains resolution, pixel aspect, fps mark in/out with states, + frame start and background color. + + Returns: + dict: Scene data collected in many ways. + """ + workfile_info = execute_george("tv_projectinfo", communicator) + workfile_info_parts = workfile_info.split(" ") + + # Project frame start - not used + workfile_info_parts.pop(-1) + field_order = workfile_info_parts.pop(-1) + frame_rate = float(workfile_info_parts.pop(-1)) + pixel_apsect = float(workfile_info_parts.pop(-1)) + height = int(workfile_info_parts.pop(-1)) + width = int(workfile_info_parts.pop(-1)) + + # Marks return as "{frame - 1} {state} ", example "0 set". + result = execute_george("tv_markin", communicator) + mark_in_frame, mark_in_state, _ = result.split(" ") + + result = execute_george("tv_markout", communicator) + mark_out_frame, mark_out_state, _ = result.split(" ") + + start_frame = execute_george("tv_startframe", communicator) + return { + "width": width, + "height": height, + "pixel_aspect": pixel_apsect, + "fps": frame_rate, + "field_order": field_order, + "mark_in": int(mark_in_frame), + "mark_in_state": mark_in_state, + "mark_in_set": mark_in_state == "set", + "mark_out": int(mark_out_frame), + "mark_out_state": mark_out_state, + "mark_out_set": mark_out_state == "set", + "start_frame": int(start_frame), + "bg_color": get_scene_bg_color(communicator) + } + + +def get_scene_bg_color(communicator=None): + """Background color set on scene. + + Is important for review exporting where scene bg color is used as + background. + """ + output_file = tempfile.NamedTemporaryFile( + mode="w", prefix="a_tvp_", suffix=".txt", delete=False + ) + output_file.close() + output_filepath = output_file.name.replace("\\", "/") + george_script_lines = [ + # Variable containing full path to output file + "output_path = \"{}\"".format(output_filepath), + "tv_background", + "bg_color = result", + # Write data to output file + "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' bg_color" + ] + + george_script = "\n".join(george_script_lines) + execute_george_through_file(george_script, communicator) + + with open(output_filepath, "r") as stream: + data = stream.read() + + os.remove(output_filepath) + data = data.strip() + if not data: + return None + return data.split(" ") From c748d6d3402b57dbc04ffb1d12b08f7a1c8be491 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 26 Nov 2021 16:03:49 +0100 Subject: [PATCH 023/341] completed plugin.py with Creator and Loader from avalon's pipeline --- openpype/hosts/tvpaint/api/plugin.py | 109 ++++++++++++++++++++++++++- 1 file changed, 107 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/tvpaint/api/plugin.py b/openpype/hosts/tvpaint/api/plugin.py index e148e44a27..e65c25b8d1 100644 --- a/openpype/hosts/tvpaint/api/plugin.py +++ b/openpype/hosts/tvpaint/api/plugin.py @@ -1,8 +1,21 @@ +import re +import uuid + +import avalon.api + from openpype.api import PypeCreatorMixin -from avalon.tvpaint import pipeline +from openpype.hosts.tvpaint.api import ( + pipeline, + lib +) -class Creator(PypeCreatorMixin, pipeline.Creator): +class Creator(PypeCreatorMixin, avalon.api.Creator): + def __init__(self, *args, **kwargs): + super(Creator, self).__init__(*args, **kwargs) + # Add unified identifier created with `uuid` module + self.data["uuid"] = str(uuid.uuid4()) + @classmethod def get_dynamic_data(cls, *args, **kwargs): dynamic_data = super(Creator, cls).get_dynamic_data(*args, **kwargs) @@ -17,3 +30,95 @@ class Creator(PypeCreatorMixin, pipeline.Creator): if "task" not in dynamic_data and task_name: dynamic_data["task"] = task_name return dynamic_data + + @staticmethod + def are_instances_same(instance_1, instance_2): + """Compare instances but skip keys with unique values. + + During compare are skiped keys that will be 100% sure + different on new instance, like "id". + + Returns: + bool: True if instances are same. + """ + if ( + not isinstance(instance_1, dict) + or not isinstance(instance_2, dict) + ): + return instance_1 == instance_2 + + checked_keys = set() + checked_keys.add("id") + for key, value in instance_1.items(): + if key not in checked_keys: + if key not in instance_2: + return False + if value != instance_2[key]: + return False + checked_keys.add(key) + + for key in instance_2.keys(): + if key not in checked_keys: + return False + return True + + def write_instances(self, data): + self.log.debug( + "Storing instance data to workfile. {}".format(str(data)) + ) + return pipeline.write_instances(data) + + def process(self): + data = pipeline.list_instances() + data.append(self.data) + self.write_instances(data) + + +class Loader(avalon.api.Loader): + hosts = ["tvpaint"] + + @staticmethod + def get_members_from_container(container): + if "members" not in container and "objectName" in container: + # Backwards compatibility + layer_ids_str = container.get("objectName") + return [ + int(layer_id) for layer_id in layer_ids_str.split("|") + ] + return container["members"] + + def get_unique_layer_name(self, asset_name, name): + """Layer name with counter as suffix. + + Find higher 3 digit suffix from all layer names in scene matching regex + `{asset_name}_{name}_{suffix}`. Higher 3 digit suffix is used + as base for next number if scene does not contain layer matching regex + `0` is used ase base. + + Args: + asset_name (str): Name of subset's parent asset document. + name (str): Name of loaded subset. + + Returns: + (str): `{asset_name}_{name}_{higher suffix + 1}` + """ + layer_name_base = "{}_{}".format(asset_name, name) + + counter_regex = re.compile(r"_(\d{3})$") + + higher_counter = 0 + for layer in lib.get_layers_data(): + layer_name = layer["name"] + if not layer_name.startswith(layer_name_base): + continue + number_subpart = layer_name[len(layer_name_base):] + groups = counter_regex.findall(number_subpart) + if len(groups) != 1: + continue + + counter = int(groups[0]) + if counter > higher_counter: + higher_counter = counter + continue + + return "{}_{:0>3d}".format(layer_name_base, higher_counter + 1) From e419aaabce684e0503b68806cf1b018160f353cc Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 26 Nov 2021 16:03:58 +0100 Subject: [PATCH 024/341] modified init --- openpype/hosts/tvpaint/api/__init__.py | 130 ++++++++----------------- 1 file changed, 43 insertions(+), 87 deletions(-) diff --git a/openpype/hosts/tvpaint/api/__init__.py b/openpype/hosts/tvpaint/api/__init__.py index 1c50987d6d..c461b33f4b 100644 --- a/openpype/hosts/tvpaint/api/__init__.py +++ b/openpype/hosts/tvpaint/api/__init__.py @@ -1,93 +1,49 @@ -import os -import logging +from .communication_server import CommunicationWrapper +from . import lib +from . import launch_script +from . import workio +from . import pipeline +from . import plugin +from .pipeline import ( + install, + uninstall, + maintained_selection, + remove_instance, + list_instances, + ls +) -import requests - -import avalon.api -import pyblish.api -from avalon.tvpaint import pipeline -from avalon.tvpaint.communication_server import register_localization_file -from .lib import set_context_settings - -from openpype.hosts import tvpaint -from openpype.api import get_current_project_settings - -log = logging.getLogger(__name__) - -HOST_DIR = os.path.dirname(os.path.abspath(tvpaint.__file__)) -PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") -PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") -LOAD_PATH = os.path.join(PLUGINS_DIR, "load") -CREATE_PATH = os.path.join(PLUGINS_DIR, "create") +from .workio import ( + open_file, + save_file, + current_file, + has_unsaved_changes, + file_extensions, + work_root, +) -def on_instance_toggle(instance, old_value, new_value): - # Review may not have real instance in wokrfile metadata - if not instance.data.get("uuid"): - return +__all__ = ( + "CommunicationWrapper", - instance_id = instance.data["uuid"] - found_idx = None - current_instances = pipeline.list_instances() - for idx, workfile_instance in enumerate(current_instances): - if workfile_instance["uuid"] == instance_id: - found_idx = idx - break + "lib", + "launch_script", + "workio", + "pipeline", + "plugin", - if found_idx is None: - return + "install", + "uninstall", + "maintained_selection", + "remove_instance", + "list_instances", + "ls", - if "active" in current_instances[found_idx]: - current_instances[found_idx]["active"] = new_value - pipeline._write_instances(current_instances) - - -def initial_launch(): - # Setup project settings if its the template that's launched. - # TODO also check for template creation when it's possible to define - # templates - last_workfile = os.environ.get("AVALON_LAST_WORKFILE") - if not last_workfile or os.path.exists(last_workfile): - return - - log.info("Setting up project...") - set_context_settings() - - -def application_exit(): - data = get_current_project_settings() - stop_timer = data["tvpaint"]["stop_timer_on_application_exit"] - - if not stop_timer: - return - - # Stop application timer. - webserver_url = os.environ.get("OPENPYPE_WEBSERVER_URL") - rest_api_url = "{}/timers_manager/stop_timer".format(webserver_url) - requests.post(rest_api_url) - - -def install(): - log.info("OpenPype - Installing TVPaint integration") - localization_file = os.path.join(HOST_DIR, "resources", "avalon.loc") - register_localization_file(localization_file) - - pyblish.api.register_plugin_path(PUBLISH_PATH) - avalon.api.register_plugin_path(avalon.api.Loader, LOAD_PATH) - avalon.api.register_plugin_path(avalon.api.Creator, CREATE_PATH) - - registered_callbacks = ( - pyblish.api.registered_callbacks().get("instanceToggled") or [] - ) - if on_instance_toggle not in registered_callbacks: - pyblish.api.register_callback("instanceToggled", on_instance_toggle) - - avalon.api.on("application.launched", initial_launch) - avalon.api.on("application.exit", application_exit) - - -def uninstall(): - log.info("OpenPype - Uninstalling TVPaint integration") - pyblish.api.deregister_plugin_path(PUBLISH_PATH) - avalon.api.deregister_plugin_path(avalon.api.Loader, LOAD_PATH) - avalon.api.deregister_plugin_path(avalon.api.Creator, CREATE_PATH) + # Workfiles API + "open_file", + "save_file", + "current_file", + "has_unsaved_changes", + "file_extensions", + "work_root" +) From 0098ea546665733e8d9ca11ecc42729cdc76eae6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 26 Nov 2021 16:06:04 +0100 Subject: [PATCH 025/341] modified plugins --- .../tvpaint/plugins/create/create_render_layer.py | 15 ++++++++------- .../tvpaint/plugins/create/create_render_pass.py | 6 +++--- openpype/hosts/tvpaint/plugins/load/load_image.py | 4 ++-- .../tvpaint/plugins/load/load_reference_image.py | 4 ++-- openpype/hosts/tvpaint/plugins/load/load_sound.py | 4 ++-- .../hosts/tvpaint/plugins/load/load_workfile.py | 6 +++--- .../plugins/publish/collect_workfile_data.py | 2 +- .../plugins/publish/increment_workfile_version.py | 2 +- .../plugins/publish/validate_asset_name.py | 2 +- .../tvpaint/plugins/publish/validate_marks.py | 2 +- .../plugins/publish/validate_start_frame.py | 2 +- .../plugins/publish/validate_workfile_metadata.py | 2 +- 12 files changed, 26 insertions(+), 25 deletions(-) diff --git a/openpype/hosts/tvpaint/plugins/create/create_render_layer.py b/openpype/hosts/tvpaint/plugins/create/create_render_layer.py index af6c0f0eee..c43c136f3e 100644 --- a/openpype/hosts/tvpaint/plugins/create/create_render_layer.py +++ b/openpype/hosts/tvpaint/plugins/create/create_render_layer.py @@ -1,11 +1,12 @@ from avalon.api import CreatorError -from avalon.tvpaint import ( + +from openpype.lib import prepare_template_data +from openpype.hosts.tvpaint.api import ( + plugin, pipeline, lib, CommunicationWrapper ) -from openpype.hosts.tvpaint.api import plugin -from openpype.lib import prepare_template_data class CreateRenderlayer(plugin.Creator): @@ -56,7 +57,7 @@ class CreateRenderlayer(plugin.Creator): # Validate that communication is initialized if CommunicationWrapper.communicator: # Get currently selected layers - layers_data = lib.layers_data() + layers_data = lib.get_layers_data() selected_layers = [ layer @@ -75,7 +76,7 @@ class CreateRenderlayer(plugin.Creator): def process(self): self.log.debug("Query data from workfile.") instances = pipeline.list_instances() - layers_data = lib.layers_data() + layers_data = lib.get_layers_data() self.log.debug("Checking for selection groups.") # Collect group ids from selection @@ -102,7 +103,7 @@ class CreateRenderlayer(plugin.Creator): self.log.debug(f"Selected group id is \"{group_id}\".") self.data["group_id"] = group_id - group_data = lib.groups_data() + group_data = lib.get_groups_data() group_name = None for group in group_data: if group["group_id"] == group_id: @@ -169,7 +170,7 @@ class CreateRenderlayer(plugin.Creator): return self.log.debug("Querying groups data from workfile.") - groups_data = lib.groups_data() + groups_data = lib.get_groups_data() self.log.debug("Changing name of the group.") selected_group = None diff --git a/openpype/hosts/tvpaint/plugins/create/create_render_pass.py b/openpype/hosts/tvpaint/plugins/create/create_render_pass.py index ad06520210..af962052fc 100644 --- a/openpype/hosts/tvpaint/plugins/create/create_render_pass.py +++ b/openpype/hosts/tvpaint/plugins/create/create_render_pass.py @@ -1,11 +1,11 @@ from avalon.api import CreatorError -from avalon.tvpaint import ( +from openpype.lib import prepare_template_data +from openpype.hosts.tvpaint.api import ( + plugin, pipeline, lib, CommunicationWrapper ) -from openpype.hosts.tvpaint.api import plugin -from openpype.lib import prepare_template_data class CreateRenderPass(plugin.Creator): diff --git a/openpype/hosts/tvpaint/plugins/load/load_image.py b/openpype/hosts/tvpaint/plugins/load/load_image.py index f77fab87f8..1246fe8248 100644 --- a/openpype/hosts/tvpaint/plugins/load/load_image.py +++ b/openpype/hosts/tvpaint/plugins/load/load_image.py @@ -1,8 +1,8 @@ from avalon.vendor import qargparse -from avalon.tvpaint import lib, pipeline +from openpype.hosts.tvpaint.api import lib, plugin -class ImportImage(pipeline.Loader): +class ImportImage(plugin.Loader): """Load image or image sequence to TVPaint as new layer.""" families = ["render", "image", "background", "plate"] diff --git a/openpype/hosts/tvpaint/plugins/load/load_reference_image.py b/openpype/hosts/tvpaint/plugins/load/load_reference_image.py index b8b20ed20a..b5e0a86686 100644 --- a/openpype/hosts/tvpaint/plugins/load/load_reference_image.py +++ b/openpype/hosts/tvpaint/plugins/load/load_reference_image.py @@ -1,10 +1,10 @@ import collections from avalon.pipeline import get_representation_context from avalon.vendor import qargparse -from avalon.tvpaint import lib, pipeline +from openpype.hosts.tvpaint.api import lib, pipeline, plugin -class LoadImage(pipeline.Loader): +class LoadImage(plugin.Loader): """Load image or image sequence to TVPaint as new layer.""" families = ["render", "image", "background", "plate"] diff --git a/openpype/hosts/tvpaint/plugins/load/load_sound.py b/openpype/hosts/tvpaint/plugins/load/load_sound.py index c83748fe06..3f42370f5c 100644 --- a/openpype/hosts/tvpaint/plugins/load/load_sound.py +++ b/openpype/hosts/tvpaint/plugins/load/load_sound.py @@ -1,9 +1,9 @@ import os import tempfile -from avalon.tvpaint import lib, pipeline +from openpype.hosts.tvpaint.api import lib, plugin -class ImportSound(pipeline.Loader): +class ImportSound(plugin.Loader): """Load sound to TVPaint. Sound layers does not have ids but only position index so we can't diff --git a/openpype/hosts/tvpaint/plugins/load/load_workfile.py b/openpype/hosts/tvpaint/plugins/load/load_workfile.py index f410a1ab9d..33e2a76cc9 100644 --- a/openpype/hosts/tvpaint/plugins/load/load_workfile.py +++ b/openpype/hosts/tvpaint/plugins/load/load_workfile.py @@ -1,16 +1,16 @@ import getpass import os -from avalon.tvpaint import lib, pipeline, get_current_workfile_context from avalon import api, io from openpype.lib import ( get_workfile_template_key_from_context, get_workdir_data ) from openpype.api import Anatomy +from openpype.hosts.tvpaint.api import lib, pipeline, plugin -class LoadWorkfile(pipeline.Loader): +class LoadWorkfile(plugin.Loader): """Load workfile.""" families = ["workfile"] @@ -24,7 +24,7 @@ class LoadWorkfile(pipeline.Loader): host = api.registered_host() current_file = host.current_file() - context = get_current_workfile_context() + context = pipeline.get_current_workfile_context() filepath = self.fname.replace("\\", "/") diff --git a/openpype/hosts/tvpaint/plugins/publish/collect_workfile_data.py b/openpype/hosts/tvpaint/plugins/publish/collect_workfile_data.py index f4259f1b5f..f5c86c613b 100644 --- a/openpype/hosts/tvpaint/plugins/publish/collect_workfile_data.py +++ b/openpype/hosts/tvpaint/plugins/publish/collect_workfile_data.py @@ -4,7 +4,7 @@ import tempfile import pyblish.api import avalon.api -from avalon.tvpaint import pipeline, lib +from openpype.hosts.tvpaint.api import pipeline, lib class ResetTVPaintWorkfileMetadata(pyblish.api.Action): diff --git a/openpype/hosts/tvpaint/plugins/publish/increment_workfile_version.py b/openpype/hosts/tvpaint/plugins/publish/increment_workfile_version.py index a96a8e3d5d..c9f2434cef 100644 --- a/openpype/hosts/tvpaint/plugins/publish/increment_workfile_version.py +++ b/openpype/hosts/tvpaint/plugins/publish/increment_workfile_version.py @@ -1,7 +1,7 @@ import pyblish.api -from avalon.tvpaint import workio from openpype.api import version_up +from openpype.hosts.tvpaint.api import workio class IncrementWorkfileVersion(pyblish.api.ContextPlugin): diff --git a/openpype/hosts/tvpaint/plugins/publish/validate_asset_name.py b/openpype/hosts/tvpaint/plugins/publish/validate_asset_name.py index 4ce8d5347d..0fdeba0a21 100644 --- a/openpype/hosts/tvpaint/plugins/publish/validate_asset_name.py +++ b/openpype/hosts/tvpaint/plugins/publish/validate_asset_name.py @@ -1,5 +1,5 @@ import pyblish.api -from avalon.tvpaint import pipeline +from openpype.hosts.tvpaint.api import pipeline class FixAssetNames(pyblish.api.Action): diff --git a/openpype/hosts/tvpaint/plugins/publish/validate_marks.py b/openpype/hosts/tvpaint/plugins/publish/validate_marks.py index e2ef81e4a4..9d55bb21a9 100644 --- a/openpype/hosts/tvpaint/plugins/publish/validate_marks.py +++ b/openpype/hosts/tvpaint/plugins/publish/validate_marks.py @@ -1,7 +1,7 @@ import json import pyblish.api -from avalon.tvpaint import lib +from openpype.hosts.tvpaint.api import lib class ValidateMarksRepair(pyblish.api.Action): diff --git a/openpype/hosts/tvpaint/plugins/publish/validate_start_frame.py b/openpype/hosts/tvpaint/plugins/publish/validate_start_frame.py index d769d47736..e2f8386757 100644 --- a/openpype/hosts/tvpaint/plugins/publish/validate_start_frame.py +++ b/openpype/hosts/tvpaint/plugins/publish/validate_start_frame.py @@ -1,5 +1,5 @@ import pyblish.api -from avalon.tvpaint import lib +from openpype.hosts.tvpaint.api import lib class RepairStartFrame(pyblish.api.Action): diff --git a/openpype/hosts/tvpaint/plugins/publish/validate_workfile_metadata.py b/openpype/hosts/tvpaint/plugins/publish/validate_workfile_metadata.py index 757da3294a..48fbeedb59 100644 --- a/openpype/hosts/tvpaint/plugins/publish/validate_workfile_metadata.py +++ b/openpype/hosts/tvpaint/plugins/publish/validate_workfile_metadata.py @@ -1,5 +1,5 @@ import pyblish.api -from avalon.tvpaint import save_file +from openpype.hosts.tvpaint.api import save_file class ValidateWorkfileMetadataRepair(pyblish.api.Action): From 37777f7877164294625102ee96b049e9c79803f2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 26 Nov 2021 16:06:17 +0100 Subject: [PATCH 026/341] added tvpaint plugin code and builds --- .../hosts/tvpaint/tvpaint_plugin/__init__.py | 6 + .../tvpaint_plugin/plugin_code/CMakeLists.txt | 45 + .../tvpaint_plugin/plugin_code/README.md | 34 + .../tvpaint_plugin/plugin_code/library.cpp | 790 ++++++++++++++++++ .../tvpaint_plugin/plugin_code/library.def | 10 + .../boost_random-vc142-mt-x64-1_72.dll | Bin 0 -> 30720 bytes .../windows_x64/plugin/OpenPypePlugin.dll | Bin 0 -> 5808128 bytes .../boost_random-vc142-mt-x32-1_72.dll | Bin 0 -> 26112 bytes .../windows_x86/plugin/OpenPypePlugin.dll | Bin 0 -> 5570560 bytes 9 files changed, 885 insertions(+) create mode 100644 openpype/hosts/tvpaint/tvpaint_plugin/__init__.py create mode 100644 openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/CMakeLists.txt create mode 100644 openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/README.md create mode 100644 openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/library.cpp create mode 100644 openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/library.def create mode 100644 openpype/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x64/additional_libraries/boost_random-vc142-mt-x64-1_72.dll create mode 100644 openpype/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x64/plugin/OpenPypePlugin.dll create mode 100644 openpype/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x86/additional_libraries/boost_random-vc142-mt-x32-1_72.dll create mode 100644 openpype/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x86/plugin/OpenPypePlugin.dll diff --git a/openpype/hosts/tvpaint/tvpaint_plugin/__init__.py b/openpype/hosts/tvpaint/tvpaint_plugin/__init__.py new file mode 100644 index 0000000000..59a7aaf99b --- /dev/null +++ b/openpype/hosts/tvpaint/tvpaint_plugin/__init__.py @@ -0,0 +1,6 @@ +import os + + +def get_plugin_files_path(): + current_dir = os.path.dirname(os.path.abspath(__file__)) + return os.path.join(current_dir, "plugin_files") diff --git a/openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/CMakeLists.txt b/openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/CMakeLists.txt new file mode 100644 index 0000000000..ecd94acc99 --- /dev/null +++ b/openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required(VERSION 3.17) +project(OpenPypePlugin C CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_EXTENSIONS OFF) + +set(IP_ENABLE_UNICODE OFF) +set(IP_ENABLE_DOCTEST OFF) + +if(MSVC) + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + +# TODO better options +option(BOOST_ROOT "Path to root of Boost" "") + +option(OPENSSL_INCLUDE "OpenSSL include path" "") +option(OPENSSL_LIB_DIR "OpenSSL lib path" "") + +option(WEBSOCKETPP_INCLUDE "Websocketpp include path" "") +option(WEBSOCKETPP_LIB_DIR "Websocketpp lib path" "") + +option(JSONRPCPP_INCLUDE "Jsonrpcpp include path" "") + +find_package(Boost 1.72.0 COMPONENTS random) + +include_directories( + "${TVPAINT_SDK_INCLUDE}" + "${OPENSSL_INCLUDE}" + "${WEBSOCKETPP_INCLUDE}" + "${JSONRPCPP_INCLUDE}" + "${Boost_INCLUDE_DIR}" +) +link_directories( + "${OPENSSL_LIB_DIR}" + "${WEBSOCKETPP_LIB_DIR}" +) + +add_library(jsonrpcpp INTERFACE) + +add_library(${PROJECT_NAME} SHARED library.cpp library.def "${TVPAINT_SDK_LIB}/dllx.c") + +target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES}) +target_link_libraries(${PROJECT_NAME} jsonrpcpp) diff --git a/openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/README.md b/openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/README.md new file mode 100644 index 0000000000..03b0a31f51 --- /dev/null +++ b/openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/README.md @@ -0,0 +1,34 @@ +README for TVPaint Avalon plugin +================================ +Introduction +------------ +This project is dedicated to integrate Avalon functionality to TVPaint. +This implementaiton is using TVPaint plugin (C/C++) which can communicate with python process. The communication should allow to trigger tools or pipeline functions from TVPaint and accept requests from python process at the same time. + +Current implementation is based on websocket protocol, using json-rpc communication (specification 2.0). Project is in beta stage, tested only on Windows. + +To be able to load plugin, environment variable `WEBSOCKET_URL` must be set otherwise plugin won't load at all. Plugin should not affect TVPaint if python server crash, but buttons won't work. + +## Requirements - Python server +- python >= 3.6 +- aiohttp +- aiohttp-json-rpc + +### Windows +- pywin32 - required only for plugin installation + +## Requirements - Plugin compilation +- TVPaint SDK - Ask for SDK on TVPaint support. +- Boost 1.72.0 - Boost is used across other plugins (Should be possible to use different version with CMakeLists modification) +- Websocket++/Websocketpp - Websocket library (https://github.com/zaphoyd/websocketpp) +- OpenSSL library - Required by Websocketpp +- jsonrpcpp - C++ library handling json-rpc 2.0 (https://github.com/badaix/jsonrpcpp) +- nlohmann/json - Required for jsonrpcpp (https://github.com/nlohmann/json) + +### jsonrpcpp +This library has `nlohmann/json` as it's part, but current `master` has old version which has bug and probably won't be possible to use library on windows without using last `nlohmann/json`. + +## TODO +- modify code and CMake to be able to compile on MacOS/Linux +- separate websocket logic from plugin logic +- hide buttons and show error message if server is closed diff --git a/openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/library.cpp b/openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/library.cpp new file mode 100644 index 0000000000..a57124084b --- /dev/null +++ b/openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/library.cpp @@ -0,0 +1,790 @@ +#ifdef _WIN32 +// Include before +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "plugdllx.h" + +#include + +#include +#include + +#include "json.hpp" +#include "jsonrpcpp.hpp" + + +// All functions not exported should be static. +// All global variables should be static. + +// mReq Identification of the requester. (=0 closed, !=0 requester ID) +static struct { + bool firstParams; + DWORD mReq; + void* mLocalFile; + PIFilter *current_filter; + // Id counter for client requests + int client_request_id; + // There are new menu items + bool newMenuItems; + // Menu item definitions received from connection + nlohmann::json menuItems; + // Menu items used in requester by their ID + nlohmann::json menuItemsById; + std::list menuItemsIds; + // Messages from server before processing. + // - messages can't be process at the moment of recieve as client is running in thread + std::queue messages; + // Responses to requests mapped by request id + std::map responses; + +} Data = { + true, + 0, + nullptr, + nullptr, + 1, + false, + nlohmann::json::object(), + nlohmann::json::object() +}; + +// Json rpc 2.0 parser - for handling messages and callbacks +jsonrpcpp::Parser parser; +typedef websocketpp::client client; + + +class connection_metadata { +private: + websocketpp::connection_hdl m_hdl; + client *m_endpoint; + std::string m_status; +public: + typedef websocketpp::lib::shared_ptr ptr; + + connection_metadata(websocketpp::connection_hdl hdl, client *endpoint) + : m_hdl(hdl), m_status("Connecting") { + m_endpoint = endpoint; + } + + void on_open(client *c, websocketpp::connection_hdl hdl) { + m_status = "Open"; + } + + void on_fail(client *c, websocketpp::connection_hdl hdl) { + m_status = "Failed"; + } + + void on_close(client *c, websocketpp::connection_hdl hdl) { + m_status = "Closed"; + } + + void on_message(websocketpp::connection_hdl, client::message_ptr msg) { + std::string json_str; + if (msg->get_opcode() == websocketpp::frame::opcode::text) { + json_str = msg->get_payload(); + } else { + json_str = websocketpp::utility::to_hex(msg->get_payload()); + } + process_message(json_str); + } + + void process_message(std::string msg) { + std::cout << "--> " << msg << "\n"; + try { + jsonrpcpp::entity_ptr entity = parser.do_parse(msg); + if (!entity) { + // Return error code? + + } else if (entity->is_response()) { + jsonrpcpp::Response response = jsonrpcpp::Response(entity->to_json()); + Data.responses[response.id().int_id()] = response; + + } else if (entity->is_request() || entity->is_notification()) { + Data.messages.push(msg); + } + } + catch (const jsonrpcpp::RequestException &e) { + std::string message = e.to_json().dump(); + std::cout << "<-- " << e.to_json().dump() << "\n"; + send(message); + } + catch (const jsonrpcpp::ParseErrorException &e) { + std::string message = e.to_json().dump(); + std::cout << "<-- " << message << "\n"; + send(message); + } + catch (const jsonrpcpp::RpcException &e) { + std::cerr << "RpcException: " << e.what() << "\n"; + std::string message = jsonrpcpp::ParseErrorException(e.what()).to_json().dump(); + std::cout << "<-- " << message << "\n"; + send(message); + } + catch (const std::exception &e) { + std::cerr << "Exception: " << e.what() << "\n"; + } + } + + void send(std::string message) { + if (get_status() != "Open") { + return; + } + websocketpp::lib::error_code ec; + + m_endpoint->send(m_hdl, message, websocketpp::frame::opcode::text, ec); + if (ec) { + std::cout << "> Error sending message: " << ec.message() << std::endl; + return; + } + } + + void send_notification(jsonrpcpp::Notification *notification) { + send(notification->to_json().dump()); + } + + void send_response(jsonrpcpp::Response *response) { + send(response->to_json().dump()); + } + + void send_request(jsonrpcpp::Request *request) { + send(request->to_json().dump()); + } + + websocketpp::connection_hdl get_hdl() const { + return m_hdl; + } + + std::string get_status() const { + return m_status; + } +}; + + +class websocket_endpoint { +private: + client m_endpoint; + connection_metadata::ptr client_metadata; + websocketpp::lib::shared_ptr m_thread; + bool thread_is_running = false; + +public: + websocket_endpoint() { + m_endpoint.clear_access_channels(websocketpp::log::alevel::all); + m_endpoint.clear_error_channels(websocketpp::log::elevel::all); + } + + ~websocket_endpoint() { + close_connection(); + } + + void close_connection() { + m_endpoint.stop_perpetual(); + if (connected()) + { + // Close client + close(websocketpp::close::status::normal, ""); + } + if (thread_is_running) { + // Join thread + m_thread->join(); + thread_is_running = false; + } + } + + bool connected() + { + return (client_metadata && client_metadata->get_status() == "Open"); + } + int connect(std::string const &uri) { + if (client_metadata && client_metadata->get_status() == "Open") { + std::cout << "> Already connected" << std::endl; + return 0; + } + + m_endpoint.init_asio(); + m_endpoint.start_perpetual(); + + m_thread.reset(new websocketpp::lib::thread(&client::run, &m_endpoint)); + thread_is_running = true; + + websocketpp::lib::error_code ec; + + client::connection_ptr con = m_endpoint.get_connection(uri, ec); + + if (ec) { + std::cout << "> Connect initialization error: " << ec.message() << std::endl; + return -1; + } + + client_metadata = websocketpp::lib::make_shared(con->get_handle(), &m_endpoint); + + con->set_open_handler(websocketpp::lib::bind( + &connection_metadata::on_open, + client_metadata, + &m_endpoint, + websocketpp::lib::placeholders::_1 + )); + con->set_fail_handler(websocketpp::lib::bind( + &connection_metadata::on_fail, + client_metadata, + &m_endpoint, + websocketpp::lib::placeholders::_1 + )); + con->set_close_handler(websocketpp::lib::bind( + &connection_metadata::on_close, + client_metadata, + &m_endpoint, + websocketpp::lib::placeholders::_1 + )); + con->set_message_handler(websocketpp::lib::bind( + &connection_metadata::on_message, + client_metadata, + websocketpp::lib::placeholders::_1, + websocketpp::lib::placeholders::_2 + )); + + m_endpoint.connect(con); + + return 1; + } + + void close(websocketpp::close::status::value code, std::string reason) { + if (!client_metadata || client_metadata->get_status() != "Open") { + std::cout << "> Not connected yet" << std::endl; + return; + } + + websocketpp::lib::error_code ec; + + m_endpoint.close(client_metadata->get_hdl(), code, reason, ec); + if (ec) { + std::cout << "> Error initiating close: " << ec.message() << std::endl; + } + } + + void send(std::string message) { + if (!client_metadata || client_metadata->get_status() != "Open") { + std::cout << "> Not connected yet" << std::endl; + return; + } + + client_metadata->send(message); + } + + void send_notification(jsonrpcpp::Notification *notification) { + client_metadata->send_notification(notification); + } + + void send_response(jsonrpcpp::Response *response) { + client_metadata->send(response->to_json().dump()); + } + + void send_response(std::shared_ptr response) { + client_metadata->send(response->to_json().dump()); + } + + void send_request(jsonrpcpp::Request *request) { + client_metadata->send_request(request); + } +}; + +class Communicator { +private: + // URL to websocket server + std::string websocket_url; + // Should be avalon plugin available? + // - this may change during processing if websocketet url is not set or server is down + bool use_avalon; +public: + Communicator(); + websocket_endpoint endpoint; + bool is_connected(); + bool is_usable(); + void connect(); + void process_requests(); + jsonrpcpp::Response call_method(std::string method_name, nlohmann::json params); + void call_notification(std::string method_name, nlohmann::json params); +}; + +Communicator::Communicator() { + // URL to websocket server + websocket_url = std::getenv("WEBSOCKET_URL"); + // Should be avalon plugin available? + // - this may change during processing if websocketet url is not set or server is down + if (websocket_url == "") { + use_avalon = false; + } else { + use_avalon = true; + } +} + +bool Communicator::is_connected(){ + return endpoint.connected(); +} + +bool Communicator::is_usable(){ + return use_avalon; +} + +void Communicator::connect() +{ + if (!use_avalon) { + return; + } + int con_result; + con_result = endpoint.connect(websocket_url); + if (con_result == -1) + { + use_avalon = false; + } else { + use_avalon = true; + } +} + +void Communicator::call_notification(std::string method_name, nlohmann::json params) { + if (!use_avalon || !is_connected()) {return;} + + jsonrpcpp::Notification notification = {method_name, params}; + endpoint.send_notification(¬ification); +} + +jsonrpcpp::Response Communicator::call_method(std::string method_name, nlohmann::json params) { + jsonrpcpp::Response response; + if (!use_avalon || !is_connected()) + { + return response; + } + int request_id = Data.client_request_id++; + jsonrpcpp::Request request = {request_id, method_name, params}; + endpoint.send_request(&request); + + bool found = false; + while (!found) { + std::map::iterator iter = Data.responses.find(request_id); + if (iter != Data.responses.end()) { + //element found == was found response + response = iter->second; + Data.responses.erase(request_id); + found = true; + } else { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + } + return response; +} + +void Communicator::process_requests() { + if (!use_avalon || !is_connected() || Data.messages.empty()) {return;} + + std::string msg = Data.messages.front(); + Data.messages.pop(); + std::cout << "Parsing: " << msg << std::endl; + // TODO: add try->except block + auto response = parser.parse(msg); + if (response->is_response()) { + endpoint.send_response(response); + } else { + jsonrpcpp::request_ptr request = std::dynamic_pointer_cast(response); + jsonrpcpp::Error error("Method \"" + request->method() + "\" not found", -32601); + jsonrpcpp::Response _response(request->id(), error); + endpoint.send_response(&_response); + } +} + +jsonrpcpp::response_ptr define_menu(const jsonrpcpp::Id &id, const jsonrpcpp::Parameter ¶ms) { + /* Define plugin menu. + + Menu is defined with json with "title" and "menu_items". + Each item in "menu_items" must have keys: + - "callback" - callback called with RPC when button is clicked + - "label" - label of button + - "help" - tooltip of button + ``` + { + "title": "< Menu title>", + "menu_items": [ + { + "callback": "workfiles_tool", + "label": "Workfiles", + "help": "Open workfiles tool" + }, + ... + ] + } + ``` + */ + Data.menuItems = params.to_json()[0]; + Data.newMenuItems = true; + + std::string output; + + return std::make_shared(id, output); +} + +jsonrpcpp::response_ptr execute_george(const jsonrpcpp::Id &id, const jsonrpcpp::Parameter ¶ms) { + const char *george_script; + char cmd_output[1024] = {0}; + char empty_char = {0}; + std::string std_george_script; + std::string output; + + nlohmann::json json_params = params.to_json(); + std_george_script = json_params[0]; + george_script = std_george_script.c_str(); + + // Result of `TVSendCmd` is int with length of output string + TVSendCmd(Data.current_filter, george_script, cmd_output); + + for (int i = 0; i < sizeof(cmd_output); i++) + { + if (cmd_output[i] == empty_char){ + break; + } + output += cmd_output[i]; + } + return std::make_shared(id, output); +} + +void register_callbacks(){ + parser.register_request_callback("define_menu", define_menu); + parser.register_request_callback("execute_george", execute_george); +} + +Communicator communication; + +//////////////////////////////////////////////////////////////////////////////////////// + +static char* GetLocalString( PIFilter* iFilter, int iNum, char* iDefault ) +{ + char* str; + + if( Data.mLocalFile == NULL ) + return iDefault; + + str = TVGetLocalString( iFilter, Data.mLocalFile, iNum ); + if( str == NULL || strlen( str ) == 0 ) + return iDefault; + + return str; +} + +/**************************************************************************************/ +// Localisation + +// numbers (like 10011) are IDs in the localized file. +// strings are the default values to use when the ID is not found +// in the localized file (or the localized file doesn't exist). +std::string label_from_evn() +{ + std::string _plugin_label = "Avalon"; + if (std::getenv("AVALON_LABEL") && std::getenv("AVALON_LABEL") != "") + { + _plugin_label = std::getenv("AVALON_LABEL"); + } + return _plugin_label; +} +std::string plugin_label = label_from_evn(); + +#define TXT_REQUESTER GetLocalString( iFilter, 100, "OpenPype Tools" ) + +#define TXT_REQUESTER_ERROR GetLocalString( iFilter, 30001, "Can't Open Requester !" ) + +//////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////// + +// The functions directly called by Aura through the plugin interface + + + +/**************************************************************************************/ +// "About" function. + + +void FAR PASCAL PI_About( PIFilter* iFilter ) +{ + char text[256]; + + sprintf( text, "%s %d,%d", iFilter->PIName, iFilter->PIVersion, iFilter->PIRevision ); + + // Just open a warning popup with the filter name and version. + // You can open a much nicer requester if you want. + TVWarning( iFilter, text ); +} + + +/**************************************************************************************/ +// Function called at Aura startup, when the filter is loaded. +// Should do as little as possible to keep Aura's startup time small. + +int FAR PASCAL PI_Open( PIFilter* iFilter ) +{ + Data.current_filter = iFilter; + char tmp[256]; + + strcpy( iFilter->PIName, plugin_label.c_str() ); + iFilter->PIVersion = 1; + iFilter->PIRevision = 0; + + // If this plugin was the one open at Aura shutdown, re-open it + TVReadUserString( iFilter, iFilter->PIName, "Open", tmp, "0", 255 ); + if( atoi( tmp ) ) + { + PI_Parameters( iFilter, NULL ); // NULL as iArg means "open the requester" + } + + communication.connect(); + register_callbacks(); + return 1; // OK +} + + +/**************************************************************************************/ +// Aura shutdown: we make all the necessary cleanup + +void FAR PASCAL PI_Close( PIFilter* iFilter ) +{ + if( Data.mLocalFile ) + { + TVCloseLocalFile( iFilter, Data.mLocalFile ); + } + if( Data.mReq ) + { + TVCloseReq( iFilter, Data.mReq ); + } + communication.endpoint.close_connection(); +} + + +/**************************************************************************************/ +// we have something to do ! + +int FAR PASCAL PI_Parameters( PIFilter* iFilter, char* iArg ) +{ + if( !iArg ) + { + + // If the requester is not open, we open it. + if( Data.mReq == 0) + { + // Create empty requester because menu items are defined with + // `define_menu` callback + DWORD req = TVOpenFilterReqEx( + iFilter, + 185, + 20, + NULL, + NULL, + PIRF_STANDARD_REQ | PIRF_COLLAPSABLE_REQ, + FILTERREQ_NO_TBAR + ); + if( req == 0 ) + { + TVWarning( iFilter, TXT_REQUESTER_ERROR ); + return 0; + } + + + Data.mReq = req; + // This is a very simple requester, so we create it's content right here instead + // of waiting for the PICBREQ_OPEN message... + // Not recommended for more complex requesters. (see the other examples) + + // Sets the title of the requester. + TVSetReqTitle( iFilter, Data.mReq, TXT_REQUESTER ); + // Request to listen to ticks + TVGrabTicks(iFilter, req, PITICKS_FLAG_ON); + } + else + { + // If it is already open, we just put it on front of all other requesters. + TVReqToFront( iFilter, Data.mReq ); + } + } + + return 1; +} + + +int newMenuItemsProcess(PIFilter* iFilter) { + // Menu items defined with `define_menu` should be propagated. + + // Change flag that there are new menu items (avoid infinite loop) + Data.newMenuItems = false; + // Skip if requester does not exists + if (Data.mReq == 0) { + return 0; + } + // Remove all previous menu items + for (int menu_id : Data.menuItemsIds) + { + TVRemoveButtonReq(iFilter, Data.mReq, menu_id); + } + // Clear caches + Data.menuItemsById.clear(); + Data.menuItemsIds.clear(); + + // We use a variable to contains the vertical position of the buttons. + // Each time we create a button, we add its size to this variable. + // This makes it very easy to add/remove/displace buttons in a requester. + int x_pos = 9; + int y_pos = 5; + + // Menu width + int menu_width = 185; + // Single menu item width + int btn_width = menu_width - 19; + // Single row height (btn height is 18) + int row_height = 20; + // Additional height to menu + int height_offset = 5; + + // This is a very simple requester, so we create it's content right here instead + // of waiting for the PICBREQ_OPEN message... + // Not recommended for more complex requesters. (see the other examples) + + const char *menu_title = TXT_REQUESTER; + if (Data.menuItems.contains("title")) + { + menu_title = Data.menuItems["title"].get()->c_str(); + } + // Sets the title of the requester. + TVSetReqTitle( iFilter, Data.mReq, menu_title ); + + // Resize menu + // First get current position and sizes (we only need the position) + int current_x = 0; + int current_y = 0; + int current_width = 0; + int current_height = 0; + TVInfoReq(iFilter, Data.mReq, ¤t_x, ¤t_y, ¤t_width, ¤t_height); + + // Calculate new height + int menu_height = (row_height * Data.menuItems["menu_items"].size()) + height_offset; + // Resize + TVResizeReq(iFilter, Data.mReq, current_x, current_y, menu_width, menu_height); + + // Add menu items + int item_counter = 1; + for (auto& item : Data.menuItems["menu_items"].items()) + { + int item_id = item_counter * 10; + item_counter ++; + std::string item_id_str = std::to_string(item_id); + nlohmann::json item_data = item.value(); + const char *item_label = item_data["label"].get()->c_str(); + const char *help_text = item_data["help"].get()->c_str(); + std::string item_callback = item_data["callback"].get(); + TVAddButtonReq(iFilter, Data.mReq, x_pos, y_pos, btn_width, 0, item_id, PIRBF_BUTTON_NORMAL|PIRBF_BUTTON_ACTION, item_label); + TVSetButtonInfoText( iFilter, Data.mReq, item_id, help_text ); + y_pos += row_height; + + Data.menuItemsById[std::to_string(item_id)] = item_callback; + Data.menuItemsIds.push_back(item_id); + } + + return 1; +} +/**************************************************************************************/ +// something happenned that needs our attention. +// Global variable where current button up data are stored +std::string button_up_item_id_str; +int FAR PASCAL PI_Msg( PIFilter* iFilter, INTPTR iEvent, INTPTR iReq, INTPTR* iArgs ) +{ + Data.current_filter = iFilter; + // what did happen ? + switch( iEvent ) + { + // The user just 'clicked' on a normal button + case PICBREQ_BUTTON_UP: + button_up_item_id_str = std::to_string(iArgs[0]); + if (Data.menuItemsById.contains(button_up_item_id_str)) + { + std::string callback_name = Data.menuItemsById[button_up_item_id_str].get(); + communication.call_method(callback_name, nlohmann::json::array()); + } + TVExecute( iFilter ); + break; + + // The requester was just closed. + case PICBREQ_CLOSE: + // requester doesn't exists anymore + Data.mReq = 0; + + char tmp[256]; + // Save the requester state (opened or closed) + // iArgs[4] contains a flag which tells us if the requester + // has been closed by the user (flag=0) or by Aura's shutdown (flag=1). + // If it was by Aura's shutdown, that means this requester was the + // last one open, so we should reopen this one the next time Aura + // is started. Else we won't open it next time. + sprintf( tmp, "%d", (int)(iArgs[4]) ); + + // Save it in Aura's init file. + TVWriteUserString( iFilter, iFilter->PIName, "Open", tmp ); + break; + + case PICBREQ_TICKS: + if (Data.newMenuItems) + { + newMenuItemsProcess(iFilter); + } + communication.process_requests(); + } + + return 1; +} + + +/**************************************************************************************/ +// Start of the 'execution' of the filter for a new sequence. +// - iNumImages contains the total number of frames to be processed. +// Here you should allocate memory that is used for all frames, +// and precompute all the stuff that doesn't change from frame to frame. + + +int FAR PASCAL PI_SequenceStart( PIFilter* iFilter, int iNumImages ) +{ + // In this simple example we don't have anything to allocate/precompute. + + // 1 means 'continue', 0 means 'error, abort' (like 'not enough memory') + return 1; +} + + +// Here you should cleanup what you've done in PI_SequenceStart + +void FAR PASCAL PI_SequenceFinish( PIFilter* iFilter ) +{} + + +/**************************************************************************************/ +// This is called before each frame. +// Here you should allocate memory and precompute all the stuff you can. + +int FAR PASCAL PI_Start( PIFilter* iFilter, double iPos, double iSize ) +{ + return 1; +} + + +void FAR PASCAL PI_Finish( PIFilter* iFilter ) +{ + // nothing special to cleanup +} + + +/**************************************************************************************/ +// 'Execution' of the filter. +int FAR PASCAL PI_Work( PIFilter* iFilter ) +{ + return 1; +} diff --git a/openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/library.def b/openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/library.def new file mode 100644 index 0000000000..882f2b4719 --- /dev/null +++ b/openpype/hosts/tvpaint/tvpaint_plugin/plugin_code/library.def @@ -0,0 +1,10 @@ +LIBRARY Avalonplugin +EXPORTS + PI_Msg + PI_Open + PI_About + PI_Parameters + PI_Start + PI_Work + PI_Finish + PI_Close diff --git a/openpype/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x64/additional_libraries/boost_random-vc142-mt-x64-1_72.dll b/openpype/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x64/additional_libraries/boost_random-vc142-mt-x64-1_72.dll new file mode 100644 index 0000000000000000000000000000000000000000..46bd533b72dd36a9fc88846fde23d3295d826ce5 GIT binary patch literal 30720 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 U_tb#C1SqORy8!>y{e>L(AJhZ8`2YX_ literal 0 HcmV?d00001 diff --git a/openpype/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x64/plugin/OpenPypePlugin.dll b/openpype/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x64/plugin/OpenPypePlugin.dll new file mode 100644 index 0000000000000000000000000000000000000000..293a7b19b01076f4b076e9dd870b2ce7de1ab8d0 GIT binary patch literal 5808128 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

RvnJ_4)S?o-LM|; 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

XJu8{Y!Ph2bVcL$P2?n6i3Au)h5*nO*% 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�Byj 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

E{ZJ|!-Y`s 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 b^l1p1lb%tYaVVpYzt028->&~pB=CO#lgmzQ literal 0 HcmV?d00001 diff --git a/openpype/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x86/plugin/OpenPypePlugin.dll b/openpype/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x86/plugin/OpenPypePlugin.dll new file mode 100644 index 0000000000000000000000000000000000000000..9671d8a27b1c2cc1f1f213328c68a3dee21a58f5 GIT binary patch literal 5570560 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

@0%hbjMu>i{RuVe!V67uakpynKY@}~ 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

*=c_=ct)IM^2)!#8f3PRjzPdtV2oV4IKi) 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

eAvD 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 Ku`Vn{MUzI;*;1E^gpGO3WZ$bjK`| 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%0DsWY9gCf@DscrbRCqxsC^H~G)| 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⋙&0}jI77lx^JZn%CyjAUXcwYVWZlgU;s*Fx;~7? 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 L_y7Ow{RaL4d6BG% literal 0 HcmV?d00001 From a8e8f93fae6b572999a4be5c628836a6414d17cd Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 26 Nov 2021 16:10:11 +0100 Subject: [PATCH 027/341] modified prelaunch hook --- openpype/hosts/tvpaint/__init__.py | 12 ++++++++++++ openpype/hosts/tvpaint/hooks/pre_launch_args.py | 10 +++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/openpype/hosts/tvpaint/__init__.py b/openpype/hosts/tvpaint/__init__.py index 0e793fcf9f..09b7c52cd1 100644 --- a/openpype/hosts/tvpaint/__init__.py +++ b/openpype/hosts/tvpaint/__init__.py @@ -1,3 +1,6 @@ +import os + + def add_implementation_envs(env, _app): """Modify environments to contain all required for implementation.""" defaults = { @@ -6,3 +9,12 @@ def add_implementation_envs(env, _app): for key, value in defaults.items(): if not env.get(key): env[key] = value + + +def get_launch_script_path(): + current_dir = os.path.dirname(os.path.abspath(__file__)) + return os.path.join( + current_dir, + "api", + "launch_script.py" + ) diff --git a/openpype/hosts/tvpaint/hooks/pre_launch_args.py b/openpype/hosts/tvpaint/hooks/pre_launch_args.py index b0b13529ca..62fd662d79 100644 --- a/openpype/hosts/tvpaint/hooks/pre_launch_args.py +++ b/openpype/hosts/tvpaint/hooks/pre_launch_args.py @@ -44,10 +44,6 @@ class TvpaintPrelaunchHook(PreLaunchHook): self.launch_context.launch_args.extend(remainders) def launch_script_path(self): - avalon_dir = os.path.dirname(os.path.abspath(avalon.__file__)) - script_path = os.path.join( - avalon_dir, - "tvpaint", - "launch_script.py" - ) - return script_path \ No newline at end of file + from openpype.hosts.tvpaint import get_launch_script_path + + return get_launch_script_path() From 41c1f6a2d150ccdfa882b4e6a7e8003c694e1d3d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 29 Nov 2021 13:09:00 +0100 Subject: [PATCH 028/341] reuse already available variables --- openpype/lib/avalon_context.py | 13 +++++++------ .../publish/collect_anatomy_context_data.py | 16 +++++++--------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index 581e4b9dbd..8fb2543412 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -479,16 +479,17 @@ def get_workdir_data(project_doc, asset_doc, task_name, host_name): Returns: dict: Data prepared for filling workdir template. """ - hierarchy = "/".join(asset_doc["data"]["parents"]) - task_type = asset_doc['data']['tasks'].get(task_name, {}).get('type') project_task_types = project_doc["config"]["tasks"] task_code = project_task_types.get(task_type, {}).get("short_name") - parent = project_doc["name"] - if len(asset_doc["data"]["parents"]) != 0: - parent = asset_doc["data"]["parents"][-1] + asset_parents = asset_doc["data"]["parents"] + hierarchy = "/".join(asset_parents) + + parent_name = project_doc["name"] + if asset_parents: + parent_name = asset_parents[-1] data = { "project": { @@ -501,7 +502,7 @@ def get_workdir_data(project_doc, asset_doc, task_name, host_name): "short": task_code, }, "asset": asset_doc["name"], - "parent": parent, + "parent": parent_name, "app": host_name, "user": getpass.getuser(), "hierarchy": hierarchy, diff --git a/openpype/plugins/publish/collect_anatomy_context_data.py b/openpype/plugins/publish/collect_anatomy_context_data.py index b0c9eea576..ae8a879fba 100644 --- a/openpype/plugins/publish/collect_anatomy_context_data.py +++ b/openpype/plugins/publish/collect_anatomy_context_data.py @@ -49,20 +49,18 @@ class CollectAnatomyContextData(pyblish.api.ContextPlugin): project_entity = context.data["projectEntity"] asset_entity = context.data["assetEntity"] - hierarchy_items = asset_entity["data"]["parents"] - hierarchy = "" - if hierarchy_items: - hierarchy = os.path.join(*hierarchy_items) - asset_tasks = asset_entity["data"]["tasks"] task_type = asset_tasks.get(task_name, {}).get("type") project_task_types = project_entity["config"]["tasks"] task_code = project_task_types.get(task_type, {}).get("short_name") - parent = project_entity["name"] - if len(asset_entity["data"]["parents"]) != 0: - parent = asset_entity["data"]["parents"][-1] + asset_parents = asset_entity["data"]["parents"] + hierarchy = "/".join(asset_parents) + + parent_name = project_entity["name"] + if asset_parents: + parent_name = asset_parents[-1] context_data = { "project": { @@ -70,7 +68,7 @@ class CollectAnatomyContextData(pyblish.api.ContextPlugin): "code": project_entity["data"].get("code") }, "asset": asset_entity["name"], - "parent": parent, + "parent": parent_name, "hierarchy": hierarchy.replace("\\", "/"), "task": { "name": task_name, From 5c9a83b55dd79e9ddac6d678d4ad10cffed41bd8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 29 Nov 2021 13:09:12 +0100 Subject: [PATCH 029/341] added missing update of parent --- openpype/plugins/publish/collect_anatomy_instance_data.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openpype/plugins/publish/collect_anatomy_instance_data.py b/openpype/plugins/publish/collect_anatomy_instance_data.py index da6a2195ee..74b556e28a 100644 --- a/openpype/plugins/publish/collect_anatomy_instance_data.py +++ b/openpype/plugins/publish/collect_anatomy_instance_data.py @@ -242,7 +242,11 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin): asset_doc = instance.data.get("assetEntity") if asset_doc and asset_doc["_id"] != context_asset_doc["_id"]: parents = asset_doc["data"].get("parents") or list() + parent_name = project_doc["name"] + if parents: + parent_name = parents[-1] anatomy_updates["hierarchy"] = "/".join(parents) + anatomy_updates["parent"] = parent_name # Task task_name = instance.data.get("task") From 853ba0efb37a464b7ee2db0781a43ffee9a132d1 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 29 Nov 2021 13:10:06 +0100 Subject: [PATCH 030/341] removed conflict marks from docstring --- website/docs/admin_settings_project_anatomy.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/website/docs/admin_settings_project_anatomy.md b/website/docs/admin_settings_project_anatomy.md index e897b0ffab..5cb396264e 100644 --- a/website/docs/admin_settings_project_anatomy.md +++ b/website/docs/admin_settings_project_anatomy.md @@ -57,14 +57,11 @@ We have a few required anatomy templates for OpenPype to work properly, however | `project[code]` | Project's code | | `hierarchy` | All hierarchical parents as subfolders | | `asset` | Name of asset or shot | -<<<<<<< HEAD | `task[name]` | Name of task | | `task[type]` | Type of task | | `task[short]` | Shortname of task | -======= | `parent` | Name of parent folder | | `task` | Name of task | ->>>>>>> add7db0c0... add parent asset to doc | `version` | Version number | | `subset` | Subset name | | `family` | Main family name | From c6916ef96cd7470a4e24668c0d6b5951363c7149 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 29 Nov 2021 13:11:17 +0100 Subject: [PATCH 031/341] modified description of parent --- website/docs/admin_settings_project_anatomy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/admin_settings_project_anatomy.md b/website/docs/admin_settings_project_anatomy.md index 5cb396264e..a8be77d25b 100644 --- a/website/docs/admin_settings_project_anatomy.md +++ b/website/docs/admin_settings_project_anatomy.md @@ -60,7 +60,7 @@ We have a few required anatomy templates for OpenPype to work properly, however | `task[name]` | Name of task | | `task[type]` | Type of task | | `task[short]` | Shortname of task | -| `parent` | Name of parent folder | +| `parent` | Name of hierarchical parent | | `task` | Name of task | | `version` | Version number | | `subset` | Subset name | From 741f326935f73a45f6b15da8185ee3d2c3c7ba70 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 29 Nov 2021 13:13:01 +0100 Subject: [PATCH 032/341] removed not needed replacement --- openpype/plugins/publish/collect_anatomy_context_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/plugins/publish/collect_anatomy_context_data.py b/openpype/plugins/publish/collect_anatomy_context_data.py index ae8a879fba..07de1b4420 100644 --- a/openpype/plugins/publish/collect_anatomy_context_data.py +++ b/openpype/plugins/publish/collect_anatomy_context_data.py @@ -69,7 +69,7 @@ class CollectAnatomyContextData(pyblish.api.ContextPlugin): }, "asset": asset_entity["name"], "parent": parent_name, - "hierarchy": hierarchy.replace("\\", "/"), + "hierarchy": hierarchy, "task": { "name": task_name, "type": task_type, From 77cdd406108f7fa0b4506153d196f8f237a96946 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 29 Nov 2021 13:16:24 +0100 Subject: [PATCH 033/341] changed variable name in workfiles tool --- openpype/tools/workfiles/app.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index 4253f7450a..987b886864 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -85,9 +85,10 @@ class NameWindow(QtWidgets.QDialog): project_task_types = project_doc["config"]["tasks"] task_short = project_task_types.get(task_type, {}).get("short_name") - parent = project_doc["name"] - if len(asset_doc["data"]["parents"]) != 0: - parent = asset_doc["data"]["parents"][-1] + asset_parents = asset_doc["data"]["parents"] + parent_name = project_doc["name"] + if asset_parents: + parent_name = asset_parents[-1] self.data = { "project": { @@ -100,7 +101,7 @@ class NameWindow(QtWidgets.QDialog): "type": task_type, "short": task_short, }, - "parent": parent, + "parent": parent_name, "version": 1, "user": getpass.getuser(), "comment": "", From 5795636af55067be12e3992408d40c23c339c1a4 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 30 Nov 2021 14:39:43 +0100 Subject: [PATCH 034/341] OP-2042 - updates to db dumps and loads --- tests/lib/db_handler.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/lib/db_handler.py b/tests/lib/db_handler.py index 9be70895da..4dde5ba46e 100644 --- a/tests/lib/db_handler.py +++ b/tests/lib/db_handler.py @@ -136,7 +136,8 @@ class DBHandler: print("Dropping {} database".format(db_name)) self.client.drop_database(db_name) - def backup_to_dump(self, db_name, dump_dir, overwrite=False): + def backup_to_dump(self, db_name, dump_dir, overwrite=False, + collection=None): """ Helper method for running mongodump for specific 'db_name' """ @@ -148,7 +149,8 @@ class DBHandler: raise RuntimeError("Backup already exists, " "run with overwrite=True") - query = self._dump_query(self.uri, dump_dir, db_name=db_name) + query = self._dump_query(self.uri, dump_dir, + db_name=db_name, collection=collection) print("Mongodump query:: {}".format(query)) subprocess.run(query) @@ -187,7 +189,8 @@ class DBHandler: drop_part = "--drop" if db_name_out: - db_part += " --nsTo={}.*".format(db_name_out) + collection_str = collection or '*' + db_part += " --nsTo={}.{}".format(db_name_out, collection_str) query = "\"{}\" --uri=\"{}\" --dir=\"{}\" {} {} {}".format( "mongorestore", uri, dump_dir, db_part, coll_part, drop_part @@ -217,12 +220,12 @@ class DBHandler: return query -# handler = DBHandler(uri="mongodb://localhost:27017") +#handler = DBHandler(uri="mongodb://localhost:27017") # -# backup_dir = "c:\\projects\\dumps" +#backup_dir = "c:\\projects\\test_nuke_publish\\input\\dumps" # # -# handler.backup_to_dump("openpype", backup_dir, True) -# # handler.setup_from_dump("test_db", backup_dir, True) +#handler.backup_to_dump("avalon", backup_dir, True, collection="test_project") +#handler.setup_from_dump("test_db", backup_dir, True, db_name_out="avalon", collection="test_project") # # handler.setup_from_sql_file("test_db", "c:\\projects\\sql\\item.sql", # # collection="test_project", # # drop=False, mode="upsert") From 3fa0b39df196524ad4dd8b013e90ebe02a59e1b6 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 30 Nov 2021 14:40:01 +0100 Subject: [PATCH 035/341] OP-2042 - wip testing in Nuke --- .../hosts/nuke/test_publish_in_nuke.py | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 tests/integration/hosts/nuke/test_publish_in_nuke.py diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py new file mode 100644 index 0000000000..3f3f191ac7 --- /dev/null +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -0,0 +1,94 @@ +import pytest +import os +import shutil + +from tests.lib.testing_classes import PublishTest + + +class TestPublishInNuke(PublishTest): + """Basic test case for publishing in Nuke + + Uses generic TestCase to prepare fixtures for test data, testing DBs, + env vars. + + Opens Maya, run publish on prepared workile. + + Then checks content of DB (if subset, version, representations were + created. + Checks tmp folder if all expected files were published. + + """ + PERSIST = True + + TEST_FILES = [ + ("1Bciy2pCwMKl1UIpxuPnlX_LHMo_Xkq0K", "test_Nuke_publish.zip", "") + ] + + APP = "Nuke" + APP_VARIANT = "12" + + APP_NAME = "{}/{}".format(APP, APP_VARIANT) + + TIMEOUT = 120 # publish timeout + + @pytest.fixture(scope="module") + def last_workfile_path(self, download_test_data): + """Get last_workfile_path from source data. + + Maya expects workfile in proper folder, so copy is done first. + """ + src_path = os.path.join(download_test_data, + "input", + "workfile", + "test_project_test_asset_TestTask_v001.psd") + dest_folder = os.path.join(download_test_data, + self.PROJECT, + self.ASSET, + "work", + self.TASK) + os.makedirs(dest_folder) + dest_path = os.path.join(dest_folder, + "test_project_test_asset_TestTask_v001.psd") + shutil.copy(src_path, dest_path) + + yield dest_path + + @pytest.fixture(scope="module") + def startup_scripts(self, monkeypatch_session, download_test_data): + """Points Maya to userSetup file from input data""" + pass + + def test_db_asserts(self, dbcon, publish_finished): + """Host and input data dependent expected results in DB.""" + print("test_db_asserts") + assert 5 == dbcon.count_documents({"type": "version"}), \ + "Not expected no of versions" + + assert 0 == dbcon.count_documents({"type": "version", + "name": {"$ne": 1}}), \ + "Only versions with 1 expected" + + assert 1 == dbcon.count_documents({"type": "subset", + "name": "modelMain"}), \ + "modelMain subset must be present" + + assert 1 == dbcon.count_documents({"type": "subset", + "name": "workfileTest_task"}), \ + "workfileTest_task subset must be present" + + assert 11 == dbcon.count_documents({"type": "representation"}), \ + "Not expected no of representations" + + assert 2 == dbcon.count_documents({"type": "representation", + "context.subset": "modelMain", + "context.ext": "abc"}), \ + "Not expected no of representations with ext 'abc'" + + assert 2 == dbcon.count_documents({"type": "representation", + "context.subset": "modelMain", + "context.ext": "ma"}), \ + "Not expected no of representations with ext 'abc'" + + +if __name__ == "__main__": + test_case = TestPublishInNuke() From 9576b823ca4bd3f4573fa14c652eb421a15747bd Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Wed, 1 Dec 2021 11:29:12 +0100 Subject: [PATCH 036/341] fix hda creation on single object --- .../houdini/plugins/create/create_hda.py | 28 ++++++++----------- repos/avalon-core | 2 +- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/openpype/hosts/houdini/plugins/create/create_hda.py b/openpype/hosts/houdini/plugins/create/create_hda.py index 2af1e4a257..96b2cfe6fc 100644 --- a/openpype/hosts/houdini/plugins/create/create_hda.py +++ b/openpype/hosts/houdini/plugins/create/create_hda.py @@ -45,19 +45,14 @@ class CreateHDA(plugin.Creator): if (self.options or {}).get("useSelection") and self.nodes: # if we have `use selection` enabled and we have some # selected nodes ... - to_hda = self.nodes[0] - if len(self.nodes) > 1: - # if there is more then one node, create subnet first - subnet = out.createNode( - "subnet", node_name="{}_subnet".format(self.name)) - to_hda = subnet - else: - # in case of no selection, just create subnet node - subnet = out.createNode( - "subnet", node_name="{}_subnet".format(self.name)) + subnet = out.collapseIntoSubnet( + self.nodes, + subnet_name="{}_subnet".format(self.name)) subnet.moveToGoodPosition() to_hda = subnet - + else: + to_hda = out.createNode( + "subnet", node_name="{}_subnet".format(self.name)) if not to_hda.type().definition(): # if node type has not its definition, it is not user # created hda. We test if hda can be created from the node. @@ -69,13 +64,14 @@ class CreateHDA(plugin.Creator): name=subset_name, hda_file_name="$HIP/{}.hda".format(subset_name) ) - hou.moveNodesTo(self.nodes, hda_node) + # print("move to hda: {}".format(to_hda)) + # hou.moveNodesTo([to_hda], hda_node) hda_node.layoutChildren() + elif self._check_existing(subset_name): + raise plugin.OpenPypeCreatorError( + ("subset {} is already published with different HDA" + "definition.").format(subset_name)) else: - if self._check_existing(subset_name): - raise plugin.OpenPypeCreatorError( - ("subset {} is already published with different HDA" - "definition.").format(subset_name)) hda_node = to_hda hda_node.setName(subset_name) diff --git a/repos/avalon-core b/repos/avalon-core index 7e5efd6885..9499f6517a 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit 7e5efd6885330d84bb8495975bcab84df49bfa3d +Subproject commit 9499f6517a1ff2d3bf94c5d34c0aece146734760 From 6d309c0a28c58e629ab2064cbe6792c07949a5f2 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Wed, 1 Dec 2021 11:29:46 +0100 Subject: [PATCH 037/341] remove debug prints --- openpype/hosts/houdini/plugins/create/create_hda.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/openpype/hosts/houdini/plugins/create/create_hda.py b/openpype/hosts/houdini/plugins/create/create_hda.py index 96b2cfe6fc..afb0797e04 100644 --- a/openpype/hosts/houdini/plugins/create/create_hda.py +++ b/openpype/hosts/houdini/plugins/create/create_hda.py @@ -64,8 +64,6 @@ class CreateHDA(plugin.Creator): name=subset_name, hda_file_name="$HIP/{}.hda".format(subset_name) ) - # print("move to hda: {}".format(to_hda)) - # hou.moveNodesTo([to_hda], hda_node) hda_node.layoutChildren() elif self._check_existing(subset_name): raise plugin.OpenPypeCreatorError( From edefd8bff197bc6d30bf43040d729af10cb649f3 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Wed, 1 Dec 2021 11:32:35 +0100 Subject: [PATCH 038/341] =?UTF-8?q?fix=20hound=20=F0=9F=90=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openpype/hosts/houdini/plugins/create/create_hda.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/houdini/plugins/create/create_hda.py b/openpype/hosts/houdini/plugins/create/create_hda.py index afb0797e04..459da8bfdf 100644 --- a/openpype/hosts/houdini/plugins/create/create_hda.py +++ b/openpype/hosts/houdini/plugins/create/create_hda.py @@ -52,7 +52,7 @@ class CreateHDA(plugin.Creator): to_hda = subnet else: to_hda = out.createNode( - "subnet", node_name="{}_subnet".format(self.name)) + "subnet", node_name="{}_subnet".format(self.name)) if not to_hda.type().definition(): # if node type has not its definition, it is not user # created hda. We test if hda can be created from the node. From 64c4e5f2bbae767e6f2e126c884853a1fab39eaf Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Wed, 1 Dec 2021 16:42:18 +0100 Subject: [PATCH 039/341] Add static and allView option in imagePlaneLoader --- .../maya/plugins/load/load_image_plane.py | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_image_plane.py b/openpype/hosts/maya/plugins/load/load_image_plane.py index f2640dc2eb..f7a5a7ea18 100644 --- a/openpype/hosts/maya/plugins/load/load_image_plane.py +++ b/openpype/hosts/maya/plugins/load/load_image_plane.py @@ -13,10 +13,14 @@ class CameraWindow(QtWidgets.QDialog): self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint) self.camera = None + self.static_image_plane = False + self.show_in_all_views = False self.widgets = { "label": QtWidgets.QLabel("Select camera for image plane."), "list": QtWidgets.QListWidget(), + "staticImagePlane": QtWidgets.QCheckBox(), + "showInAllViews": QtWidgets.QCheckBox(), "warning": QtWidgets.QLabel("No cameras selected!"), "buttons": QtWidgets.QWidget(), "okButton": QtWidgets.QPushButton("Ok"), @@ -31,6 +35,9 @@ class CameraWindow(QtWidgets.QDialog): for camera in cameras: self.widgets["list"].addItem(camera) + self.widgets["staticImagePlane"].setText("Make Image Plane Static") + self.widgets["showInAllViews"].setText("Show Image Plane in All Views") + # Build buttons. layout = QtWidgets.QHBoxLayout(self.widgets["buttons"]) layout.addWidget(self.widgets["okButton"]) @@ -40,6 +47,8 @@ class CameraWindow(QtWidgets.QDialog): layout = QtWidgets.QVBoxLayout(self) layout.addWidget(self.widgets["label"]) layout.addWidget(self.widgets["list"]) + layout.addWidget(self.widgets["staticImagePlane"]) + layout.addWidget(self.widgets["showInAllViews"]) layout.addWidget(self.widgets["buttons"]) layout.addWidget(self.widgets["warning"]) @@ -54,6 +63,8 @@ class CameraWindow(QtWidgets.QDialog): if self.camera is None: self.widgets["warning"].setVisible(True) return + self.show_in_all_views = self.widgets["showInAllViews"].isChecked() + self.static_image_plane = self.widgets["staticImagePlane"].isChecked() self.close() @@ -65,15 +76,15 @@ class CameraWindow(QtWidgets.QDialog): class ImagePlaneLoader(api.Loader): """Specific loader of plate for image planes on selected camera.""" - families = ["plate", "render"] + families = ["image", "plate", "render"] label = "Load imagePlane." representations = ["mov", "exr", "preview", "png"] icon = "image" color = "orange" - def load(self, context, name, namespace, data): + def load(self, context, name, namespace, data, option=None): import pymel.core as pm - + new_nodes = [] image_plane_depth = 1000 asset = context['asset']['name'] @@ -85,18 +96,16 @@ class ImagePlaneLoader(api.Loader): # Get camera from user selection. camera = None - default_cameras = [ - "frontShape", "perspShape", "sideShape", "topShape" - ] - cameras = [ - x for x in pm.ls(type="camera") if x.name() not in default_cameras - ] + cameras = pm.ls(type="camera") camera_names = {x.getParent().name(): x for x in cameras} camera_names["Create new camera."] = "create_camera" window = CameraWindow(camera_names.keys()) window.exec_() camera = camera_names[window.camera] + is_static_image_plane = window.static_image_plane + is_in_all_views = window.show_in_all_views + if camera == "create_camera": camera = pm.createNode("camera") @@ -111,7 +120,7 @@ class ImagePlaneLoader(api.Loader): # Create image plane image_plane_transform, image_plane_shape = pm.imagePlane( - camera=camera, showInAllViews=False + camera=camera, showInAllViews=is_in_all_views ) image_plane_shape.depth.set(image_plane_depth) @@ -119,6 +128,9 @@ class ImagePlaneLoader(api.Loader): context["representation"]["data"]["path"] ) + if is_static_image_plane: + image_plane_shape.detach() + start_frame = pm.playbackOptions(q=True, min=True) end_frame = pm.playbackOptions(q=True, max=True) From d48fdaeceb3af83131b009c748145a6678367f60 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 1 Dec 2021 18:29:56 +0100 Subject: [PATCH 040/341] Fix - missing extension for new workfile --- openpype/hooks/pre_foundry_apps.py | 2 +- repos/avalon-core | 2 +- .../hosts/nuke/test_publish_in_nuke.py | 41 ++++++++++++++----- tests/lib/db_handler.py | 8 ++-- 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/openpype/hooks/pre_foundry_apps.py b/openpype/hooks/pre_foundry_apps.py index 85f68c6b60..70554cbedb 100644 --- a/openpype/hooks/pre_foundry_apps.py +++ b/openpype/hooks/pre_foundry_apps.py @@ -13,7 +13,7 @@ class LaunchFoundryAppsWindows(PreLaunchHook): # Should be as last hook because must change launch arguments to string order = 1000 - app_groups = ["nuke", "nukex", "hiero", "nukestudio"] + app_groups = ["nuke", "nukex", "hiero", "nukestudio", "aftereffects"] platforms = ["windows"] def execute(self): diff --git a/repos/avalon-core b/repos/avalon-core index 7e5efd6885..e37f4f92ed 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit 7e5efd6885330d84bb8495975bcab84df49bfa3d +Subproject commit e37f4f92ed25f89c870fdcb7f9538da7d0d7de90 diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py index 3f3f191ac7..abadb0fb92 100644 --- a/tests/integration/hosts/nuke/test_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -1,9 +1,12 @@ import pytest import os import shutil +import logging from tests.lib.testing_classes import PublishTest +log = logging.getLogger("test_publish_in_nuke") + class TestPublishInNuke(PublishTest): """Basic test case for publishing in Nuke @@ -21,11 +24,11 @@ class TestPublishInNuke(PublishTest): PERSIST = True TEST_FILES = [ - ("1Bciy2pCwMKl1UIpxuPnlX_LHMo_Xkq0K", "test_Nuke_publish.zip", "") + ("1635L4gww9nEkP-1EclfWXNdeDuRjDhey", "test_Nuke_publish.zip", "") ] - APP = "Nuke" - APP_VARIANT = "12" + APP = "nuke" + APP_VARIANT = "12-2" APP_NAME = "{}/{}".format(APP, APP_VARIANT) @@ -37,26 +40,42 @@ class TestPublishInNuke(PublishTest): Maya expects workfile in proper folder, so copy is done first. """ - src_path = os.path.join(download_test_data, - "input", - "workfile", - "test_project_test_asset_TestTask_v001.psd") + print("last_workfile_path") + log.info("log last_workfile_path") + src_path = os.path.join( + download_test_data, + "input", + "workfile", + "test_project_test_asset_CompositingInNuke_v001.nk") dest_folder = os.path.join(download_test_data, self.PROJECT, self.ASSET, "work", self.TASK) os.makedirs(dest_folder) - dest_path = os.path.join(dest_folder, - "test_project_test_asset_TestTask_v001.psd") + dest_path = os.path.join( + dest_folder, "test_project_test_asset_CompositingInNuke_v001.nk") shutil.copy(src_path, dest_path) yield dest_path @pytest.fixture(scope="module") def startup_scripts(self, monkeypatch_session, download_test_data): - """Points Maya to userSetup file from input data""" - pass + """Points Nuke to userSetup file from input data""" + print("startup_scripts") + log.info("log startup_scripts") + startup_path = os.path.join(download_test_data, + "input", + "startup") + startup_path = "C:\\projects\\test_nuke_publish\\input\\startup" + original_pythonpath = os.environ.get("NUKE_PATH") + monkeypatch_session.setenv("NUKE_PATH", + "{}{}{}".format(original_pythonpath, + os.pathsep, + startup_path)) + print("NUKE_PATH:: {}{}{}".format(startup_path, + os.pathsep, + original_pythonpath)) def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" diff --git a/tests/lib/db_handler.py b/tests/lib/db_handler.py index 4dde5ba46e..88cde4d05f 100644 --- a/tests/lib/db_handler.py +++ b/tests/lib/db_handler.py @@ -165,7 +165,7 @@ class DBHandler: if collection: if not db_name: raise ValueError("db_name must be present") - coll_part = "--nsInclude={}.{}".format(db_name, collection) + coll_part = "--collection={}".format(collection) query = "\"{}\" --uri=\"{}\" --out={} {} {}".format( "mongodump", uri, output_path, db_part, coll_part ) @@ -220,11 +220,11 @@ class DBHandler: return query -#handler = DBHandler(uri="mongodb://localhost:27017") +handler = DBHandler(uri="mongodb://localhost:27017") # -#backup_dir = "c:\\projects\\test_nuke_publish\\input\\dumps" +backup_dir = "c:\\projects\\test_nuke_publish\\input\\dumps" # # -#handler.backup_to_dump("avalon", backup_dir, True, collection="test_project") +handler.backup_to_dump("avalon", backup_dir, True, collection="test_project") #handler.setup_from_dump("test_db", backup_dir, True, db_name_out="avalon", collection="test_project") # # handler.setup_from_sql_file("test_db", "c:\\projects\\sql\\item.sql", # # collection="test_project", From 3d6bf6e8c5eb5e8774a231fa6ff77e1422cf26af Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Wed, 1 Dec 2021 18:56:38 +0100 Subject: [PATCH 041/341] change option by options --- openpype/hosts/maya/plugins/load/load_image_plane.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/load/load_image_plane.py b/openpype/hosts/maya/plugins/load/load_image_plane.py index f7a5a7ea18..d7e61b9c64 100644 --- a/openpype/hosts/maya/plugins/load/load_image_plane.py +++ b/openpype/hosts/maya/plugins/load/load_image_plane.py @@ -82,7 +82,7 @@ class ImagePlaneLoader(api.Loader): icon = "image" color = "orange" - def load(self, context, name, namespace, data, option=None): + def load(self, context, name, namespace, data, options=None): import pymel.core as pm new_nodes = [] From f91045d497f0a2a509feb3afdc04fec60027ae31 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 2 Dec 2021 11:33:07 +0100 Subject: [PATCH 042/341] small fixes --- openpype/hosts/tvpaint/api/launch_script.py | 2 +- openpype/hosts/tvpaint/api/lib.py | 4 ---- openpype/hosts/tvpaint/api/pipeline.py | 17 ++++++++++------- .../plugins/publish/collect_instances.py | 2 +- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/openpype/hosts/tvpaint/api/launch_script.py b/openpype/hosts/tvpaint/api/launch_script.py index ec34442d28..e66bf61df6 100644 --- a/openpype/hosts/tvpaint/api/launch_script.py +++ b/openpype/hosts/tvpaint/api/launch_script.py @@ -35,7 +35,7 @@ def main(launch_args): # Create Communicator object and trigger launch # - this must be done before anything is processed - communicator = CommunicationWrapper.create_communicator(qt_app) + communicator = CommunicationWrapper.create_qt_communicator(qt_app) communicator.launch(launch_args) def process_in_main_thread(): diff --git a/openpype/hosts/tvpaint/api/lib.py b/openpype/hosts/tvpaint/api/lib.py index e41bbb5aad..654aff19d8 100644 --- a/openpype/hosts/tvpaint/api/lib.py +++ b/openpype/hosts/tvpaint/api/lib.py @@ -5,10 +5,6 @@ import tempfile import avalon.io from . import CommunicationWrapper -from .pipeline import ( - list_instances, - write_instances -) log = logging.getLogger(__name__) diff --git a/openpype/hosts/tvpaint/api/pipeline.py b/openpype/hosts/tvpaint/api/pipeline.py index 235d5525f4..e7c5159bbc 100644 --- a/openpype/hosts/tvpaint/api/pipeline.py +++ b/openpype/hosts/tvpaint/api/pipeline.py @@ -15,7 +15,10 @@ from avalon.pipeline import AVALON_CONTAINER_ID from openpype.hosts import tvpaint from openpype.api import get_current_project_settings -from .communication_server import CommunicationWrapper +from .lib import ( + execute_george, + execute_george_through_file +) log = logging.getLogger(__name__) @@ -214,7 +217,7 @@ def get_workfile_metadata_string_for_keys(metadata_keys): # Execute the script george_script = "\n".join(george_script_parts) - CommunicationWrapper.execute_george_through_file(george_script) + execute_george_through_file(george_script) # Load data from temp file with open(output_filepath, "r") as stream: @@ -329,7 +332,7 @@ def write_workfile_metadata(metadata_key, value): george_script = "\n".join(george_script_parts) - return CommunicationWrapper.execute_george_through_file(george_script) + return execute_george_through_file(george_script) def get_current_workfile_context(): @@ -443,7 +446,7 @@ def set_context_settings(asset_doc=None): framerate = project_doc["data"].get("fps") if framerate is not None: - CommunicationWrapper.execute_george( + execute_george( "tv_framerate {} \"timestretch\"".format(framerate) ) else: @@ -461,7 +464,7 @@ def set_context_settings(asset_doc=None): if width is None or height is None: print("Resolution was not found!") else: - CommunicationWrapper.execute_george( + execute_george( "tv_resizepage {} {} 0".format(width, height) ) @@ -484,5 +487,5 @@ def set_context_settings(asset_doc=None): mark_in = 0 mark_out = mark_in + (frame_end - frame_start) + handle_start + handle_end - CommunicationWrapper.execute_george("tv_markin {} set".format(mark_in)) - CommunicationWrapper.execute_george("tv_markout {} set".format(mark_out)) + execute_george("tv_markin {} set".format(mark_in)) + execute_george("tv_markout {} set".format(mark_out)) diff --git a/openpype/hosts/tvpaint/plugins/publish/collect_instances.py b/openpype/hosts/tvpaint/plugins/publish/collect_instances.py index 1d7a48e389..31d2fd1fd5 100644 --- a/openpype/hosts/tvpaint/plugins/publish/collect_instances.py +++ b/openpype/hosts/tvpaint/plugins/publish/collect_instances.py @@ -218,7 +218,7 @@ class CollectInstances(pyblish.api.ContextPlugin): # - not 100% working as it was found out that layer ids can't be # used as unified identifier across multiple workstations layers_by_id = { - layer["id"]: layer + layer["layer_id"]: layer for layer in layers_data } layer_ids = instance_data["layer_ids"] From e0096b8c6b866337b01800e168a8f636201f54f0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 2 Dec 2021 11:50:18 +0100 Subject: [PATCH 043/341] removed unused loc file --- openpype/hosts/tvpaint/resources/avalon.loc | 37 --------------------- 1 file changed, 37 deletions(-) delete mode 100644 openpype/hosts/tvpaint/resources/avalon.loc diff --git a/openpype/hosts/tvpaint/resources/avalon.loc b/openpype/hosts/tvpaint/resources/avalon.loc deleted file mode 100644 index 3cfb7e9db4..0000000000 --- a/openpype/hosts/tvpaint/resources/avalon.loc +++ /dev/null @@ -1,37 +0,0 @@ -#------------------------------------------------- -#------------ AVALON PLUGIN LOC FILE ------------- -#------------------------------------------------- - -#Language : English -#Version : 1.0 -#Date : 27/10/2020 - -#------------------------------------------------- -#------------ COMMON ----------------------------- -#------------------------------------------------- - -$100 "OpenPype Tools" - -$10010 "Workfiles" -$10020 "Load" -$10030 "Create" -$10040 "Scene inventory" -$10050 "Publish" -$10060 "Library" - -#------------ Help ------------------------------- - -$20010 "Open workfiles tool" -$20020 "Open loader tool" -$20030 "Open creator tool" -$20040 "Open scene inventory tool" -$20050 "Open publisher" -$20060 "Open library loader tool" - -#------------ Errors ----------------------------- - -$30001 "Can't Open Requester !" - -#------------------------------------------------- -#------------ END -------------------------------- -#------------------------------------------------- From 3c7b622b6e3bf56deb28b12138f980b73a4ef6d6 Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Thu, 2 Dec 2021 11:53:32 +0100 Subject: [PATCH 044/341] fix rotation after detach --- .../maya/plugins/load/load_image_plane.py | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_image_plane.py b/openpype/hosts/maya/plugins/load/load_image_plane.py index d7e61b9c64..ecfa8d7bc0 100644 --- a/openpype/hosts/maya/plugins/load/load_image_plane.py +++ b/openpype/hosts/maya/plugins/load/load_image_plane.py @@ -96,15 +96,23 @@ class ImagePlaneLoader(api.Loader): # Get camera from user selection. camera = None - cameras = pm.ls(type="camera") - camera_names = {x.getParent().name(): x for x in cameras} - camera_names["Create new camera."] = "create_camera" - window = CameraWindow(camera_names.keys()) - window.exec_() - camera = camera_names[window.camera] + is_static_image_plane = None + is_in_all_views = None + if data: + camera = pm.PyNode(data.get("camera")) + is_static_image_plane = data.get("static_image_plane") + is_in_all_views = data.get("in_all_views") - is_static_image_plane = window.static_image_plane - is_in_all_views = window.show_in_all_views + if not camera: + cameras = pm.ls(type="camera") + camera_names = {x.getParent().name(): x for x in cameras} + camera_names["Create new camera."] = "create_camera" + window = CameraWindow(camera_names.keys()) + window.exec_() + camera = camera_names[window.camera] + + is_static_image_plane = window.static_image_plane + is_in_all_views = window.show_in_all_views if camera == "create_camera": camera = pm.createNode("camera") @@ -129,7 +137,9 @@ class ImagePlaneLoader(api.Loader): ) if is_static_image_plane: + image_plane_shape.setMaintainRatio(True) image_plane_shape.detach() + image_plane_transform.setRotation(camera.getRotation()) start_frame = pm.playbackOptions(q=True, min=True) end_frame = pm.playbackOptions(q=True, max=True) From 931896519c05a423f4630001372bdb72d47da847 Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Thu, 2 Dec 2021 12:34:34 +0100 Subject: [PATCH 045/341] add fileName in imagePlane cmd --- openpype/hosts/maya/plugins/load/load_image_plane.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_image_plane.py b/openpype/hosts/maya/plugins/load/load_image_plane.py index ecfa8d7bc0..eea5844e8b 100644 --- a/openpype/hosts/maya/plugins/load/load_image_plane.py +++ b/openpype/hosts/maya/plugins/load/load_image_plane.py @@ -128,16 +128,12 @@ class ImagePlaneLoader(api.Loader): # Create image plane image_plane_transform, image_plane_shape = pm.imagePlane( + fileName=context["representation"]["data"]["path"], camera=camera, showInAllViews=is_in_all_views ) image_plane_shape.depth.set(image_plane_depth) - image_plane_shape.imageName.set( - context["representation"]["data"]["path"] - ) - if is_static_image_plane: - image_plane_shape.setMaintainRatio(True) image_plane_shape.detach() image_plane_transform.setRotation(camera.getRotation()) From d27b11774888d1af6dac39c25384bca25c900413 Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Thu, 2 Dec 2021 13:52:59 +0100 Subject: [PATCH 046/341] remove context key task from doc --- website/docs/admin_settings_project_anatomy.md | 1 - 1 file changed, 1 deletion(-) diff --git a/website/docs/admin_settings_project_anatomy.md b/website/docs/admin_settings_project_anatomy.md index a8be77d25b..1f742c31ed 100644 --- a/website/docs/admin_settings_project_anatomy.md +++ b/website/docs/admin_settings_project_anatomy.md @@ -61,7 +61,6 @@ We have a few required anatomy templates for OpenPype to work properly, however | `task[type]` | Type of task | | `task[short]` | Shortname of task | | `parent` | Name of hierarchical parent | -| `task` | Name of task | | `version` | Version number | | `subset` | Subset name | | `family` | Main family name | From 991328c516a16c206bf5abacc58738a95aba9b11 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 2 Dec 2021 16:29:26 +0100 Subject: [PATCH 047/341] moved clockify module --- openpype/modules/base.py | 1 + openpype/modules/{default_modules => }/clockify/__init__.py | 0 openpype/modules/{default_modules => }/clockify/clockify_api.py | 0 .../modules/{default_modules => }/clockify/clockify_module.py | 0 openpype/modules/{default_modules => }/clockify/constants.py | 0 .../clockify/ftrack/server/action_clockify_sync_server.py | 0 .../clockify/ftrack/user/action_clockify_sync_local.py | 0 .../clockify/launcher_actions/ClockifyStart.py | 0 .../clockify/launcher_actions/ClockifySync.py | 0 openpype/modules/{default_modules => }/clockify/widgets.py | 0 10 files changed, 1 insertion(+) rename openpype/modules/{default_modules => }/clockify/__init__.py (100%) rename openpype/modules/{default_modules => }/clockify/clockify_api.py (100%) rename openpype/modules/{default_modules => }/clockify/clockify_module.py (100%) rename openpype/modules/{default_modules => }/clockify/constants.py (100%) rename openpype/modules/{default_modules => }/clockify/ftrack/server/action_clockify_sync_server.py (100%) rename openpype/modules/{default_modules => }/clockify/ftrack/user/action_clockify_sync_local.py (100%) rename openpype/modules/{default_modules => }/clockify/launcher_actions/ClockifyStart.py (100%) rename openpype/modules/{default_modules => }/clockify/launcher_actions/ClockifySync.py (100%) rename openpype/modules/{default_modules => }/clockify/widgets.py (100%) diff --git a/openpype/modules/base.py b/openpype/modules/base.py index 7ecfeae7bd..fdca9e90be 100644 --- a/openpype/modules/base.py +++ b/openpype/modules/base.py @@ -273,6 +273,7 @@ def _load_modules(): # Import default modules imported from 'openpype.modules' for default_module_name in ( + "clockify", "settings_action", "launcher_action", "project_manager_action", diff --git a/openpype/modules/default_modules/clockify/__init__.py b/openpype/modules/clockify/__init__.py similarity index 100% rename from openpype/modules/default_modules/clockify/__init__.py rename to openpype/modules/clockify/__init__.py diff --git a/openpype/modules/default_modules/clockify/clockify_api.py b/openpype/modules/clockify/clockify_api.py similarity index 100% rename from openpype/modules/default_modules/clockify/clockify_api.py rename to openpype/modules/clockify/clockify_api.py diff --git a/openpype/modules/default_modules/clockify/clockify_module.py b/openpype/modules/clockify/clockify_module.py similarity index 100% rename from openpype/modules/default_modules/clockify/clockify_module.py rename to openpype/modules/clockify/clockify_module.py diff --git a/openpype/modules/default_modules/clockify/constants.py b/openpype/modules/clockify/constants.py similarity index 100% rename from openpype/modules/default_modules/clockify/constants.py rename to openpype/modules/clockify/constants.py diff --git a/openpype/modules/default_modules/clockify/ftrack/server/action_clockify_sync_server.py b/openpype/modules/clockify/ftrack/server/action_clockify_sync_server.py similarity index 100% rename from openpype/modules/default_modules/clockify/ftrack/server/action_clockify_sync_server.py rename to openpype/modules/clockify/ftrack/server/action_clockify_sync_server.py diff --git a/openpype/modules/default_modules/clockify/ftrack/user/action_clockify_sync_local.py b/openpype/modules/clockify/ftrack/user/action_clockify_sync_local.py similarity index 100% rename from openpype/modules/default_modules/clockify/ftrack/user/action_clockify_sync_local.py rename to openpype/modules/clockify/ftrack/user/action_clockify_sync_local.py diff --git a/openpype/modules/default_modules/clockify/launcher_actions/ClockifyStart.py b/openpype/modules/clockify/launcher_actions/ClockifyStart.py similarity index 100% rename from openpype/modules/default_modules/clockify/launcher_actions/ClockifyStart.py rename to openpype/modules/clockify/launcher_actions/ClockifyStart.py diff --git a/openpype/modules/default_modules/clockify/launcher_actions/ClockifySync.py b/openpype/modules/clockify/launcher_actions/ClockifySync.py similarity index 100% rename from openpype/modules/default_modules/clockify/launcher_actions/ClockifySync.py rename to openpype/modules/clockify/launcher_actions/ClockifySync.py diff --git a/openpype/modules/default_modules/clockify/widgets.py b/openpype/modules/clockify/widgets.py similarity index 100% rename from openpype/modules/default_modules/clockify/widgets.py rename to openpype/modules/clockify/widgets.py From 568726d30f25805190e26cdbb874180ac5117601 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 2 Dec 2021 16:29:53 +0100 Subject: [PATCH 048/341] moved log viewer module --- openpype/modules/base.py | 1 + openpype/modules/{default_modules => }/log_viewer/__init__.py | 0 .../modules/{default_modules => }/log_viewer/log_view_module.py | 0 .../modules/{default_modules => }/log_viewer/tray/__init__.py | 0 openpype/modules/{default_modules => }/log_viewer/tray/app.py | 0 openpype/modules/{default_modules => }/log_viewer/tray/models.py | 0 .../modules/{default_modules => }/log_viewer/tray/widgets.py | 0 7 files changed, 1 insertion(+) rename openpype/modules/{default_modules => }/log_viewer/__init__.py (100%) rename openpype/modules/{default_modules => }/log_viewer/log_view_module.py (100%) rename openpype/modules/{default_modules => }/log_viewer/tray/__init__.py (100%) rename openpype/modules/{default_modules => }/log_viewer/tray/app.py (100%) rename openpype/modules/{default_modules => }/log_viewer/tray/models.py (100%) rename openpype/modules/{default_modules => }/log_viewer/tray/widgets.py (100%) diff --git a/openpype/modules/base.py b/openpype/modules/base.py index fdca9e90be..1dc9ccc718 100644 --- a/openpype/modules/base.py +++ b/openpype/modules/base.py @@ -273,6 +273,7 @@ def _load_modules(): # Import default modules imported from 'openpype.modules' for default_module_name in ( + "log_viewer", "clockify", "settings_action", "launcher_action", diff --git a/openpype/modules/default_modules/log_viewer/__init__.py b/openpype/modules/log_viewer/__init__.py similarity index 100% rename from openpype/modules/default_modules/log_viewer/__init__.py rename to openpype/modules/log_viewer/__init__.py diff --git a/openpype/modules/default_modules/log_viewer/log_view_module.py b/openpype/modules/log_viewer/log_view_module.py similarity index 100% rename from openpype/modules/default_modules/log_viewer/log_view_module.py rename to openpype/modules/log_viewer/log_view_module.py diff --git a/openpype/modules/default_modules/log_viewer/tray/__init__.py b/openpype/modules/log_viewer/tray/__init__.py similarity index 100% rename from openpype/modules/default_modules/log_viewer/tray/__init__.py rename to openpype/modules/log_viewer/tray/__init__.py diff --git a/openpype/modules/default_modules/log_viewer/tray/app.py b/openpype/modules/log_viewer/tray/app.py similarity index 100% rename from openpype/modules/default_modules/log_viewer/tray/app.py rename to openpype/modules/log_viewer/tray/app.py diff --git a/openpype/modules/default_modules/log_viewer/tray/models.py b/openpype/modules/log_viewer/tray/models.py similarity index 100% rename from openpype/modules/default_modules/log_viewer/tray/models.py rename to openpype/modules/log_viewer/tray/models.py diff --git a/openpype/modules/default_modules/log_viewer/tray/widgets.py b/openpype/modules/log_viewer/tray/widgets.py similarity index 100% rename from openpype/modules/default_modules/log_viewer/tray/widgets.py rename to openpype/modules/log_viewer/tray/widgets.py From 38bfece22befe69a5320f70ba3d01a1804630666 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 2 Dec 2021 16:30:21 +0100 Subject: [PATCH 049/341] moved muster module --- openpype/modules/base.py | 1 + openpype/modules/{default_modules => }/muster/__init__.py | 0 openpype/modules/{default_modules => }/muster/muster.py | 0 openpype/modules/{default_modules => }/muster/rest_api.py | 0 openpype/modules/{default_modules => }/muster/widget_login.py | 0 5 files changed, 1 insertion(+) rename openpype/modules/{default_modules => }/muster/__init__.py (100%) rename openpype/modules/{default_modules => }/muster/muster.py (100%) rename openpype/modules/{default_modules => }/muster/rest_api.py (100%) rename openpype/modules/{default_modules => }/muster/widget_login.py (100%) diff --git a/openpype/modules/base.py b/openpype/modules/base.py index 1dc9ccc718..2fa1967690 100644 --- a/openpype/modules/base.py +++ b/openpype/modules/base.py @@ -274,6 +274,7 @@ def _load_modules(): # Import default modules imported from 'openpype.modules' for default_module_name in ( "log_viewer", + "muster", "clockify", "settings_action", "launcher_action", diff --git a/openpype/modules/default_modules/muster/__init__.py b/openpype/modules/muster/__init__.py similarity index 100% rename from openpype/modules/default_modules/muster/__init__.py rename to openpype/modules/muster/__init__.py diff --git a/openpype/modules/default_modules/muster/muster.py b/openpype/modules/muster/muster.py similarity index 100% rename from openpype/modules/default_modules/muster/muster.py rename to openpype/modules/muster/muster.py diff --git a/openpype/modules/default_modules/muster/rest_api.py b/openpype/modules/muster/rest_api.py similarity index 100% rename from openpype/modules/default_modules/muster/rest_api.py rename to openpype/modules/muster/rest_api.py diff --git a/openpype/modules/default_modules/muster/widget_login.py b/openpype/modules/muster/widget_login.py similarity index 100% rename from openpype/modules/default_modules/muster/widget_login.py rename to openpype/modules/muster/widget_login.py From db31a6aea9f28d04c196979f1eaf6f9dc230543c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 2 Dec 2021 16:30:46 +0100 Subject: [PATCH 050/341] moved python console interpreted module --- openpype/modules/base.py | 1 + .../{default_modules => }/python_console_interpreter/__init__.py | 0 .../{default_modules => }/python_console_interpreter/module.py | 0 .../python_console_interpreter/window/__init__.py | 0 .../python_console_interpreter/window/widgets.py | 0 5 files changed, 1 insertion(+) rename openpype/modules/{default_modules => }/python_console_interpreter/__init__.py (100%) rename openpype/modules/{default_modules => }/python_console_interpreter/module.py (100%) rename openpype/modules/{default_modules => }/python_console_interpreter/window/__init__.py (100%) rename openpype/modules/{default_modules => }/python_console_interpreter/window/widgets.py (100%) diff --git a/openpype/modules/base.py b/openpype/modules/base.py index 2fa1967690..e03fa6c45b 100644 --- a/openpype/modules/base.py +++ b/openpype/modules/base.py @@ -273,6 +273,7 @@ def _load_modules(): # Import default modules imported from 'openpype.modules' for default_module_name in ( + "python_console_interpreter", "log_viewer", "muster", "clockify", diff --git a/openpype/modules/default_modules/python_console_interpreter/__init__.py b/openpype/modules/python_console_interpreter/__init__.py similarity index 100% rename from openpype/modules/default_modules/python_console_interpreter/__init__.py rename to openpype/modules/python_console_interpreter/__init__.py diff --git a/openpype/modules/default_modules/python_console_interpreter/module.py b/openpype/modules/python_console_interpreter/module.py similarity index 100% rename from openpype/modules/default_modules/python_console_interpreter/module.py rename to openpype/modules/python_console_interpreter/module.py diff --git a/openpype/modules/default_modules/python_console_interpreter/window/__init__.py b/openpype/modules/python_console_interpreter/window/__init__.py similarity index 100% rename from openpype/modules/default_modules/python_console_interpreter/window/__init__.py rename to openpype/modules/python_console_interpreter/window/__init__.py diff --git a/openpype/modules/default_modules/python_console_interpreter/window/widgets.py b/openpype/modules/python_console_interpreter/window/widgets.py similarity index 100% rename from openpype/modules/default_modules/python_console_interpreter/window/widgets.py rename to openpype/modules/python_console_interpreter/window/widgets.py From 615f9145e140c42940e352bb4b1d9f4ecce35559 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 2 Dec 2021 16:31:22 +0100 Subject: [PATCH 051/341] moved slack module --- openpype/modules/base.py | 1 + .../modules/{default_modules => }/slack/README.md | 0 .../modules/{default_modules => }/slack/__init__.py | 0 .../slack/launch_hooks/pre_python2_vendor.py | 0 .../{default_modules => }/slack/manifest.yml | 0 .../slack/plugins/publish/collect_slack_family.py | 0 .../slack/plugins/publish/integrate_slack_api.py | 0 .../python2_vendor/python-slack-sdk-1/.appveyor.yml | 0 .../python2_vendor/python-slack-sdk-1/.coveragerc | 0 .../slack/python2_vendor/python-slack-sdk-1/.flake8 | 0 .../python-slack-sdk-1/.github/contributing.md | 0 .../python-slack-sdk-1/.github/issue_template.md | 0 .../python-slack-sdk-1/.github/maintainers_guide.md | 0 .../.github/pull_request_template.md | 0 .../python2_vendor/python-slack-sdk-1/.gitignore | 0 .../python2_vendor/python-slack-sdk-1/.travis.yml | 0 .../slack/python2_vendor/python-slack-sdk-1/LICENSE | 0 .../python2_vendor/python-slack-sdk-1/MANIFEST.in | 0 .../python2_vendor/python-slack-sdk-1/README.rst | 0 .../python-slack-sdk-1/docs-src/.gitignore | 0 .../python-slack-sdk-1/docs-src/Makefile | 0 .../docs-src/_themes/slack/conf.py | 0 .../docs-src/_themes/slack/layout.html | 0 .../docs-src/_themes/slack/localtoc.html | 0 .../docs-src/_themes/slack/relations.html | 0 .../docs-src/_themes/slack/sidebar.html | 0 .../docs-src/_themes/slack/static/default.css_t | 0 .../docs-src/_themes/slack/static/docs.css_t | 0 .../docs-src/_themes/slack/static/pygments.css_t | 0 .../docs-src/_themes/slack/theme.conf | 0 .../python-slack-sdk-1/docs-src/about.rst | 0 .../python-slack-sdk-1/docs-src/auth.rst | 0 .../python-slack-sdk-1/docs-src/basic_usage.rst | 0 .../python-slack-sdk-1/docs-src/changelog.rst | 0 .../python-slack-sdk-1/docs-src/conf.py | 0 .../python-slack-sdk-1/docs-src/conversations.rst | 0 .../python-slack-sdk-1/docs-src/faq.rst | 0 .../python-slack-sdk-1/docs-src/index.rst | 0 .../python-slack-sdk-1/docs-src/make.bat | 0 .../python-slack-sdk-1/docs-src/metadata.rst | 0 .../docs-src/real_time_messaging.rst | 0 .../slack/python2_vendor/python-slack-sdk-1/docs.sh | 0 .../python-slack-sdk-1/docs/.buildinfo | 0 .../python-slack-sdk-1/docs/.nojekyll | 0 .../python-slack-sdk-1/docs/_static/ajax-loader.gif | Bin .../python-slack-sdk-1/docs/_static/basic.css | 0 .../python-slack-sdk-1/docs/_static/classic.css | 0 .../docs/_static/comment-bright.png | Bin .../docs/_static/comment-close.png | Bin .../python-slack-sdk-1/docs/_static/comment.png | Bin .../python-slack-sdk-1/docs/_static/default.css | 0 .../python-slack-sdk-1/docs/_static/docs.css | 0 .../python-slack-sdk-1/docs/_static/doctools.js | 0 .../docs/_static/documentation_options.js | 0 .../docs/_static/down-pressed.png | Bin .../python-slack-sdk-1/docs/_static/down.png | Bin .../python-slack-sdk-1/docs/_static/file.png | Bin .../python-slack-sdk-1/docs/_static/jquery-3.2.1.js | 0 .../python-slack-sdk-1/docs/_static/jquery.js | 0 .../docs/_static/language_data.js | 0 .../python-slack-sdk-1/docs/_static/minus.png | Bin .../python-slack-sdk-1/docs/_static/plus.png | Bin .../python-slack-sdk-1/docs/_static/pygments.css | 0 .../python-slack-sdk-1/docs/_static/searchtools.js | 0 .../python-slack-sdk-1/docs/_static/sidebar.js | 0 .../docs/_static/underscore-1.3.1.js | 0 .../python-slack-sdk-1/docs/_static/underscore.js | 0 .../python-slack-sdk-1/docs/_static/up-pressed.png | Bin .../python-slack-sdk-1/docs/_static/up.png | Bin .../python-slack-sdk-1/docs/_static/websupport.js | 0 .../python-slack-sdk-1/docs/about.html | 0 .../python-slack-sdk-1/docs/auth.html | 0 .../python-slack-sdk-1/docs/basic_usage.html | 0 .../python-slack-sdk-1/docs/changelog.html | 0 .../python-slack-sdk-1/docs/conversations.html | 0 .../python2_vendor/python-slack-sdk-1/docs/faq.html | 0 .../python-slack-sdk-1/docs/genindex.html | 0 .../python-slack-sdk-1/docs/index.html | 0 .../python-slack-sdk-1/docs/metadata.html | 0 .../python-slack-sdk-1/docs/objects.inv | 0 .../docs/real_time_messaging.html | 0 .../python-slack-sdk-1/docs/search.html | 0 .../python-slack-sdk-1/docs/searchindex.js | 0 .../python-slack-sdk-1/requirements.txt | 0 .../python2_vendor/python-slack-sdk-1/setup.cfg | 0 .../python2_vendor/python-slack-sdk-1/setup.py | 0 .../python-slack-sdk-1/slackclient/__init__.py | 0 .../python-slack-sdk-1/slackclient/channel.py | 0 .../python-slack-sdk-1/slackclient/client.py | 0 .../python-slack-sdk-1/slackclient/exceptions.py | 0 .../python-slack-sdk-1/slackclient/im.py | 0 .../python-slack-sdk-1/slackclient/server.py | 0 .../python-slack-sdk-1/slackclient/slackrequest.py | 0 .../python-slack-sdk-1/slackclient/user.py | 0 .../python-slack-sdk-1/slackclient/util.py | 0 .../python-slack-sdk-1/slackclient/version.py | 0 .../python-slack-sdk-1/test_requirements.txt | 0 .../python-slack-sdk-1/tests/conftest.py | 0 .../tests/data/channel.created.json | 0 .../python-slack-sdk-1/tests/data/im.created.json | 0 .../python-slack-sdk-1/tests/data/rtm.start.json | 0 .../python-slack-sdk-1/tests/data/slack_logo.png | Bin .../python-slack-sdk-1/tests/test_channel.py | 0 .../python-slack-sdk-1/tests/test_server.py | 0 .../python-slack-sdk-1/tests/test_slackclient.py | 0 .../python-slack-sdk-1/tests/test_slackrequest.py | 0 .../slack/python2_vendor/python-slack-sdk-1/tox.ini | 0 .../{default_modules => }/slack/slack_module.py | 0 108 files changed, 1 insertion(+) rename openpype/modules/{default_modules => }/slack/README.md (100%) rename openpype/modules/{default_modules => }/slack/__init__.py (100%) rename openpype/modules/{default_modules => }/slack/launch_hooks/pre_python2_vendor.py (100%) rename openpype/modules/{default_modules => }/slack/manifest.yml (100%) rename openpype/modules/{default_modules => }/slack/plugins/publish/collect_slack_family.py (100%) rename openpype/modules/{default_modules => }/slack/plugins/publish/integrate_slack_api.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/.appveyor.yml (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/.coveragerc (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/.flake8 (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/.github/contributing.md (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/.github/issue_template.md (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/.github/maintainers_guide.md (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/.github/pull_request_template.md (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/.gitignore (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/.travis.yml (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/LICENSE (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/MANIFEST.in (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/README.rst (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/.gitignore (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/Makefile (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/conf.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/layout.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/localtoc.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/relations.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/sidebar.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/default.css_t (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/docs.css_t (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/pygments.css_t (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/theme.conf (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/about.rst (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/auth.rst (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/basic_usage.rst (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/changelog.rst (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/conf.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/conversations.rst (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/faq.rst (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/index.rst (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/make.bat (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/metadata.rst (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs-src/real_time_messaging.rst (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs.sh (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/.buildinfo (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/.nojekyll (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/ajax-loader.gif (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/basic.css (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/classic.css (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment-bright.png (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment-close.png (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment.png (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/default.css (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/docs.css (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/doctools.js (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/documentation_options.js (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/down-pressed.png (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/down.png (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/file.png (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/jquery-3.2.1.js (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/jquery.js (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/language_data.js (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/minus.png (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/plus.png (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/pygments.css (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/searchtools.js (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/sidebar.js (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/underscore-1.3.1.js (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/underscore.js (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/up-pressed.png (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/up.png (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/_static/websupport.js (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/about.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/auth.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/basic_usage.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/changelog.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/conversations.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/faq.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/genindex.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/index.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/metadata.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/objects.inv (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/real_time_messaging.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/search.html (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/docs/searchindex.js (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/requirements.txt (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/setup.cfg (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/setup.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/slackclient/__init__.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/slackclient/channel.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/slackclient/client.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/slackclient/exceptions.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/slackclient/im.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/slackclient/server.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/slackclient/slackrequest.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/slackclient/user.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/slackclient/util.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/slackclient/version.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/test_requirements.txt (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/tests/conftest.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/tests/data/channel.created.json (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/tests/data/im.created.json (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/tests/data/rtm.start.json (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/tests/data/slack_logo.png (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/tests/test_channel.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/tests/test_server.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/tests/test_slackclient.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/tests/test_slackrequest.py (100%) rename openpype/modules/{default_modules => }/slack/python2_vendor/python-slack-sdk-1/tox.ini (100%) rename openpype/modules/{default_modules => }/slack/slack_module.py (100%) diff --git a/openpype/modules/base.py b/openpype/modules/base.py index e03fa6c45b..eb40315dfa 100644 --- a/openpype/modules/base.py +++ b/openpype/modules/base.py @@ -274,6 +274,7 @@ def _load_modules(): # Import default modules imported from 'openpype.modules' for default_module_name in ( "python_console_interpreter", + "slack", "log_viewer", "muster", "clockify", diff --git a/openpype/modules/default_modules/slack/README.md b/openpype/modules/slack/README.md similarity index 100% rename from openpype/modules/default_modules/slack/README.md rename to openpype/modules/slack/README.md diff --git a/openpype/modules/default_modules/slack/__init__.py b/openpype/modules/slack/__init__.py similarity index 100% rename from openpype/modules/default_modules/slack/__init__.py rename to openpype/modules/slack/__init__.py diff --git a/openpype/modules/default_modules/slack/launch_hooks/pre_python2_vendor.py b/openpype/modules/slack/launch_hooks/pre_python2_vendor.py similarity index 100% rename from openpype/modules/default_modules/slack/launch_hooks/pre_python2_vendor.py rename to openpype/modules/slack/launch_hooks/pre_python2_vendor.py diff --git a/openpype/modules/default_modules/slack/manifest.yml b/openpype/modules/slack/manifest.yml similarity index 100% rename from openpype/modules/default_modules/slack/manifest.yml rename to openpype/modules/slack/manifest.yml diff --git a/openpype/modules/default_modules/slack/plugins/publish/collect_slack_family.py b/openpype/modules/slack/plugins/publish/collect_slack_family.py similarity index 100% rename from openpype/modules/default_modules/slack/plugins/publish/collect_slack_family.py rename to openpype/modules/slack/plugins/publish/collect_slack_family.py diff --git a/openpype/modules/default_modules/slack/plugins/publish/integrate_slack_api.py b/openpype/modules/slack/plugins/publish/integrate_slack_api.py similarity index 100% rename from openpype/modules/default_modules/slack/plugins/publish/integrate_slack_api.py rename to openpype/modules/slack/plugins/publish/integrate_slack_api.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.appveyor.yml b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/.appveyor.yml similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.appveyor.yml rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/.appveyor.yml diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.coveragerc b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/.coveragerc similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.coveragerc rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/.coveragerc diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.flake8 b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/.flake8 similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.flake8 rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/.flake8 diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.github/contributing.md b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/.github/contributing.md similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.github/contributing.md rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/.github/contributing.md diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.github/issue_template.md b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/.github/issue_template.md similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.github/issue_template.md rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/.github/issue_template.md diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.github/maintainers_guide.md b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/.github/maintainers_guide.md similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.github/maintainers_guide.md rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/.github/maintainers_guide.md diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.github/pull_request_template.md b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/.github/pull_request_template.md similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.github/pull_request_template.md rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/.github/pull_request_template.md diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.gitignore b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/.gitignore similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.gitignore rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/.gitignore diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.travis.yml b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/.travis.yml similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/.travis.yml rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/.travis.yml diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/LICENSE b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/LICENSE similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/LICENSE rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/LICENSE diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/MANIFEST.in b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/MANIFEST.in similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/MANIFEST.in rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/MANIFEST.in diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/README.rst b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/README.rst similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/README.rst rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/README.rst diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/.gitignore b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/.gitignore similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/.gitignore rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/.gitignore diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/Makefile b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/Makefile similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/Makefile rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/Makefile diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/conf.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/conf.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/conf.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/conf.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/layout.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/layout.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/layout.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/layout.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/localtoc.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/localtoc.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/localtoc.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/localtoc.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/relations.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/relations.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/relations.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/relations.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/sidebar.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/sidebar.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/sidebar.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/sidebar.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/default.css_t b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/default.css_t similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/default.css_t rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/default.css_t diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/docs.css_t b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/docs.css_t similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/docs.css_t rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/docs.css_t diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/pygments.css_t b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/pygments.css_t similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/pygments.css_t rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/static/pygments.css_t diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/theme.conf b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/theme.conf similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/theme.conf rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/_themes/slack/theme.conf diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/about.rst b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/about.rst similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/about.rst rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/about.rst diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/auth.rst b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/auth.rst similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/auth.rst rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/auth.rst diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/basic_usage.rst b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/basic_usage.rst similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/basic_usage.rst rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/basic_usage.rst diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/changelog.rst b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/changelog.rst similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/changelog.rst rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/changelog.rst diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/conf.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/conf.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/conf.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/conf.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/conversations.rst b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/conversations.rst similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/conversations.rst rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/conversations.rst diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/faq.rst b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/faq.rst similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/faq.rst rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/faq.rst diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/index.rst b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/index.rst similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/index.rst rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/index.rst diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/make.bat b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/make.bat similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/make.bat rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/make.bat diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/metadata.rst b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/metadata.rst similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/metadata.rst rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/metadata.rst diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/real_time_messaging.rst b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/real_time_messaging.rst similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs-src/real_time_messaging.rst rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs-src/real_time_messaging.rst diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs.sh b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs.sh similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs.sh rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs.sh diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/.buildinfo b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/.buildinfo similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/.buildinfo rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/.buildinfo diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/.nojekyll b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/.nojekyll similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/.nojekyll rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/.nojekyll diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/ajax-loader.gif b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/ajax-loader.gif similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/ajax-loader.gif rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/ajax-loader.gif diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/basic.css b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/basic.css similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/basic.css rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/basic.css diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/classic.css b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/classic.css similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/classic.css rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/classic.css diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment-bright.png b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment-bright.png similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment-bright.png rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment-bright.png diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment-close.png b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment-close.png similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment-close.png rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment-close.png diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment.png b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment.png similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment.png rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/comment.png diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/default.css b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/default.css similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/default.css rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/default.css diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/docs.css b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/docs.css similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/docs.css rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/docs.css diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/doctools.js b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/doctools.js similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/doctools.js rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/doctools.js diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/documentation_options.js b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/documentation_options.js similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/documentation_options.js rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/documentation_options.js diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/down-pressed.png b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/down-pressed.png similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/down-pressed.png rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/down-pressed.png diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/down.png b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/down.png similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/down.png rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/down.png diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/file.png b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/file.png similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/file.png rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/file.png diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/jquery-3.2.1.js b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/jquery-3.2.1.js similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/jquery-3.2.1.js rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/jquery-3.2.1.js diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/jquery.js b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/jquery.js similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/jquery.js rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/jquery.js diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/language_data.js b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/language_data.js similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/language_data.js rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/language_data.js diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/minus.png b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/minus.png similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/minus.png rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/minus.png diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/plus.png b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/plus.png similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/plus.png rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/plus.png diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/pygments.css b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/pygments.css similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/pygments.css rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/pygments.css diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/searchtools.js b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/searchtools.js similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/searchtools.js rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/searchtools.js diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/sidebar.js b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/sidebar.js similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/sidebar.js rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/sidebar.js diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/underscore-1.3.1.js b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/underscore-1.3.1.js similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/underscore-1.3.1.js rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/underscore-1.3.1.js diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/underscore.js b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/underscore.js similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/underscore.js rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/underscore.js diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/up-pressed.png b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/up-pressed.png similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/up-pressed.png rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/up-pressed.png diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/up.png b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/up.png similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/up.png rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/up.png diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/websupport.js b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/websupport.js similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/websupport.js rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/_static/websupport.js diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/about.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/about.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/about.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/about.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/auth.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/auth.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/auth.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/auth.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/basic_usage.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/basic_usage.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/basic_usage.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/basic_usage.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/changelog.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/changelog.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/changelog.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/changelog.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/conversations.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/conversations.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/conversations.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/conversations.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/faq.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/faq.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/faq.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/faq.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/genindex.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/genindex.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/genindex.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/genindex.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/index.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/index.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/index.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/index.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/metadata.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/metadata.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/metadata.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/metadata.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/objects.inv b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/objects.inv similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/objects.inv rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/objects.inv diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/real_time_messaging.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/real_time_messaging.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/real_time_messaging.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/real_time_messaging.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/search.html b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/search.html similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/search.html rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/search.html diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/searchindex.js b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/searchindex.js similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/docs/searchindex.js rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/docs/searchindex.js diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/requirements.txt b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/requirements.txt similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/requirements.txt rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/requirements.txt diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/setup.cfg b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/setup.cfg similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/setup.cfg rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/setup.cfg diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/setup.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/setup.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/setup.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/setup.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/__init__.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/__init__.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/__init__.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/__init__.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/channel.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/channel.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/channel.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/channel.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/client.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/client.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/client.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/client.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/exceptions.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/exceptions.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/exceptions.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/exceptions.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/im.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/im.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/im.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/im.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/server.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/server.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/server.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/server.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/slackrequest.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/slackrequest.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/slackrequest.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/slackrequest.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/user.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/user.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/user.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/user.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/util.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/util.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/util.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/util.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/version.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/version.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/slackclient/version.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/slackclient/version.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/test_requirements.txt b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/test_requirements.txt similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/test_requirements.txt rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/test_requirements.txt diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/conftest.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/conftest.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/conftest.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/conftest.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/data/channel.created.json b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/data/channel.created.json similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/data/channel.created.json rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/data/channel.created.json diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/data/im.created.json b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/data/im.created.json similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/data/im.created.json rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/data/im.created.json diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/data/rtm.start.json b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/data/rtm.start.json similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/data/rtm.start.json rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/data/rtm.start.json diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/data/slack_logo.png b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/data/slack_logo.png similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/data/slack_logo.png rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/data/slack_logo.png diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/test_channel.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/test_channel.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/test_channel.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/test_channel.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/test_server.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/test_server.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/test_server.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/test_server.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/test_slackclient.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/test_slackclient.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/test_slackclient.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/test_slackclient.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/test_slackrequest.py b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/test_slackrequest.py similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tests/test_slackrequest.py rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/tests/test_slackrequest.py diff --git a/openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tox.ini b/openpype/modules/slack/python2_vendor/python-slack-sdk-1/tox.ini similarity index 100% rename from openpype/modules/default_modules/slack/python2_vendor/python-slack-sdk-1/tox.ini rename to openpype/modules/slack/python2_vendor/python-slack-sdk-1/tox.ini diff --git a/openpype/modules/default_modules/slack/slack_module.py b/openpype/modules/slack/slack_module.py similarity index 100% rename from openpype/modules/default_modules/slack/slack_module.py rename to openpype/modules/slack/slack_module.py From 8b79961e286a18bb8dcb893c64470bee99177e3d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 2 Dec 2021 16:31:34 +0100 Subject: [PATCH 052/341] moved webserver module --- openpype/modules/base.py | 1 + openpype/modules/{default_modules => }/webserver/__init__.py | 0 openpype/modules/{default_modules => }/webserver/base_routes.py | 0 .../{default_modules => }/webserver/host_console_listener.py | 0 openpype/modules/{default_modules => }/webserver/server.py | 0 .../modules/{default_modules => }/webserver/webserver_module.py | 0 6 files changed, 1 insertion(+) rename openpype/modules/{default_modules => }/webserver/__init__.py (100%) rename openpype/modules/{default_modules => }/webserver/base_routes.py (100%) rename openpype/modules/{default_modules => }/webserver/host_console_listener.py (100%) rename openpype/modules/{default_modules => }/webserver/server.py (100%) rename openpype/modules/{default_modules => }/webserver/webserver_module.py (100%) diff --git a/openpype/modules/base.py b/openpype/modules/base.py index eb40315dfa..e300dd0806 100644 --- a/openpype/modules/base.py +++ b/openpype/modules/base.py @@ -273,6 +273,7 @@ def _load_modules(): # Import default modules imported from 'openpype.modules' for default_module_name in ( + "webserver", "python_console_interpreter", "slack", "log_viewer", diff --git a/openpype/modules/default_modules/webserver/__init__.py b/openpype/modules/webserver/__init__.py similarity index 100% rename from openpype/modules/default_modules/webserver/__init__.py rename to openpype/modules/webserver/__init__.py diff --git a/openpype/modules/default_modules/webserver/base_routes.py b/openpype/modules/webserver/base_routes.py similarity index 100% rename from openpype/modules/default_modules/webserver/base_routes.py rename to openpype/modules/webserver/base_routes.py diff --git a/openpype/modules/default_modules/webserver/host_console_listener.py b/openpype/modules/webserver/host_console_listener.py similarity index 100% rename from openpype/modules/default_modules/webserver/host_console_listener.py rename to openpype/modules/webserver/host_console_listener.py diff --git a/openpype/modules/default_modules/webserver/server.py b/openpype/modules/webserver/server.py similarity index 100% rename from openpype/modules/default_modules/webserver/server.py rename to openpype/modules/webserver/server.py diff --git a/openpype/modules/default_modules/webserver/webserver_module.py b/openpype/modules/webserver/webserver_module.py similarity index 100% rename from openpype/modules/default_modules/webserver/webserver_module.py rename to openpype/modules/webserver/webserver_module.py From d65431c34b120c29b3a791cf7839092ae34db096 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 2 Dec 2021 17:20:29 +0100 Subject: [PATCH 053/341] OP-2042 - remove pytest deprecation warnings --- openpype/pype_commands.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openpype/pype_commands.py b/openpype/pype_commands.py index 519e7c285b..7f6e5f1c0c 100644 --- a/openpype/pype_commands.py +++ b/openpype/pype_commands.py @@ -216,6 +216,7 @@ class PypeCommands: task_name, app_name ) + print("env:: {}".format(env)) os.environ.update(env) os.environ["OPENPYPE_PUBLISH_DATA"] = batch_dir @@ -364,7 +365,10 @@ class PypeCommands: if pyargs: pyargs_str = "--pyargs {}".format(pyargs) - cmd = "pytest {} {} {}".format(folder, mark_str, pyargs_str) + depr_str = "--disable-pytest-warnings" + + cmd = "pytest {} {} {} {}".format(depr_str, folder, + mark_str, pyargs_str) print("Running {}".format(cmd)) subprocess.run(cmd) From 9dbae0e52e43b569051c28e4ef74179548f68065 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 2 Dec 2021 17:50:18 +0100 Subject: [PATCH 054/341] OP-2042 - added NUKE_PATH to settings It was overwriting existing value of NUKE_PATH before --- openpype/settings/defaults/system_settings/applications.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/settings/defaults/system_settings/applications.json b/openpype/settings/defaults/system_settings/applications.json index 8c119658be..4e50201036 100644 --- a/openpype/settings/defaults/system_settings/applications.json +++ b/openpype/settings/defaults/system_settings/applications.json @@ -139,7 +139,7 @@ "icon": "{}/app_icons/nuke.png", "host_name": "nuke", "environment": { - "NUKE_PATH": "{OPENPYPE_STUDIO_PLUGINS}/nuke" + "NUKE_PATH": ["{NUKE_PATH}", "{OPENPYPE_STUDIO_PLUGINS}/nuke"] }, "variants": { "13-0": { @@ -245,7 +245,7 @@ "icon": "{}/app_icons/nuke.png", "host_name": "nuke", "environment": { - "NUKE_PATH": "{OPENPYPE_STUDIO_PLUGINS}/nuke" + "NUKE_PATH": ["{NUKE_PATH}", "{OPENPYPE_STUDIO_PLUGINS}/nuke"] }, "variants": { "13-0": { From 591e81a4148396dd5e6e71a0f55133f7c6b13a1d Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 2 Dec 2021 17:51:45 +0100 Subject: [PATCH 055/341] OP-2042 - comment out examples --- tests/lib/db_handler.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/lib/db_handler.py b/tests/lib/db_handler.py index 88cde4d05f..0aa4c69ca6 100644 --- a/tests/lib/db_handler.py +++ b/tests/lib/db_handler.py @@ -220,15 +220,16 @@ class DBHandler: return query -handler = DBHandler(uri="mongodb://localhost:27017") -# -backup_dir = "c:\\projects\\test_nuke_publish\\input\\dumps" +# Examples +# handler = DBHandler(uri="mongodb://localhost:27017") # # -handler.backup_to_dump("avalon", backup_dir, True, collection="test_project") -#handler.setup_from_dump("test_db", backup_dir, True, db_name_out="avalon", collection="test_project") -# # handler.setup_from_sql_file("test_db", "c:\\projects\\sql\\item.sql", -# # collection="test_project", -# # drop=False, mode="upsert") -# handler.setup_from_sql("test_db", "c:\\projects\\sql", +# backup_dir = "c:\\projects\\test_nuke_publish\\input\\dumps" +# # # +# handler.backup_to_dump("avalon", backup_dir, True, collection="test_project") +# handler.setup_from_dump("test_db", backup_dir, True, db_name_out="avalon", collection="test_project") +# handler.setup_from_sql_file("test_db", "c:\\projects\\sql\\item.sql", # collection="test_project", # drop=False, mode="upsert") +# handler.setup_from_sql("test_db", "c:\\projects\\sql", +# collection="test_project", +# drop=False, mode="upsert") From fe86bbde299ffc9dd19b3bc9225cfb289c21ee3c Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 2 Dec 2021 18:12:54 +0100 Subject: [PATCH 056/341] OP-2042 - working example of test publish in Nuke --- .../hosts/nuke/test_publish_in_nuke.py | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py index abadb0fb92..574ad8de00 100644 --- a/tests/integration/hosts/nuke/test_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -14,17 +14,20 @@ class TestPublishInNuke(PublishTest): Uses generic TestCase to prepare fixtures for test data, testing DBs, env vars. - Opens Maya, run publish on prepared workile. + Opens Nuke, run publish on prepared workile. Then checks content of DB (if subset, version, representations were created. Checks tmp folder if all expected files were published. + How to run: + {OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests ../tests/integration/hosts/nuke # noqa: E501 + """ - PERSIST = True + PERSIST = True # True - keep test_db, test_openpype, outputted test files TEST_FILES = [ - ("1635L4gww9nEkP-1EclfWXNdeDuRjDhey", "test_Nuke_publish.zip", "") + ("1SUurHj2aiQ21ZIMJfGVBI2KjR8kIjBGI", "test_Nuke_publish.zip", "") ] APP = "nuke" @@ -40,7 +43,6 @@ class TestPublishInNuke(PublishTest): Maya expects workfile in proper folder, so copy is done first. """ - print("last_workfile_path") log.info("log last_workfile_path") src_path = os.path.join( download_test_data, @@ -62,20 +64,14 @@ class TestPublishInNuke(PublishTest): @pytest.fixture(scope="module") def startup_scripts(self, monkeypatch_session, download_test_data): """Points Nuke to userSetup file from input data""" - print("startup_scripts") - log.info("log startup_scripts") startup_path = os.path.join(download_test_data, "input", "startup") - startup_path = "C:\\projects\\test_nuke_publish\\input\\startup" - original_pythonpath = os.environ.get("NUKE_PATH") + original_nuke_path = os.environ.get("NUKE_PATH", "") monkeypatch_session.setenv("NUKE_PATH", - "{}{}{}".format(original_pythonpath, + "{}{}{}".format(startup_path, os.pathsep, - startup_path)) - print("NUKE_PATH:: {}{}{}".format(startup_path, - os.pathsep, - original_pythonpath)) + original_nuke_path)) def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" @@ -88,25 +84,21 @@ class TestPublishInNuke(PublishTest): "Only versions with 1 expected" assert 1 == dbcon.count_documents({"type": "subset", - "name": "modelMain"}), \ - "modelMain subset must be present" + "name": "renderCompositingInNukeMain"} # noqa: E501 + ), \ + "renderCompositingInNukeMain subset must be present" assert 1 == dbcon.count_documents({"type": "subset", "name": "workfileTest_task"}), \ "workfileTest_task subset must be present" - assert 11 == dbcon.count_documents({"type": "representation"}), \ + assert 10 == dbcon.count_documents({"type": "representation"}), \ "Not expected no of representations" - assert 2 == dbcon.count_documents({"type": "representation", - "context.subset": "modelMain", - "context.ext": "abc"}), \ - "Not expected no of representations with ext 'abc'" - - assert 2 == dbcon.count_documents({"type": "representation", - "context.subset": "modelMain", - "context.ext": "ma"}), \ - "Not expected no of representations with ext 'abc'" + assert 1 == dbcon.count_documents({"type": "representation", + "context.subset": "renderCompositingInNukeMain", # noqa: E501 + "context.ext": "exr"}), \ + "Not expected no of representations with ext 'exr'" if __name__ == "__main__": From e35920f9bed75a55770b219d0374d0e19b07ee7b Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 2 Dec 2021 18:40:39 +0100 Subject: [PATCH 057/341] OP-2042 - replaced testing zip files Zip files now stored on OP shared GDrive PS implementation is not working, fixed in OP-2019 --- tests/integration/hosts/maya/test_publish_in_maya.py | 9 +++++++-- .../hosts/photoshop/test_publish_in_photoshop.py | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/tests/integration/hosts/maya/test_publish_in_maya.py b/tests/integration/hosts/maya/test_publish_in_maya.py index 1babf30029..566829b2e2 100644 --- a/tests/integration/hosts/maya/test_publish_in_maya.py +++ b/tests/integration/hosts/maya/test_publish_in_maya.py @@ -13,17 +13,22 @@ class TestPublishInMaya(PublishTest): Uses generic TestCase to prepare fixtures for test data, testing DBs, env vars. - Opens Maya, run publish on prepared workile. + Always pulls and uses test data from GDrive! + + Opens Maya, runs publish on prepared workile. Then checks content of DB (if subset, version, representations were created. Checks tmp folder if all expected files were published. + How to run: + {OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests ../tests/integration/hosts/maya # noqa: E501 + """ PERSIST = True TEST_FILES = [ - ("1pOwjA_VVBc6ooTZyFxtAwLS2KZHaBlkY", "test_maya_publish.zip", "") + ("1BTSIIULJTuDc8VvXseuiJV_fL6-Bu7FP", "test_maya_publish.zip", "") ] APP = "maya" diff --git a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py index b634d422f3..3ef40f3041 100644 --- a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py +++ b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py @@ -11,17 +11,22 @@ class TestPublishInPhotoshop(PublishTest): Uses generic TestCase to prepare fixtures for test data, testing DBs, env vars. - Opens Maya, run publish on prepared workile. + Always pulls and uses test data from GDrive! + + Opens Photoshop, runs publish on prepared workile. Then checks content of DB (if subset, version, representations were created. Checks tmp folder if all expected files were published. + How to run: + {OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests ../tests/integration/hosts/photoshop # noqa: E501 + """ PERSIST = True TEST_FILES = [ - ("1Bciy2pCwMKl1UIpxuPnlX_LHMo_Xkq0K", "test_photoshop_publish.zip", "") + ("1zD2v5cBgkyOm_xIgKz3WKn8aFB_j8qC-", "test_photoshop_publish.zip", "") ] APP = "photoshop" From e25fcade98ac6c787f99e50214b6b52099abd80f Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Thu, 2 Dec 2021 19:02:18 +0100 Subject: [PATCH 058/341] move version detection --- igniter/bootstrap_repos.py | 210 +++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 151597e505..b0f3b482ac 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -232,6 +232,216 @@ class OpenPypeVersion(semver.VersionInfo): else: return hash(str(self)) + @staticmethod + def is_version_in_dir( + dir_item: Path, version: OpenPypeVersion) -> Tuple[bool, str]: + """Test if path item is OpenPype version matching detected version. + + If item is directory that might (based on it's name) + contain OpenPype version, check if it really does contain + OpenPype and that their versions matches. + + Args: + dir_item (Path): Directory to test. + version (OpenPypeVersion): OpenPype version detected + from name. + + Returns: + Tuple: State and reason, True if it is valid OpenPype version, + False otherwise. + + """ + try: + # add one 'openpype' level as inside dir there should + # be many other repositories. + version_str = OpenPypeVersion.get_version_string_from_directory( + dir_item) # noqa: E501 + version_check = OpenPypeVersion(version=version_str) + except ValueError: + return False, f"cannot determine version from {dir_item}" + + version_main = version_check.get_main_version() + detected_main = version.get_main_version() + if version_main != detected_main: + return False, (f"dir version ({version}) and " + f"its content version ({version_check}) " + "doesn't match. Skipping.") + return True, "Versions match" + + @staticmethod + def is_version_in_zip( + zip_item: Path, version: OpenPypeVersion) -> Tuple[bool, str]: + """Test if zip path is OpenPype version matching detected version. + + Open zip file, look inside and parse version from OpenPype + inside it. If there is none, or it is different from + version specified in file name, skip it. + + Args: + zip_item (Path): Zip file to test. + version (OpenPypeVersion): Pype version detected + from name. + + Returns: + Tuple: State and reason, True if it is valid OpenPype version, + False otherwise. + + """ + # skip non-zip files + if zip_item.suffix.lower() != ".zip": + return False, "Not a zip" + + try: + with ZipFile(zip_item, "r") as zip_file: + with zip_file.open( + "openpype/version.py") as version_file: + zip_version = {} + exec(version_file.read(), zip_version) + try: + version_check = OpenPypeVersion( + version=zip_version["__version__"]) + except ValueError as e: + return False, str(e) + + version_main = version_check.get_main_version() # + # noqa: E501 + detected_main = version.get_main_version() + # noqa: E501 + + if version_main != detected_main: + return False, (f"zip version ({version}) " + f"and its content version " + f"({version_check}) " + "doesn't match. Skipping.") + except BadZipFile: + return False, f"{zip_item} is not a zip file" + except KeyError: + return False, "Zip does not contain OpenPype" + return True, "Versions match" + + @staticmethod + def get_version_string_from_directory(repo_dir: Path) -> Union[str, None]: + """Get version of OpenPype in given directory. + + Note: in frozen OpenPype installed in user data dir, this must point + one level deeper as it is: + `openpype-version-v3.0.0/openpype/version.py` + + Args: + repo_dir (Path): Path to OpenPype repo. + + Returns: + str: version string. + None: if OpenPype is not found. + + """ + # try to find version + version_file = Path(repo_dir) / "openpype" / "version.py" + if not version_file.exists(): + return None + + version = {} + with version_file.open("r") as fp: + exec(fp.read(), version) + + return version['__version__'] + + @staticmethod + def get_available_versions( + staging: bool = False, local: bool = False) -> List: + """Get ordered dict of detected OpenPype version. + + Resolution order for OpenPype is following: + + 1) First we test for ``OPENPYPE_PATH`` environment variable + 2) We try to find ``openPypePath`` in registry setting + 3) We use user data directory + + Only versions from 3) will be listed when ``local`` is set to True. + + Args: + staging (bool, optional): List staging versions if True. + local (bool, optional): List only local versions. + + """ + registry = OpenPypeSettingsRegistry() + dir_to_search = Path(user_data_dir("openpype", "pypeclub")) + user_versions = OpenPypeVersion.get_versions_from_directory( + dir_to_search) + # if we have openpype_path specified, search only there. + + if not local: + if os.getenv("OPENPYPE_PATH"): + if Path(os.getenv("OPENPYPE_PATH")).exists(): + dir_to_search = Path(os.getenv("OPENPYPE_PATH")) + else: + try: + registry_dir = Path( + str(registry.get_item("openPypePath"))) + if registry_dir.exists(): + dir_to_search = registry_dir + + except ValueError: + # nothing found in registry, we'll use data dir + pass + + openpype_versions = OpenPypeVersion.get_versions_from_directory( + dir_to_search) + openpype_versions += user_versions + + # remove duplicates and staging/production + openpype_versions = [ + v for v in openpype_versions if v.is_staging() == staging + ] + openpype_versions = sorted(list(set(openpype_versions))) + + return openpype_versions + + @staticmethod + def get_versions_from_directory(openpype_dir: Path) -> List: + """Get all detected OpenPype versions in directory. + + Args: + openpype_dir (Path): Directory to scan. + + Returns: + list of OpenPypeVersion + + Throws: + ValueError: if invalid path is specified. + + """ + if not openpype_dir.exists() and not openpype_dir.is_dir(): + raise ValueError("specified directory is invalid") + + _openpype_versions = [] + # iterate over directory in first level and find all that might + # contain OpenPype. + for item in openpype_dir.iterdir(): + + # if file, strip extension, in case of dir not. + name = item.name if item.is_dir() else item.stem + result = OpenPypeVersion.version_in_str(name) + + if result: + detected_version: OpenPypeVersion + detected_version = result + + if item.is_dir() and not OpenPypeVersion.is_version_in_dir( + item, detected_version + )[0]: + continue + + if item.is_file() and not OpenPypeVersion.is_version_in_zip( + item, detected_version + )[0]: + continue + + detected_version.path = item + _openpype_versions.append(detected_version) + + return sorted(_openpype_versions) + class BootstrapRepos: """Class for bootstrapping local OpenPype installation. From d4e5ab90cf3bc81a8ffe94b5b8736d7403adb2c3 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 2 Dec 2021 19:02:35 +0100 Subject: [PATCH 059/341] OP-2042 - added better documentation how to run it --- tests/integration/hosts/maya/test_publish_in_maya.py | 1 + tests/integration/hosts/nuke/test_publish_in_nuke.py | 1 + tests/integration/hosts/photoshop/test_publish_in_photoshop.py | 1 + 3 files changed, 3 insertions(+) diff --git a/tests/integration/hosts/maya/test_publish_in_maya.py b/tests/integration/hosts/maya/test_publish_in_maya.py index 566829b2e2..b53b26f66d 100644 --- a/tests/integration/hosts/maya/test_publish_in_maya.py +++ b/tests/integration/hosts/maya/test_publish_in_maya.py @@ -22,6 +22,7 @@ class TestPublishInMaya(PublishTest): Checks tmp folder if all expected files were published. How to run: + (in cmd with activated {OPENPYPE_ROOT}/.venv) {OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests ../tests/integration/hosts/maya # noqa: E501 """ diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py index 574ad8de00..6dc880d757 100644 --- a/tests/integration/hosts/nuke/test_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -21,6 +21,7 @@ class TestPublishInNuke(PublishTest): Checks tmp folder if all expected files were published. How to run: + (in cmd with activated {OPENPYPE_ROOT}/.venv) {OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests ../tests/integration/hosts/nuke # noqa: E501 """ diff --git a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py index 3ef40f3041..43e03b2cc3 100644 --- a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py +++ b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py @@ -20,6 +20,7 @@ class TestPublishInPhotoshop(PublishTest): Checks tmp folder if all expected files were published. How to run: + (in cmd with activated {OPENPYPE_ROOT}/.venv) {OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests ../tests/integration/hosts/photoshop # noqa: E501 """ From 5d8550399535492c6bc52ba58f5c2aff9200f066 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 2 Dec 2021 19:03:43 +0100 Subject: [PATCH 060/341] OP-2042 - removed forgotten app for debugging --- openpype/hooks/pre_foundry_apps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hooks/pre_foundry_apps.py b/openpype/hooks/pre_foundry_apps.py index 70554cbedb..85f68c6b60 100644 --- a/openpype/hooks/pre_foundry_apps.py +++ b/openpype/hooks/pre_foundry_apps.py @@ -13,7 +13,7 @@ class LaunchFoundryAppsWindows(PreLaunchHook): # Should be as last hook because must change launch arguments to string order = 1000 - app_groups = ["nuke", "nukex", "hiero", "nukestudio", "aftereffects"] + app_groups = ["nuke", "nukex", "hiero", "nukestudio"] platforms = ["windows"] def execute(self): From 1762f4635b5fe520825343b4b80ff7fec02b9c42 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 2 Dec 2021 19:04:44 +0100 Subject: [PATCH 061/341] OP-2042 - fixed wrong value Belongs to merged PR for AE testing --- openpype/lib/remote_publish.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/lib/remote_publish.py b/openpype/lib/remote_publish.py index 4b4d233f1e..6c594b50e8 100644 --- a/openpype/lib/remote_publish.py +++ b/openpype/lib/remote_publish.py @@ -27,7 +27,7 @@ def headless_publish(log, close_plugin_name=None, is_test=False): publish_and_log(dbcon, _id, log, close_plugin_name) else: - publish(log, 'CloseAE') + publish(log, close_plugin_name) def get_webpublish_conn(): From 07fdcc6f4de08087a4f22343bb61a83cc65b0df8 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 2 Dec 2021 19:07:46 +0100 Subject: [PATCH 062/341] OP-2019 - fixed wrong value --- openpype/lib/remote_publish.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/lib/remote_publish.py b/openpype/lib/remote_publish.py index 3483898af7..b91c5f01fc 100644 --- a/openpype/lib/remote_publish.py +++ b/openpype/lib/remote_publish.py @@ -27,7 +27,7 @@ def headless_publish(log, close_plugin_name=None, is_test=False): publish_and_log(dbcon, _id, log, close_plugin_name) else: - publish(log, 'CloseAE') + publish(log, close_plugin_name) def get_webpublish_conn(): From 9a5f90620ed57bffe00888d5319d928064636b64 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 2 Dec 2021 19:27:50 +0100 Subject: [PATCH 063/341] Commit current develop avalon-core --- repos/avalon-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/avalon-core b/repos/avalon-core index e37f4f92ed..1d94a75ddf 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit e37f4f92ed25f89c870fdcb7f9538da7d0d7de90 +Subproject commit 1d94a75ddf37a354955a9e7f4bb8695187f3e0ed From ceeaf28dd7e461cd2271796092651b014f6c6f8f Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 Dec 2021 10:14:14 +0100 Subject: [PATCH 064/341] OP-2042 - clean up files from different PR --- .../aftereffects/plugins/publish/closeAE.py | 29 ------ .../plugins/publish/extract_local_render.py | 3 +- openpype/lib/remote_publish.py | 46 --------- .../system_settings/applications.json | 17 ---- .../test_publish_in_aftereffects.py | 96 ------------------- 5 files changed, 2 insertions(+), 189 deletions(-) delete mode 100644 openpype/hosts/aftereffects/plugins/publish/closeAE.py delete mode 100644 tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py diff --git a/openpype/hosts/aftereffects/plugins/publish/closeAE.py b/openpype/hosts/aftereffects/plugins/publish/closeAE.py deleted file mode 100644 index e6e9623474..0000000000 --- a/openpype/hosts/aftereffects/plugins/publish/closeAE.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -"""Close AE after publish. For Webpublishing only.""" -import os - -import pyblish.api - -from avalon import aftereffects - - -class CloseAE(pyblish.api.ContextPlugin): - """Close AE after publish. For Webpublishing only. - """ - - order = pyblish.api.IntegratorOrder + 14 - label = "Close AE" - optional = True - active = True - - hosts = ["aftereffects"] - targets = ["remotepublish"] - - def process(self, context): - self.log.info("CloseAE") - - stub = aftereffects.stub() - self.log.info("Shutting down AE") - stub.save() - stub.close() - self.log.info("AE closed") diff --git a/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py b/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py index b36ab24bde..37337e7fee 100644 --- a/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py +++ b/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py @@ -19,9 +19,10 @@ class ExtractLocalRender(openpype.api.Extractor): staging_dir = instance.data["stagingDir"] self.log.info("staging_dir::{}".format(staging_dir)) + stub.render(staging_dir) + # pull file name from Render Queue Output module render_q = stub.get_render_info() - stub.render(staging_dir) if not render_q: raise ValueError("No file extension set in Render Queue") _, ext = os.path.splitext(os.path.basename(render_q.file_name)) diff --git a/openpype/lib/remote_publish.py b/openpype/lib/remote_publish.py index 6c594b50e8..d7db4d1ab9 100644 --- a/openpype/lib/remote_publish.py +++ b/openpype/lib/remote_publish.py @@ -11,25 +11,6 @@ from openpype.lib.mongo import OpenPypeMongoConnection from openpype.lib.plugin_tools import parse_json -def headless_publish(log, close_plugin_name=None, is_test=False): - """Runs publish in a opened host with a context and closes Python process. - - Host is being closed via ClosePS pyblish plugin which triggers 'exit' - method in ConsoleTrayApp. - """ - if not is_test: - dbcon = get_webpublish_conn() - _id = os.environ.get("BATCH_LOG_ID") - if not _id: - log.warning("Unable to store log records, " - "batch will be unfinished!") - return - - publish_and_log(dbcon, _id, log, close_plugin_name) - else: - publish(log, close_plugin_name) - - def get_webpublish_conn(): """Get connection to OP 'webpublishes' collection.""" mongo_client = OpenPypeMongoConnection.get_mongo_client() @@ -56,33 +37,6 @@ def start_webpublish_log(dbcon, batch_id, user): }).inserted_id -def publish(log, close_plugin_name=None): - """Loops through all plugins, logs to console. Used for tests. - - Args: - log (OpenPypeLogger) - close_plugin_name (str): name of plugin with responsibility to - close host app - """ - # Error exit as soon as any error occurs. - error_format = "Failed {plugin.__name__}: {error} -- {error.traceback}" - - close_plugin = _get_close_plugin(close_plugin_name, log) - - for result in pyblish.util.publish_iter(): - for record in result["records"]: - log.info("{}: {}".format( - result["plugin"].label, record.msg)) - - if result["error"]: - log.error(error_format.format(**result)) - uninstall() - if close_plugin: # close host app explicitly after error - context = pyblish.api.Context() - close_plugin().process(context) - sys.exit(1) - - def publish_and_log(dbcon, _id, log, close_plugin_name=None): """Loops through all plugins, logs ok and fails into OP DB. diff --git a/openpype/settings/defaults/system_settings/applications.json b/openpype/settings/defaults/system_settings/applications.json index 4e50201036..c730e02984 100644 --- a/openpype/settings/defaults/system_settings/applications.json +++ b/openpype/settings/defaults/system_settings/applications.json @@ -1098,23 +1098,6 @@ "linux": [] }, "environment": {} - }, - "2022": { - "enabled": true, - "variant_label": "2022", - "executables": { - "windows": [ - "C:\\Program Files\\Adobe\\Adobe After Effects 2022\\Support Files\\AfterFX.exe" - ], - "darwin": [], - "linux": [] - }, - "arguments": { - "windows": [], - "darwin": [], - "linux": [] - }, - "environment": {} } } }, diff --git a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py deleted file mode 100644 index d4e88dfd4c..0000000000 --- a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py +++ /dev/null @@ -1,96 +0,0 @@ -import pytest -import os -import shutil - -from tests.lib.testing_classes import PublishTest - - -class TestPublishInAfterEffects(PublishTest): - """Basic test case for publishing in AfterEffects - - Uses generic TestCase to prepare fixtures for test data, testing DBs, - env vars. - - Opens AfterEffects, run publish on prepared workile. - - Then checks content of DB (if subset, version, representations were - created. - Checks tmp folder if all expected files were published. - - """ - PERSIST = True - - TEST_FILES = [ - ("1qsrq6OJWVpOeXE2LTWrdbsLqEVu155Uf", - "test_aftereffects_publish.zip", - "") - ] - - APP = "aftereffects" - APP_VARIANT = "2021" - - APP_NAME = "{}/{}".format(APP, APP_VARIANT) - - TIMEOUT = 120 # publish timeout - - @pytest.fixture(scope="module") - def last_workfile_path(self, download_test_data): - """Get last_workfile_path from source data. - - Maya expects workfile in proper folder, so copy is done first. - """ - src_path = os.path.join(download_test_data, - "input", - "workfile", - "test_project_test_asset_TestTask_v001.aep") - dest_folder = os.path.join(download_test_data, - self.PROJECT, - self.ASSET, - "work", - self.TASK) - os.makedirs(dest_folder) - dest_path = os.path.join(dest_folder, - "test_project_test_asset_TestTask_v001.aep") - shutil.copy(src_path, dest_path) - - yield dest_path - - @pytest.fixture(scope="module") - def startup_scripts(self, monkeypatch_session, download_test_data): - """Points AfterEffects to userSetup file from input data""" - pass - - def test_db_asserts(self, dbcon, publish_finished): - """Host and input data dependent expected results in DB.""" - print("test_db_asserts") - assert 5 == dbcon.count_documents({"type": "version"}), \ - "Not expected no of versions" - - assert 0 == dbcon.count_documents({"type": "version", - "name": {"$ne": 1}}), \ - "Only versions with 1 expected" - - assert 1 == dbcon.count_documents({"type": "subset", - "name": "modelMain"}), \ - "modelMain subset must be present" - - assert 1 == dbcon.count_documents({"type": "subset", - "name": "workfileTest_task"}), \ - "workfileTest_task subset must be present" - - assert 11 == dbcon.count_documents({"type": "representation"}), \ - "Not expected no of representations" - - assert 2 == dbcon.count_documents({"type": "representation", - "context.subset": "modelMain", - "context.ext": "abc"}), \ - "Not expected no of representations with ext 'abc'" - - assert 2 == dbcon.count_documents({"type": "representation", - "context.subset": "modelMain", - "context.ext": "ma"}), \ - "Not expected no of representations with ext 'abc'" - - -if __name__ == "__main__": - test_case = TestPublishInAfterEffects() From 486966efbc7daddefb6e264ec05a5718f8fce395 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 Dec 2021 10:16:05 +0100 Subject: [PATCH 065/341] Reverting change to avalon-core --- repos/avalon-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/avalon-core b/repos/avalon-core index 1d94a75ddf..9499f6517a 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit 1d94a75ddf37a354955a9e7f4bb8695187f3e0ed +Subproject commit 9499f6517a1ff2d3bf94c5d34c0aece146734760 From f9a1445a748f15a6592ad06ec34b748af1fddad0 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 Dec 2021 10:28:41 +0100 Subject: [PATCH 066/341] OP-2019 - revert to develop version --- .../integration/hosts/photoshop/test_publish_in_photoshop.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py index b634d422f3..396468a966 100644 --- a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py +++ b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py @@ -25,7 +25,7 @@ class TestPublishInPhotoshop(PublishTest): ] APP = "photoshop" - APP_VARIANT = "2021" + APP_VARIANT = "2020" APP_NAME = "{}/{}".format(APP, APP_VARIANT) @@ -56,7 +56,7 @@ class TestPublishInPhotoshop(PublishTest): @pytest.fixture(scope="module") def startup_scripts(self, monkeypatch_session, download_test_data): """Points Maya to userSetup file from input data""" - pass + os.environ["IS_HEADLESS"] = "true" def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" From 477d177bd9f9939f3c74c63ac47be5b68d52d372 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 Dec 2021 11:42:22 +0100 Subject: [PATCH 067/341] OP-2019 - fixes for PS test class --- .../photoshop/test_publish_in_photoshop.py | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py index 396468a966..4754f60486 100644 --- a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py +++ b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py @@ -11,7 +11,12 @@ class TestPublishInPhotoshop(PublishTest): Uses generic TestCase to prepare fixtures for test data, testing DBs, env vars. - Opens Maya, run publish on prepared workile. + Opens Photoshop, run publish on prepared workile. + + Test zip file sets 3 required env vars: + - HEADLESS_PUBLISH - this triggers publish immediately app is open + - IS_TEST - this differentiate between regular webpublish + - PYBLISH_TARGETS Then checks content of DB (if subset, version, representations were created. @@ -21,11 +26,11 @@ class TestPublishInPhotoshop(PublishTest): PERSIST = True TEST_FILES = [ - ("1Bciy2pCwMKl1UIpxuPnlX_LHMo_Xkq0K", "test_photoshop_publish.zip", "") + ("1zD2v5cBgkyOm_xIgKz3WKn8aFB_j8qC-", "test_photoshop_publish.zip", "") ] APP = "photoshop" - APP_VARIANT = "2020" + APP_VARIANT = "2021" APP_NAME = "{}/{}".format(APP, APP_VARIANT) @@ -56,12 +61,12 @@ class TestPublishInPhotoshop(PublishTest): @pytest.fixture(scope="module") def startup_scripts(self, monkeypatch_session, download_test_data): """Points Maya to userSetup file from input data""" - os.environ["IS_HEADLESS"] = "true" + pass def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" print("test_db_asserts") - assert 5 == dbcon.count_documents({"type": "version"}), \ + assert 3 == dbcon.count_documents({"type": "version"}), \ "Not expected no of versions" assert 0 == dbcon.count_documents({"type": "version", @@ -69,25 +74,21 @@ class TestPublishInPhotoshop(PublishTest): "Only versions with 1 expected" assert 1 == dbcon.count_documents({"type": "subset", - "name": "modelMain"}), \ + "name": "imageMainBackgroundcopy"} + ), \ "modelMain subset must be present" assert 1 == dbcon.count_documents({"type": "subset", - "name": "workfileTest_task"}), \ + "name": "workfileTesttask"}), \ "workfileTest_task subset must be present" - assert 11 == dbcon.count_documents({"type": "representation"}), \ + assert 6 == dbcon.count_documents({"type": "representation"}), \ "Not expected no of representations" - assert 2 == dbcon.count_documents({"type": "representation", - "context.subset": "modelMain", - "context.ext": "abc"}), \ - "Not expected no of representations with ext 'abc'" - - assert 2 == dbcon.count_documents({"type": "representation", - "context.subset": "modelMain", - "context.ext": "ma"}), \ - "Not expected no of representations with ext 'abc'" + assert 1 == dbcon.count_documents({"type": "representation", + "context.subset": "imageMainBackgroundcopy", # noqa: E501 + "context.ext": "png"}), \ + "Not expected no of representations with ext 'png'" if __name__ == "__main__": From 383307d88803404c1bac74366797b5a23e2fc5e0 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Fri, 3 Dec 2021 13:51:03 +0100 Subject: [PATCH 068/341] tweak tests and add get latest version --- igniter/bootstrap_repos.py | 97 +++++++++------------- start.py | 1 - tests/unit/igniter/test_bootstrap_repos.py | 7 +- 3 files changed, 41 insertions(+), 64 deletions(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index b0f3b482ac..ca64d193c7 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -401,16 +401,16 @@ class OpenPypeVersion(semver.VersionInfo): def get_versions_from_directory(openpype_dir: Path) -> List: """Get all detected OpenPype versions in directory. - Args: - openpype_dir (Path): Directory to scan. + Args: + openpype_dir (Path): Directory to scan. - Returns: - list of OpenPypeVersion + Returns: + list of OpenPypeVersion - Throws: - ValueError: if invalid path is specified. + Throws: + ValueError: if invalid path is specified. - """ + """ if not openpype_dir.exists() and not openpype_dir.is_dir(): raise ValueError("specified directory is invalid") @@ -442,6 +442,26 @@ class OpenPypeVersion(semver.VersionInfo): return sorted(_openpype_versions) + @staticmethod + def get_latest_version( + staging: bool = False, local: bool = False) -> OpenPypeVersion: + """Get latest available version. + + This is utility version to get latest version from all found. + + Args: + staging (bool, optional): List staging versions if True. + local (bool, optional): List only local versions. + + See also: + OpenPypeVersion.get_available_versions() + + """ + openpype_versions = OpenPypeVersion.get_available_versions( + staging, local) + + return openpype_versions[-1] + class BootstrapRepos: """Class for bootstrapping local OpenPype installation. @@ -944,66 +964,23 @@ class BootstrapRepos: os.environ["PYTHONPATH"] = os.pathsep.join(paths) + @staticmethod def find_openpype( - self, openpype_path: Union[Path, str] = None, staging: bool = False, include_zips: bool = False) -> Union[List[OpenPypeVersion], None]: - """Get ordered dict of detected OpenPype version. - Resolution order for OpenPype is following: - - 1) First we test for ``OPENPYPE_PATH`` environment variable - 2) We try to find ``openPypePath`` in registry setting - 3) We use user data directory - - Args: - openpype_path (Path or str, optional): Try to find OpenPype on - the given path or url. - staging (bool, optional): Filter only staging version, skip them - otherwise. - include_zips (bool, optional): If set True it will try to find - OpenPype in zip files in given directory. - - Returns: - dict of Path: Dictionary of detected OpenPype version. - Key is version, value is path to zip file. - - None: if OpenPype is not found. - - Todo: - implement git/url support as OpenPype location, so it would be - possible to enter git url, OpenPype would check it out and if it is - ok install it as normal version. - - """ - if openpype_path and not isinstance(openpype_path, Path): - raise NotImplementedError( - ("Finding OpenPype in non-filesystem locations is" - " not implemented yet.")) - - dir_to_search = self.data_dir - user_versions = self.get_openpype_versions(self.data_dir, staging) - # if we have openpype_path specified, search only there. if openpype_path: - dir_to_search = openpype_path + openpype_versions = OpenPypeVersion.get_versions_from_directory( + openpype_path) + # filter out staging + + openpype_versions = [ + v for v in openpype_versions if v.is_staging() == staging + ] + else: - if os.getenv("OPENPYPE_PATH"): - if Path(os.getenv("OPENPYPE_PATH")).exists(): - dir_to_search = Path(os.getenv("OPENPYPE_PATH")) - else: - try: - registry_dir = Path( - str(self.registry.get_item("openPypePath"))) - if registry_dir.exists(): - dir_to_search = registry_dir - - except ValueError: - # nothing found in registry, we'll use data dir - pass - - openpype_versions = self.get_openpype_versions(dir_to_search, staging) - openpype_versions += user_versions + openpype_versions = OpenPypeVersion.get_available_versions(staging) # remove zip file version if needed. if not include_zips: diff --git a/start.py b/start.py index 0f7e82071d..05b7da6308 100644 --- a/start.py +++ b/start.py @@ -966,7 +966,6 @@ def boot(): ) sys.exit(1) - if not openpype_path: _print("*** Cannot get OpenPype path from database.") diff --git a/tests/unit/igniter/test_bootstrap_repos.py b/tests/unit/igniter/test_bootstrap_repos.py index d6e861c262..65cd5a2399 100644 --- a/tests/unit/igniter/test_bootstrap_repos.py +++ b/tests/unit/igniter/test_bootstrap_repos.py @@ -140,9 +140,10 @@ def test_search_string_for_openpype_version(printer): ] for ver_string in strings: printer(f"testing {ver_string[0]} should be {ver_string[1]}") - assert OpenPypeVersion.version_in_str(ver_string[0]) == \ - ver_string[1] - + assert isinstance( + OpenPypeVersion.version_in_str(ver_string[0]), + OpenPypeVersion if ver_string[1] else type(None) + ) @pytest.mark.slow def test_install_live_repos(fix_bootstrap, printer, monkeypatch, pytestconfig): From d5b2127bcc04bbc5abab0de8c670e600c024cae2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 13:52:56 +0100 Subject: [PATCH 069/341] moved avalon apps module --- openpype/modules/{default_modules => }/avalon_apps/__init__.py | 0 openpype/modules/{default_modules => }/avalon_apps/avalon_app.py | 0 openpype/modules/{default_modules => }/avalon_apps/rest_api.py | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename openpype/modules/{default_modules => }/avalon_apps/__init__.py (100%) rename openpype/modules/{default_modules => }/avalon_apps/avalon_app.py (100%) rename openpype/modules/{default_modules => }/avalon_apps/rest_api.py (100%) diff --git a/openpype/modules/default_modules/avalon_apps/__init__.py b/openpype/modules/avalon_apps/__init__.py similarity index 100% rename from openpype/modules/default_modules/avalon_apps/__init__.py rename to openpype/modules/avalon_apps/__init__.py diff --git a/openpype/modules/default_modules/avalon_apps/avalon_app.py b/openpype/modules/avalon_apps/avalon_app.py similarity index 100% rename from openpype/modules/default_modules/avalon_apps/avalon_app.py rename to openpype/modules/avalon_apps/avalon_app.py diff --git a/openpype/modules/default_modules/avalon_apps/rest_api.py b/openpype/modules/avalon_apps/rest_api.py similarity index 100% rename from openpype/modules/default_modules/avalon_apps/rest_api.py rename to openpype/modules/avalon_apps/rest_api.py From 343159d5af8b1a77e8c7e95fe685c78a39e0ed88 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 14:12:32 +0100 Subject: [PATCH 070/341] define constant with default modules --- openpype/modules/base.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/openpype/modules/base.py b/openpype/modules/base.py index e300dd0806..29c1c6fd5a 100644 --- a/openpype/modules/base.py +++ b/openpype/modules/base.py @@ -29,6 +29,21 @@ from openpype.settings.lib import ( from openpype.lib import PypeLogger +DEFAULT_OPENPYPE_MODULES = ( + "avalon_apps", + "clockify", + "log_viewer", + "muster", + "python_console_interpreter", + "slack", + "webserver", + "launcher_action", + "project_manager_action", + "settings_action", + "standalonepublish_action", +) + + # Inherit from `object` for Python 2 hosts class _ModuleClass(object): """Fake module class for storing OpenPype modules. @@ -272,18 +287,7 @@ def _load_modules(): log = PypeLogger.get_logger("ModulesLoader") # Import default modules imported from 'openpype.modules' - for default_module_name in ( - "webserver", - "python_console_interpreter", - "slack", - "log_viewer", - "muster", - "clockify", - "settings_action", - "launcher_action", - "project_manager_action", - "standalonepublish_action", - ): + for default_module_name in DEFAULT_OPENPYPE_MODULES: try: default_module = __import__( "openpype.modules.{}".format(default_module_name), From 10d959dd03c176c25fed674b09922eaf44302732 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 14:13:16 +0100 Subject: [PATCH 071/341] modified and fixed import of default modules into 'openpype_modules' --- openpype/modules/base.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openpype/modules/base.py b/openpype/modules/base.py index 29c1c6fd5a..a1df3cfd14 100644 --- a/openpype/modules/base.py +++ b/openpype/modules/base.py @@ -289,10 +289,10 @@ def _load_modules(): # Import default modules imported from 'openpype.modules' for default_module_name in DEFAULT_OPENPYPE_MODULES: try: - default_module = __import__( - "openpype.modules.{}".format(default_module_name), - fromlist=("", ) - ) + import_str = "openpype.modules.{}".format(default_module_name) + new_import_str = "{}.{}".format(modules_key, default_module_name) + default_module = __import__(import_str, fromlist=("", )) + sys.modules[new_import_str] = default_module setattr(openpype_modules, default_module_name, default_module) except Exception: From 2e753e1ca2aac3cc0e43e82cbe0bc31a032a1f43 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 Dec 2021 14:39:49 +0100 Subject: [PATCH 072/341] OP-2019 - fixes for db_asserts --- .../test_publish_in_aftereffects.py | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py index d4e88dfd4c..3d1fa8f804 100644 --- a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py +++ b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py @@ -13,6 +13,11 @@ class TestPublishInAfterEffects(PublishTest): Opens AfterEffects, run publish on prepared workile. + Test zip file sets 3 required env vars: + - HEADLESS_PUBLISH - this triggers publish immediately app is open + - IS_TEST - this differentiate between regular webpublish + - PYBLISH_TARGETS + Then checks content of DB (if subset, version, representations were created. Checks tmp folder if all expected files were published. @@ -21,13 +26,13 @@ class TestPublishInAfterEffects(PublishTest): PERSIST = True TEST_FILES = [ - ("1qsrq6OJWVpOeXE2LTWrdbsLqEVu155Uf", + ("1c8261CmHwyMgS-g7S4xL5epAp0jCBmhf", "test_aftereffects_publish.zip", "") ] APP = "aftereffects" - APP_VARIANT = "2021" + APP_VARIANT = "2022" APP_NAME = "{}/{}".format(APP, APP_VARIANT) @@ -63,7 +68,7 @@ class TestPublishInAfterEffects(PublishTest): def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" print("test_db_asserts") - assert 5 == dbcon.count_documents({"type": "version"}), \ + assert 3 == dbcon.count_documents({"type": "version"}), \ "Not expected no of versions" assert 0 == dbcon.count_documents({"type": "version", @@ -71,25 +76,25 @@ class TestPublishInAfterEffects(PublishTest): "Only versions with 1 expected" assert 1 == dbcon.count_documents({"type": "subset", - "name": "modelMain"}), \ + "name": "imageMainBackgroundcopy" + }), \ "modelMain subset must be present" assert 1 == dbcon.count_documents({"type": "subset", - "name": "workfileTest_task"}), \ - "workfileTest_task subset must be present" + "name": "workfileTesttask"}), \ + "workfileTesttask subset must be present" - assert 11 == dbcon.count_documents({"type": "representation"}), \ + assert 1 == dbcon.count_documents({"type": "subset", + "name": "reviewTesttask"}), \ + "reviewTesttask subset must be present" + + assert 6 == dbcon.count_documents({"type": "representation"}), \ "Not expected no of representations" - assert 2 == dbcon.count_documents({"type": "representation", - "context.subset": "modelMain", - "context.ext": "abc"}), \ - "Not expected no of representations with ext 'abc'" - - assert 2 == dbcon.count_documents({"type": "representation", - "context.subset": "modelMain", - "context.ext": "ma"}), \ - "Not expected no of representations with ext 'abc'" + assert 1 == dbcon.count_documents({"type": "representation", + "context.subset": "imageMainBackgroundcopy", #noqa E501 + "context.ext": "png"}), \ + "Not expected no of representations with ext 'png'" if __name__ == "__main__": From 68b5078ae147130d3d10e4208a3e3ad7d9a20887 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 Dec 2021 15:37:00 +0100 Subject: [PATCH 073/341] OP-2042 - always capture stdout in pytest Previously it was printed only in case of failure --- openpype/pype_commands.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openpype/pype_commands.py b/openpype/pype_commands.py index 7f6e5f1c0c..ce1a9718b3 100644 --- a/openpype/pype_commands.py +++ b/openpype/pype_commands.py @@ -365,9 +365,10 @@ class PypeCommands: if pyargs: pyargs_str = "--pyargs {}".format(pyargs) - depr_str = "--disable-pytest-warnings" + # disable warnings and show captured stdout even if success + args_str = "--disable-pytest-warnings -rP" - cmd = "pytest {} {} {} {}".format(depr_str, folder, + cmd = "pytest {} {} {} {}".format(args_str, folder, mark_str, pyargs_str) print("Running {}".format(cmd)) subprocess.run(cmd) From d55d996f9c58030c86de4eb158837ea289d834d4 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 Dec 2021 15:39:43 +0100 Subject: [PATCH 074/341] OP-2042 - added functionality to reuse existing folder for testdata --- .../hosts/nuke/test_publish_in_nuke.py | 16 +++------ tests/lib/testing_classes.py | 34 +++++++++++-------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py index 6dc880d757..483e9fef98 100644 --- a/tests/integration/hosts/nuke/test_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -25,7 +25,7 @@ class TestPublishInNuke(PublishTest): {OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests ../tests/integration/hosts/nuke # noqa: E501 """ - PERSIST = True # True - keep test_db, test_openpype, outputted test files + PERSIST = False # True - keep test_db, test_openpype, outputted test files TEST_FILES = [ ("1SUurHj2aiQ21ZIMJfGVBI2KjR8kIjBGI", "test_Nuke_publish.zip", "") @@ -38,11 +38,12 @@ class TestPublishInNuke(PublishTest): TIMEOUT = 120 # publish timeout + TEST_DATA_FOLDER = None # provide existing folder with test data + @pytest.fixture(scope="module") def last_workfile_path(self, download_test_data): """Get last_workfile_path from source data. - Maya expects workfile in proper folder, so copy is done first. """ log.info("log last_workfile_path") src_path = os.path.join( @@ -50,17 +51,8 @@ class TestPublishInNuke(PublishTest): "input", "workfile", "test_project_test_asset_CompositingInNuke_v001.nk") - dest_folder = os.path.join(download_test_data, - self.PROJECT, - self.ASSET, - "work", - self.TASK) - os.makedirs(dest_folder) - dest_path = os.path.join( - dest_folder, "test_project_test_asset_CompositingInNuke_v001.nk") - shutil.copy(src_path, dest_path) - yield dest_path + yield src_path @pytest.fixture(scope="module") def startup_scripts(self, monkeypatch_session, download_test_data): diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index 59d4abb3aa..aa8ef3caab 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -45,6 +45,8 @@ class ModuleUnitTest(BaseTest): ASSET = "test_asset" TASK = "test_task" + TEST_DATA_FOLDER = None + @pytest.fixture(scope='session') def monkeypatch_session(self): """Monkeypatch couldn't be used with module or session fixtures.""" @@ -55,24 +57,28 @@ class ModuleUnitTest(BaseTest): @pytest.fixture(scope="module") def download_test_data(self): - tmpdir = tempfile.mkdtemp() - for test_file in self.TEST_FILES: - file_id, file_name, md5 = test_file + if self.TEST_DATA_FOLDER: + print("Using existing folder {}".format(self.TEST_DATA_FOLDER)) + yield self.TEST_DATA_FOLDER + else: + tmpdir = tempfile.mkdtemp() + for test_file in self.TEST_FILES: + file_id, file_name, md5 = test_file - f_name, ext = os.path.splitext(file_name) + f_name, ext = os.path.splitext(file_name) - RemoteFileHandler.download_file_from_google_drive(file_id, - str(tmpdir), - file_name) + RemoteFileHandler.download_file_from_google_drive(file_id, + str(tmpdir), + file_name) - if ext.lstrip('.') in RemoteFileHandler.IMPLEMENTED_ZIP_FORMATS: - RemoteFileHandler.unzip(os.path.join(tmpdir, file_name)) - print("Temporary folder created:: {}".format(tmpdir)) - yield tmpdir + if ext.lstrip('.') in RemoteFileHandler.IMPLEMENTED_ZIP_FORMATS: #noqa E501 + RemoteFileHandler.unzip(os.path.join(tmpdir, file_name)) + print("Temporary folder created:: {}".format(tmpdir)) + yield tmpdir - if not self.PERSIST: - print("Removing {}".format(tmpdir)) - shutil.rmtree(tmpdir) + if not self.PERSIST: + print("Removing {}".format(tmpdir)) + shutil.rmtree(tmpdir) @pytest.fixture(scope="module") def env_var(self, monkeypatch_session, download_test_data): From 88218caf2869d8452b734ed4712fa224a540b0c6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 15:56:11 +0100 Subject: [PATCH 075/341] store OpenPypeVersion to sys.modules --- igniter/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/igniter/__init__.py b/igniter/__init__.py index defd45e233..bbc3dbfc88 100644 --- a/igniter/__init__.py +++ b/igniter/__init__.py @@ -6,9 +6,15 @@ import sys os.chdir(os.path.dirname(__file__)) # for override sys.path in Deadline -from .bootstrap_repos import BootstrapRepos +from .bootstrap_repos import ( + BootstrapRepos, + OpenPypeVersion +) from .version import __version__ as version +if "OpenPypeVersion" not in sys.modules: + sys.modules["OpenPypeVersion"] = OpenPypeVersion + def open_dialog(): """Show Igniter dialog.""" From 2bfdc5c3e970b1747e39b3ed16f439fe4d0e59d2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 16:05:36 +0100 Subject: [PATCH 076/341] create new enum entities used to determine openpype version --- openpype/settings/entities/__init__.py | 6 ++- openpype/settings/entities/enum_entity.py | 52 +++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/openpype/settings/entities/__init__.py b/openpype/settings/entities/__init__.py index ccf2a5993e..e4a13b8053 100644 --- a/openpype/settings/entities/__init__.py +++ b/openpype/settings/entities/__init__.py @@ -106,7 +106,9 @@ from .enum_entity import ( ToolsEnumEntity, TaskTypeEnumEntity, DeadlineUrlEnumEntity, - AnatomyTemplatesEnumEntity + AnatomyTemplatesEnumEntity, + ProductionVersionsEnumEntity, + StagingVersionsEnumEntity ) from .list_entity import ListEntity @@ -169,6 +171,8 @@ __all__ = ( "TaskTypeEnumEntity", "DeadlineUrlEnumEntity", "AnatomyTemplatesEnumEntity", + "ProductionVersionsEnumEntity", + "StagingVersionsEnumEntity", "ListEntity", diff --git a/openpype/settings/entities/enum_entity.py b/openpype/settings/entities/enum_entity.py index ab3cebbd42..5f0cbb1261 100644 --- a/openpype/settings/entities/enum_entity.py +++ b/openpype/settings/entities/enum_entity.py @@ -1,4 +1,5 @@ import copy +import sys from .input_entities import InputEntity from .exceptions import EntitySchemaError from .lib import ( @@ -564,3 +565,54 @@ class AnatomyTemplatesEnumEntity(BaseEnumEntity): 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 + + +class _OpenPypeVersionEnum(BaseEnumEntity): + def _item_initialization(self): + self.multiselection = False + self.valid_value_types = (STRING_TYPE, ) + + self.value_on_not_set = "" + items = [ + {"": "Latest"} + ] + items.extend(self._get_openpype_versions()) + + self.enum_items = items + self.valid_keys = { + tuple(item.keys())[0] + for item in items + } + + def _get_openpype_versions(self): + return [] + + +class ProductionVersionsEnumEntity(_OpenPypeVersionEnum): + schema_types = ["production-versions-enum"] + + def _get_openpype_versions(self): + items = [] + if "OpenPypeVersion" in sys.modules: + OpenPypeVersion = sys.modules["OpenPypeVersion"] + versions = OpenPypeVersion.get_available_versions( + staging=False, local=False + ) + for item in versions: + items.append({item: item}) + return items + + +class StagingVersionsEnumEntity(_OpenPypeVersionEnum): + schema_types = ["staging-versions-enum"] + + def _get_openpype_versions(self): + items = [] + if "OpenPypeVersion" in sys.modules: + OpenPypeVersion = sys.modules["OpenPypeVersion"] + versions = OpenPypeVersion.get_available_versions( + staging=False, local=False + ) + for item in versions: + items.append({item: item}) + return items From 27b1be9279152b7fde4c3fbd5bb9d2d507cfc299 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 16:05:49 +0100 Subject: [PATCH 077/341] use new enities in settings --- .../settings/defaults/system_settings/general.json | 2 ++ .../schemas/system_schema/schema_general.json | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/openpype/settings/defaults/system_settings/general.json b/openpype/settings/defaults/system_settings/general.json index f54e8b2b16..a07152eaf8 100644 --- a/openpype/settings/defaults/system_settings/general.json +++ b/openpype/settings/defaults/system_settings/general.json @@ -2,6 +2,8 @@ "studio_name": "Studio name", "studio_code": "stu", "admin_password": "", + "production_version": "", + "staging_version": "", "environment": { "__environment_keys__": { "global": [] diff --git a/openpype/settings/entities/schemas/system_schema/schema_general.json b/openpype/settings/entities/schemas/system_schema/schema_general.json index 51a58a6e27..d548a22c97 100644 --- a/openpype/settings/entities/schemas/system_schema/schema_general.json +++ b/openpype/settings/entities/schemas/system_schema/schema_general.json @@ -30,6 +30,19 @@ { "type": "splitter" }, + { + "type": "production-versions-enum", + "key": "production_version", + "label": "Production version" + }, + { + "type": "staging-versions-enum", + "key": "staging_version", + "label": "Staging version" + }, + { + "type": "splitter" + }, { "key": "environment", "label": "Environment", From ab8dacd0f8cc4e7f578695a6a5159472876ea1aa Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 16:06:04 +0100 Subject: [PATCH 078/341] added "production_version" and "staging_version" to global settings --- openpype/settings/handlers.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/openpype/settings/handlers.py b/openpype/settings/handlers.py index c59e2bc542..51e390bb6d 100644 --- a/openpype/settings/handlers.py +++ b/openpype/settings/handlers.py @@ -168,7 +168,13 @@ class CacheValues: class MongoSettingsHandler(SettingsHandler): """Settings handler that use mongo for storing and loading of settings.""" - global_general_keys = ("openpype_path", "admin_password", "disk_mapping") + global_general_keys = ( + "openpype_path", + "admin_password", + "disk_mapping", + "production_version", + "staging_version" + ) def __init__(self): # Get mongo connection From d0ada90e44a4746f2dcb154a0e46d0e77998c958 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 Dec 2021 16:18:07 +0100 Subject: [PATCH 079/341] OP-2042 - added functionality to implicit choose variant If APP_VARIANT is empty it looks for latest installed variant of an application --- .../hosts/maya/test_publish_in_maya.py | 7 +++---- .../hosts/nuke/test_publish_in_nuke.py | 5 ++--- .../photoshop/test_publish_in_photoshop.py | 7 +++---- tests/lib/testing_classes.py | 19 +++++++++++++++---- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/tests/integration/hosts/maya/test_publish_in_maya.py b/tests/integration/hosts/maya/test_publish_in_maya.py index b53b26f66d..687e6fbc6e 100644 --- a/tests/integration/hosts/maya/test_publish_in_maya.py +++ b/tests/integration/hosts/maya/test_publish_in_maya.py @@ -26,16 +26,15 @@ class TestPublishInMaya(PublishTest): {OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests ../tests/integration/hosts/maya # noqa: E501 """ - PERSIST = True + PERSIST = False TEST_FILES = [ ("1BTSIIULJTuDc8VvXseuiJV_fL6-Bu7FP", "test_maya_publish.zip", "") ] APP = "maya" - APP_VARIANT = "2019" - - APP_NAME = "{}/{}".format(APP, APP_VARIANT) + # keep empty to locate latest installed variant or explicit + APP_VARIANT = "" TIMEOUT = 120 # publish timeout diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py index 483e9fef98..14a79fdf3d 100644 --- a/tests/integration/hosts/nuke/test_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -32,9 +32,8 @@ class TestPublishInNuke(PublishTest): ] APP = "nuke" - APP_VARIANT = "12-2" - - APP_NAME = "{}/{}".format(APP, APP_VARIANT) + # keep empty to locate latest installed variant or explicit + APP_VARIANT = "" TIMEOUT = 120 # publish timeout diff --git a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py index 43e03b2cc3..c7f2399494 100644 --- a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py +++ b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py @@ -24,16 +24,15 @@ class TestPublishInPhotoshop(PublishTest): {OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests ../tests/integration/hosts/photoshop # noqa: E501 """ - PERSIST = True + PERSIST = False TEST_FILES = [ ("1zD2v5cBgkyOm_xIgKz3WKn8aFB_j8qC-", "test_photoshop_publish.zip", "") ] APP = "photoshop" - APP_VARIANT = "2021" - - APP_NAME = "{}/{}".format(APP, APP_VARIANT) + # keep empty to locate latest installed variant or explicit + APP_VARIANT = "" TIMEOUT = 120 # publish timeout diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index aa8ef3caab..bf1c490ecd 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -11,6 +11,8 @@ import glob from tests.lib.db_handler import DBHandler from tests.lib.file_handler import RemoteFileHandler +from openpype.lib.remote_publish import find_variant_key + class BaseTest: """Empty base test class""" @@ -173,12 +175,15 @@ class PublishTest(ModuleUnitTest): """ APP = "" - APP_VARIANT = "" - - APP_NAME = "{}/{}".format(APP, APP_VARIANT) + APP_VARIANT = "" # keep empty to locate latest installed variant TIMEOUT = 120 # publish timeout + @property + def app_name(self): + if self.APP_VARIANT: + return "{}/{}".format(self.APP, self.APP_VARIANT) + @pytest.fixture(scope="module") def last_workfile_path(self, download_test_data): raise NotImplementedError @@ -224,7 +229,13 @@ class PublishTest(ModuleUnitTest): "task_name": self.TASK } - yield application_manager.launch(self.APP_NAME, **data) + variant = self.APP_VARIANT + if not variant: + variant = find_variant_key(application_manager, self.APP) + + app_name = "{}/{}".format(self.APP, variant) + + yield application_manager.launch(app_name, **data) @pytest.fixture(scope="module") def publish_finished(self, dbcon, launched_app, download_test_data): From b61b3634b289406469e08ab3a9617860ef979840 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 Dec 2021 16:20:31 +0100 Subject: [PATCH 080/341] OP-2042 - Hound --- tests/integration/hosts/nuke/test_publish_in_nuke.py | 1 - tests/lib/testing_classes.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py index 14a79fdf3d..fe1745299d 100644 --- a/tests/integration/hosts/nuke/test_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -1,6 +1,5 @@ import pytest import os -import shutil import logging from tests.lib.testing_classes import PublishTest diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index bf1c490ecd..92b2b2b52b 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -73,7 +73,7 @@ class ModuleUnitTest(BaseTest): str(tmpdir), file_name) - if ext.lstrip('.') in RemoteFileHandler.IMPLEMENTED_ZIP_FORMATS: #noqa E501 + if ext.lstrip('.') in RemoteFileHandler.IMPLEMENTED_ZIP_FORMATS: # noqa: E501 RemoteFileHandler.unzip(os.path.join(tmpdir, file_name)) print("Temporary folder created:: {}".format(tmpdir)) yield tmpdir From 89490f4b14815d402c12ab8680e69c3241760da5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20LORRAIN?= Date: Fri, 3 Dec 2021 17:22:27 +0100 Subject: [PATCH 081/341] add maya default render folder path to settings --- .../maya/plugins/publish/validate_render_image_rule.py | 8 +++++++- .../deadline/plugins/publish/submit_maya_deadline.py | 7 ++++++- openpype/settings/defaults/project_settings/maya.json | 3 ++- .../projects_schema/schemas/schema_maya_create.json | 5 +++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/validate_render_image_rule.py b/openpype/hosts/maya/plugins/publish/validate_render_image_rule.py index dad1691149..e892b239cc 100644 --- a/openpype/hosts/maya/plugins/publish/validate_render_image_rule.py +++ b/openpype/hosts/maya/plugins/publish/validate_render_image_rule.py @@ -23,7 +23,13 @@ class ValidateRenderImageRule(pyblish.api.InstancePlugin): def process(self, instance): - assert get_file_rule("images") == "renders", ( + default_render_file = instance.context.data.get('project_settings')\ + .get('maya') \ + .get('create') \ + .get('CreateRender') \ + .get('default_render_image_folder') + + assert get_file_rule("images") == default_render_file, ( "Workspace's `images` file rule must be set to: renders" ) diff --git a/openpype/modules/default_modules/deadline/plugins/publish/submit_maya_deadline.py b/openpype/modules/default_modules/deadline/plugins/publish/submit_maya_deadline.py index e6c42374ca..51a19e2aad 100644 --- a/openpype/modules/default_modules/deadline/plugins/publish/submit_maya_deadline.py +++ b/openpype/modules/default_modules/deadline/plugins/publish/submit_maya_deadline.py @@ -394,9 +394,14 @@ class MayaSubmitDeadline(pyblish.api.InstancePlugin): self.log.debug(filepath) # Gather needed data ------------------------------------------------ + default_render_file = instance.context.data.get('project_settings')\ + .get('maya')\ + .get('create')\ + .get('CreateRender')\ + .get('default_render_image_folder') filename = os.path.basename(filepath) comment = context.data.get("comment", "") - dirname = os.path.join(workspace, "renders") + dirname = os.path.join(workspace, default_render_file) renderlayer = instance.data['setMembers'] # rs_beauty deadline_user = context.data.get("user", getpass.getuser()) jobname = "%s - %s" % (filename, instance.name) diff --git a/openpype/settings/defaults/project_settings/maya.json b/openpype/settings/defaults/project_settings/maya.json index 73c75ef3ee..cbcf8cd600 100644 --- a/openpype/settings/defaults/project_settings/maya.json +++ b/openpype/settings/defaults/project_settings/maya.json @@ -43,7 +43,8 @@ "defaults": [ "Main" ], - "aov_separator": "underscore" + "aov_separator": "underscore", + "default_render_image_folder": "renders" }, "CreateAnimation": { "enabled": true, diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_create.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_create.json index e50357cc40..088d5d1f96 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_create.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_create.json @@ -58,6 +58,11 @@ {"underscore": "_ (underscore)"}, {"dot": ". (dot)"} ] + }, + { + "type": "text", + "key": "default_render_image_folder", + "label": "Default render image folder" } ] }, From efa7bffe066cac6afcb68616f7196dadfb4df53d Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 Dec 2021 17:33:50 +0100 Subject: [PATCH 082/341] OP-2042 - added a bit of documentation --- tests/integration/README.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/tests/integration/README.md b/tests/integration/README.md index 81c07ec50c..aeed53d097 100644 --- a/tests/integration/README.md +++ b/tests/integration/README.md @@ -5,16 +5,23 @@ Contains end-to-end tests for automatic testing of OP. Should run headless publish on all hosts to check basic publish use cases automatically to limit regression issues. +How to run +---------- +- activate `{OPENPYPE_ROOT}/.venv` +- run in cmd +`{OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests {OPENPYPE_ROOT}/tests/integration` + - add `hosts/APP_NAME` after integration part to limit only on specific app (eg. `{OPENPYPE_ROOT}/tests/integration/hosts/maya`) + How to create test for publishing from host ------------------------------------------ -- Extend PublishTest +- Extend PublishTest in `tests/lib/testing_classes.py` - Use `resources\test_data.zip` skeleton file as a template for testing input data - Put workfile into `test_data.zip/input/workfile` - If you require other than base DB dumps provide them to `test_data.zip/input/dumps` -- (Check commented code in `db_handler.py` how to dump specific DB. Currently all collections will be dumped.) - Implement `last_workfile_path` - `startup_scripts` - must contain pointing host to startup script saved into `test_data.zip/input/startup` - -- Script must contain something like + -- Script must contain something like (pseudocode) ``` import openpype from avalon import api, HOST @@ -25,13 +32,18 @@ pyblish.util.publish() EXIT_APP (command to exit host) ``` (Install and publish methods must be triggered only AFTER host app is fully initialized!) -- Zip `test_data.zip`, named it with descriptive name, upload it to Google Drive, right click - `Get link`, copy hash id +- If you would like add any command line arguments for your host app add it to `test_data.zip/input/app_args/app_args.json` (as a json list) +- Provide any required environment variables to `test_data.zip/input/env_vars/env_vars.json` (as a json dictionary) +- Zip `test_data.zip`, named it with descriptive name, upload it to Google Drive, right click - `Get link`, copy hash id (file must be accessible to anyone with a link!) - Put this hash id and zip file name into TEST_FILES [(HASH_ID, FILE_NAME, MD5_OPTIONAL)]. If you want to check MD5 of downloaded file, provide md5 value of zipped file. - Implement any assert checks you need in extended class - Run test class manually (via Pycharm or pytest runner (TODO)) -- If you want test to compare expected files to published one, set PERSIST to True, run test manually +- If you want test to visually compare expected files to published one, set PERSIST to True, run test manually -- Locate temporary `publish` subfolder of temporary folder (found in debugging console log) -- Copy whole folder content into .zip file into `expected` subfolder -- By default tests are comparing only structure of `expected` and published format (eg. if you want to save space, replace published files with empty files, but with expected names!) - -- Zip and upload again, change PERSIST to False \ No newline at end of file + -- Zip and upload again, change PERSIST to False + +- Use `TEST_DATA_FOLDER` variable in your class to reuse existing downloaded and unzipped test data (for faster creation of tests) +- Keep `APP_VARIANT` empty if you want to trigger test on latest version of app, or provide explicit value (as '2022' for Photoshop for example) \ No newline at end of file From 8eb7a30358275f47ca21691dca221fc00f2b4d57 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 Dec 2021 17:38:02 +0100 Subject: [PATCH 083/341] OP-2042 - added a functionality to inject additional command line arguments --- openpype/lib/applications.py | 2 ++ tests/lib/testing_classes.py | 30 +++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/openpype/lib/applications.py b/openpype/lib/applications.py index 30be92e886..6eb44a9694 100644 --- a/openpype/lib/applications.py +++ b/openpype/lib/applications.py @@ -716,6 +716,8 @@ class ApplicationLaunchContext: # subprocess.Popen launch arguments (first argument in constructor) self.launch_args = executable.as_args() self.launch_args.extend(application.arguments) + if self.data.get("app_args"): + self.launch_args.extend(self.data.pop("app_args")) # Handle launch environemtns env = self.data.pop("env", None) diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index 92b2b2b52b..15ab685739 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -192,9 +192,35 @@ class PublishTest(ModuleUnitTest): def startup_scripts(self, monkeypatch_session, download_test_data): raise NotImplementedError + @pytest.fixture(scope="module") + def app_args(self, download_test_data): + """Returns additional application arguments from a test file. + + Test zip file should contain file at: + FOLDER_DIR/input/app_args/app_args.json + containing a list of command line arguments (like '-x' etc.) + """ + app_args = [] + args_url = os.path.join(download_test_data, "input", + "app_args", "app_args.json") + if not os.path.exists(args_url): + print("App argument file {} doesn't exist".format(args_url)) + else: + try: + with open(args_url) as json_file: + app_args = json.load(json_file) + + if not isinstance(app_args, list): + raise ValueError + except ValueError: + print("{} doesn't contain valid JSON".format(args_url)) + six.reraise(*sys.exc_info()) + + yield app_args + @pytest.fixture(scope="module") def launched_app(self, dbcon, download_test_data, last_workfile_path, - startup_scripts): + startup_scripts, app_args): """Launch host app""" # set publishing folders root_key = "config.roots.work.{}".format("windows") # TEMP @@ -228,6 +254,8 @@ class PublishTest(ModuleUnitTest): "asset_name": self.ASSET, "task_name": self.TASK } + if app_args: + data["app_args"] = app_args variant = self.APP_VARIANT if not variant: From 80d887f14e80a1c2862343f1407280c1341a44ec Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 17:44:49 +0100 Subject: [PATCH 084/341] added 3 method related to openpype path --- igniter/bootstrap_repos.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index ca64d193c7..921557b1a0 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -346,6 +346,37 @@ class OpenPypeVersion(semver.VersionInfo): return version['__version__'] + @classmethod + def get_openpype_path(cls): + """Path to openpype zip directory. + + Path can be set through environment variable 'OPENPYPE_PATH' which + is set during start of OpenPype if is not available. + """ + return os.getenv("OPENPYPE_PATH") + + @classmethod + def openpype_path_is_set(cls): + """Path to OpenPype zip directory is set.""" + if cls.get_openpype_path(): + return True + return False + + @classmethod + def openpype_path_is_accessible(cls): + """Path to OpenPype zip directory is accessible. + + Exists for this machine. + """ + # First check if is set + if not cls.openpype_path_is_set(): + return False + + # Validate existence + if Path(cls.get_openpype_path()).exists(): + return True + return False + @staticmethod def get_available_versions( staging: bool = False, local: bool = False) -> List: From 494bd26d80e41e0169344442ae2b773642e4191f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 18:04:18 +0100 Subject: [PATCH 085/341] created OpenPypeVersion wrapper in openpype lib --- openpype/lib/openpype_version.py | 59 ++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 openpype/lib/openpype_version.py diff --git a/openpype/lib/openpype_version.py b/openpype/lib/openpype_version.py new file mode 100644 index 0000000000..4d1a1a7bb8 --- /dev/null +++ b/openpype/lib/openpype_version.py @@ -0,0 +1,59 @@ +"""Lib access to OpenPypeVersion from igniter. + +Access to logic from igniter is available only for OpenPype processes. +Is meant to be able check OpenPype versions for studio. The logic is dependent +on igniter's logic of processing. +""" + +import sys + + +def get_OpenPypeVersion(): + """Access to OpenPypeVersion class stored in sys modules.""" + return sys.modules.get("OpenPypeVersion") + + +def op_version_control_available(): + """Check if current process has access to OpenPypeVersion.""" + if get_OpenPypeVersion() is None: + return False + return True + + +def get_available_versions(*args, **kwargs): + """Get list of available versions.""" + if op_version_control_available(): + return get_OpenPypeVersion().get_available_versions( + *args, **kwargs + ) + return None + + +def openpype_path_is_set(): + if op_version_control_available(): + return get_OpenPypeVersion().openpype_path_is_set() + return None + + +def openpype_path_is_accessible(): + if op_version_control_available(): + return get_OpenPypeVersion().openpype_path_is_accessible() + return None + + +def get_latest_version(): + if op_version_control_available(): + return get_OpenPypeVersion().get_latest_version() + return None + + +def get_production_version(): + if op_version_control_available(): + return get_OpenPypeVersion().get_production_version() + return None + + +def get_staging_version(): + if op_version_control_available(): + return get_OpenPypeVersion().get_staging_version() + return None From cc1cc49235f288ba95d8d213e5fe16a8c67d397f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 18:06:52 +0100 Subject: [PATCH 086/341] added logic to load data for version entities --- openpype/settings/entities/enum_entity.py | 75 ++++++++++++++++++----- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/openpype/settings/entities/enum_entity.py b/openpype/settings/entities/enum_entity.py index 5f0cbb1261..591b2dd94f 100644 --- a/openpype/settings/entities/enum_entity.py +++ b/openpype/settings/entities/enum_entity.py @@ -1,8 +1,15 @@ import copy import sys +from openpype.lib.openpype_version import ( + op_version_control_available, + get_available_versions, + openpype_path_is_set, + openpype_path_is_accessible +) from .input_entities import InputEntity from .exceptions import EntitySchemaError from .lib import ( + OverrideState, NOT_SET, STRING_TYPE ) @@ -573,46 +580,84 @@ class _OpenPypeVersionEnum(BaseEnumEntity): self.valid_value_types = (STRING_TYPE, ) self.value_on_not_set = "" - items = [ - {"": "Latest"} - ] - items.extend(self._get_openpype_versions()) + items = self._get_default_items() self.enum_items = items - self.valid_keys = { + self.valid_keys = self._extract_valid_keys(items) + + def _extract_valid_keys(self, items): + return { tuple(item.keys())[0] for item in items } + def _get_default_items(self): + return [ + {"": "Latest"} + ] + def _get_openpype_versions(self): return [] + def set_override_state(self, state, *args, **kwargs): + items = self._get_default_items() + versions = self._get_openpype_versions() + if versions is not None: + for version in versions: + items.append({version: version}) + + self.enum_items = items + self.valid_keys = self._extract_valid_keys(items) + + # Studio value is not available in collected versions + if ( + state is OverrideState.STUDIO + and self.had_studio_override + and self._studio_override_value not in self.valid_keys + ): + # Define if entity should keep the value in settings. + # Value is marked as not existing anymore if + # - openpype version control is available + # - path to openpype zips is set + # - path to openpype zips is accessible (existing for this machine) + keep_value = True + if ( + op_version_control_available() + and openpype_path_is_set() + and openpype_path_is_accessible() + ): + keep_value = False + + if keep_value: + self.enum_items.append( + {self._studio_override_value: self._studio_override_value} + ) + self.valid_keys.add(self._studio_override_value) + + super(_OpenPypeVersionEnum, self).set_override_state( + state, *args, **kwargs + ) + class ProductionVersionsEnumEntity(_OpenPypeVersionEnum): schema_types = ["production-versions-enum"] def _get_openpype_versions(self): - items = [] if "OpenPypeVersion" in sys.modules: OpenPypeVersion = sys.modules["OpenPypeVersion"] - versions = OpenPypeVersion.get_available_versions( + return get_available_versions( staging=False, local=False ) - for item in versions: - items.append({item: item}) - return items + return None class StagingVersionsEnumEntity(_OpenPypeVersionEnum): schema_types = ["staging-versions-enum"] def _get_openpype_versions(self): - items = [] if "OpenPypeVersion" in sys.modules: OpenPypeVersion = sys.modules["OpenPypeVersion"] - versions = OpenPypeVersion.get_available_versions( + return get_available_versions( staging=False, local=False ) - for item in versions: - items.append({item: item}) - return items + return None From e9b0347d8309705da17a57463f59a95bb8d1a042 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 18:26:30 +0100 Subject: [PATCH 087/341] changed static method to class method --- igniter/bootstrap_repos.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 921557b1a0..5cade8324c 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -377,9 +377,9 @@ class OpenPypeVersion(semver.VersionInfo): return True return False - @staticmethod + @classmethod def get_available_versions( - staging: bool = False, local: bool = False) -> List: + cls, staging: bool = False, local: bool = False) -> List: """Get ordered dict of detected OpenPype version. Resolution order for OpenPype is following: From 6762d6645957dc177796a067c64856fafe6096b2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 18:26:54 +0100 Subject: [PATCH 088/341] added functions to retrieve local and remote versions separatelly --- igniter/bootstrap_repos.py | 84 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 5cade8324c..c52175c8fd 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -377,6 +377,90 @@ class OpenPypeVersion(semver.VersionInfo): return True return False + @classmethod + def get_local_versions( + cls, production: bool = None, staging: bool = None + ) -> List: + """Get all versions available on this machine. + + Arguments give ability to specify if filtering is needed. If both + arguments are set to None all found versions are returned. + + Args: + production (bool): Return production versions. + staging (bool): Return staging versions. + """ + # Return all local versions if arguments are set to None + if production is None and staging is None: + production = True + staging = True + + # Just return empty output if both are disabled + elif not production and not staging: + return [] + + dir_to_search = Path(user_data_dir("openpype", "pypeclub")) + versions = OpenPypeVersion.get_versions_from_directory( + dir_to_search + ) + filtered_versions = [] + for version in versions: + if version.is_staging(): + if staging: + filtered_versions.append(version) + elif production: + filtered_versions.append(version) + return list(sorted(set(filtered_versions))) + + @classmethod + def get_remote_versions( + cls, production: bool = None, staging: bool = None + ) -> List: + """Get all versions available in OpenPype Path. + + Arguments give ability to specify if filtering is needed. If both + arguments are set to None all found versions are returned. + + Args: + production (bool): Return production versions. + staging (bool): Return staging versions. + """ + # Return all local versions if arguments are set to None + if production is None and staging is None: + production = True + staging = True + + # Just return empty output if both are disabled + elif not production and not staging: + return [] + + dir_to_search = None + if cls.openpype_path_is_accessible(): + dir_to_search = Path(cls.get_openpype_path()) + else: + registry = OpenPypeSettingsRegistry() + try: + registry_dir = Path(str(registry.get_item("openPypePath"))) + if registry_dir.exists(): + dir_to_search = registry_dir + + except ValueError: + # nothing found in registry, we'll use data dir + pass + + if not dir_to_search: + return [] + + versions = cls.get_versions_from_directory(dir_to_search) + filtered_versions = [] + for version in versions: + if version.is_staging(): + if staging: + filtered_versions.append(version) + elif production: + filtered_versions.append(version) + return list(sorted(set(filtered_versions))) + @classmethod def get_available_versions( cls, staging: bool = False, local: bool = False) -> List: From 73f29819873c632111a3a2b3a644afc36f04509a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 18:27:14 +0100 Subject: [PATCH 089/341] use new functions in get_available_versions --- igniter/bootstrap_repos.py | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index c52175c8fd..5bb7296d3d 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -479,29 +479,11 @@ class OpenPypeVersion(semver.VersionInfo): local (bool, optional): List only local versions. """ - registry = OpenPypeSettingsRegistry() - dir_to_search = Path(user_data_dir("openpype", "pypeclub")) - user_versions = OpenPypeVersion.get_versions_from_directory( - dir_to_search) + user_versions = cls.get_local_versions() # if we have openpype_path specified, search only there. - + openpype_versions = [] if not local: - if os.getenv("OPENPYPE_PATH"): - if Path(os.getenv("OPENPYPE_PATH")).exists(): - dir_to_search = Path(os.getenv("OPENPYPE_PATH")) - else: - try: - registry_dir = Path( - str(registry.get_item("openPypePath"))) - if registry_dir.exists(): - dir_to_search = registry_dir - - except ValueError: - # nothing found in registry, we'll use data dir - pass - - openpype_versions = OpenPypeVersion.get_versions_from_directory( - dir_to_search) + openpype_versions = cls.get_remote_versions() openpype_versions += user_versions # remove duplicates and staging/production From a14662bccee58dd50faeb887842889ae7dc63ff1 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 18:35:21 +0100 Subject: [PATCH 090/341] fix args conditions --- igniter/bootstrap_repos.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 5bb7296d3d..94f786e869 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -395,8 +395,14 @@ class OpenPypeVersion(semver.VersionInfo): production = True staging = True + elif production is None and not staging: + production = True + + elif staging is None and not production: + staging = True + # Just return empty output if both are disabled - elif not production and not staging: + if not production and not staging: return [] dir_to_search = Path(user_data_dir("openpype", "pypeclub")) @@ -430,8 +436,14 @@ class OpenPypeVersion(semver.VersionInfo): production = True staging = True + elif production is None and not staging: + production = True + + elif staging is None and not production: + staging = True + # Just return empty output if both are disabled - elif not production and not staging: + if not production and not staging: return [] dir_to_search = None From 1567afc4b9ba205669f3e716a96efb8963c5e79c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 18:35:34 +0100 Subject: [PATCH 091/341] extended available functions --- openpype/lib/openpype_version.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/openpype/lib/openpype_version.py b/openpype/lib/openpype_version.py index 4d1a1a7bb8..42ee454378 100644 --- a/openpype/lib/openpype_version.py +++ b/openpype/lib/openpype_version.py @@ -41,19 +41,31 @@ def openpype_path_is_accessible(): return None -def get_latest_version(): +def get_local_versions(*args, **kwargs): if op_version_control_available(): - return get_OpenPypeVersion().get_latest_version() + return get_OpenPypeVersion().get_local_versions(*args, **kwargs) return None -def get_production_version(): +def get_remote_versions(*args, **kwargs): + if op_version_control_available(): + return get_OpenPypeVersion().get_remote_versions(*args, **kwargs) + return None + + +def get_latest_version(*args, **kwargs): + if op_version_control_available(): + return get_OpenPypeVersion().get_latest_version(*args, **kwargs) + return None + + +def get_current_production_version(): if op_version_control_available(): return get_OpenPypeVersion().get_production_version() return None -def get_staging_version(): +def get_current_staging_version(): if op_version_control_available(): return get_OpenPypeVersion().get_staging_version() return None From 7aec21aa800dc225fbc5d2db9f46e8defcd26f29 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 3 Dec 2021 18:35:45 +0100 Subject: [PATCH 092/341] use extended functions in entities --- openpype/settings/entities/enum_entity.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/openpype/settings/entities/enum_entity.py b/openpype/settings/entities/enum_entity.py index 591b2dd94f..534775a41d 100644 --- a/openpype/settings/entities/enum_entity.py +++ b/openpype/settings/entities/enum_entity.py @@ -2,7 +2,7 @@ import copy import sys from openpype.lib.openpype_version import ( op_version_control_available, - get_available_versions, + get_remote_versions, openpype_path_is_set, openpype_path_is_accessible ) @@ -645,9 +645,7 @@ class ProductionVersionsEnumEntity(_OpenPypeVersionEnum): def _get_openpype_versions(self): if "OpenPypeVersion" in sys.modules: OpenPypeVersion = sys.modules["OpenPypeVersion"] - return get_available_versions( - staging=False, local=False - ) + return get_remote_versions(production=True) return None @@ -657,7 +655,5 @@ class StagingVersionsEnumEntity(_OpenPypeVersionEnum): def _get_openpype_versions(self): if "OpenPypeVersion" in sys.modules: OpenPypeVersion = sys.modules["OpenPypeVersion"] - return get_available_versions( - staging=False, local=False - ) + return get_remote_versions(staging=True) return None From b3ec2fe524dfd05ab60ef88649f40aa4b29ce3f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20LORRAIN?= Date: Mon, 6 Dec 2021 10:28:56 +0100 Subject: [PATCH 093/341] Use the setting in CollectRender --- openpype/hosts/maya/plugins/publish/collect_render.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_render.py b/openpype/hosts/maya/plugins/publish/collect_render.py index 580d459a90..e26859ad93 100644 --- a/openpype/hosts/maya/plugins/publish/collect_render.py +++ b/openpype/hosts/maya/plugins/publish/collect_render.py @@ -221,14 +221,18 @@ class CollectMayaRender(pyblish.api.ContextPlugin): # append full path full_exp_files = [] aov_dict = {} - + default_render_file = context.data.get('project_settings')\ + .get('maya')\ + .get('create')\ + .get('CreateRender')\ + .get('default_render_image_folder') # replace relative paths with absolute. Render products are # returned as list of dictionaries. publish_meta_path = None for aov in exp_files: full_paths = [] for file in aov[aov.keys()[0]]: - full_path = os.path.join(workspace, "renders", file) + full_path = os.path.join(workspace, default_render_file, file) full_path = full_path.replace("\\", "/") full_paths.append(full_path) publish_meta_path = os.path.dirname(full_path) From ca1516fa13b03409c160f3c0f97785143d59fd4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20LORRAIN?= Date: Mon, 6 Dec 2021 10:45:22 +0100 Subject: [PATCH 094/341] Fix syntax --- openpype/hosts/maya/plugins/publish/collect_render.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_render.py b/openpype/hosts/maya/plugins/publish/collect_render.py index e26859ad93..788ed12b41 100644 --- a/openpype/hosts/maya/plugins/publish/collect_render.py +++ b/openpype/hosts/maya/plugins/publish/collect_render.py @@ -222,17 +222,18 @@ class CollectMayaRender(pyblish.api.ContextPlugin): full_exp_files = [] aov_dict = {} default_render_file = context.data.get('project_settings')\ - .get('maya')\ - .get('create')\ - .get('CreateRender')\ - .get('default_render_image_folder') + .get('maya')\ + .get('create')\ + .get('CreateRender')\ + .get('default_render_image_folder') # replace relative paths with absolute. Render products are # returned as list of dictionaries. publish_meta_path = None for aov in exp_files: full_paths = [] for file in aov[aov.keys()[0]]: - full_path = os.path.join(workspace, default_render_file, file) + full_path = os.path.join(workspace, default_render_file, + file) full_path = full_path.replace("\\", "/") full_paths.append(full_path) publish_meta_path = os.path.dirname(full_path) From 8f0f0769800645e4966fc1e301ce3c1e97bde925 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 6 Dec 2021 11:51:35 +0100 Subject: [PATCH 095/341] added functions to get expected studio version --- igniter/bootstrap_repos.py | 23 ++++++++++++++++++++++- igniter/tools.py | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 94f786e869..9446b3e8ce 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -22,7 +22,10 @@ from .user_settings import ( OpenPypeSecureRegistry, OpenPypeSettingsRegistry ) -from .tools import get_openpype_path_from_db +from .tools import ( + get_openpype_path_from_db, + get_expected_studio_version_str +) LOG_INFO = 0 @@ -571,6 +574,24 @@ class OpenPypeVersion(semver.VersionInfo): return openpype_versions[-1] + @classmethod + def get_expected_studio_version(cls, staging=False): + """Expected OpenPype version that should be used at the moment. + + If version is not defined in settings the latest found version is + used. + + Args: + staging (bool): Staging version or production version. + + Returns: + OpenPypeVersion: Version that should be used. + """ + result = get_expected_studio_version_str(staging) + if not result: + return cls.get_latest_version(staging, False) + return OpenPypeVersion(version=result) + class BootstrapRepos: """Class for bootstrapping local OpenPype installation. diff --git a/igniter/tools.py b/igniter/tools.py index 3e862f5803..5cad2b9bf8 100644 --- a/igniter/tools.py +++ b/igniter/tools.py @@ -182,6 +182,24 @@ def get_openpype_path_from_db(url: str) -> Union[str, None]: return None +def get_expected_studio_version_str(staging=False) -> str: + """Version that should be currently used in studio. + + Args: + staging (bool): Get current version for staging. + + Returns: + str: OpenPype version which should be used. Empty string means latest. + """ + mongo_url = os.environ.get("OPENPYPE_MONGO") + global_settings = get_openpype_global_settings(mongo_url) + if staging: + key = "staging_version" + else: + key = "production_version" + return global_settings.get(key) or "" + + def load_stylesheet() -> str: """Load css style sheet. From 7e04079151479548daf15ec81768c454935c71d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20LORRAIN?= Date: Mon, 6 Dec 2021 14:07:01 +0100 Subject: [PATCH 096/341] Update error message --- .../hosts/maya/plugins/publish/validate_render_image_rule.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/validate_render_image_rule.py b/openpype/hosts/maya/plugins/publish/validate_render_image_rule.py index e892b239cc..a912431b55 100644 --- a/openpype/hosts/maya/plugins/publish/validate_render_image_rule.py +++ b/openpype/hosts/maya/plugins/publish/validate_render_image_rule.py @@ -30,7 +30,9 @@ class ValidateRenderImageRule(pyblish.api.InstancePlugin): .get('default_render_image_folder') assert get_file_rule("images") == default_render_file, ( - "Workspace's `images` file rule must be set to: renders" + "Workspace's `images` file rule must be set to: {}".format( + default_render_file + ) ) @classmethod From 04c50532bb440f0d7d005c124495153f9e20076c Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 6 Dec 2021 15:41:47 +0100 Subject: [PATCH 097/341] OP-2042 - added a functionality to run tests either with start.py or openpype_console --- openpype/pype_commands.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/openpype/pype_commands.py b/openpype/pype_commands.py index ce1a9718b3..f01c6f0e42 100644 --- a/openpype/pype_commands.py +++ b/openpype/pype_commands.py @@ -366,12 +366,12 @@ class PypeCommands: pyargs_str = "--pyargs {}".format(pyargs) # disable warnings and show captured stdout even if success - args_str = "--disable-pytest-warnings -rP" + args = ["--disable-pytest-warnings", "-rP"] - cmd = "pytest {} {} {} {}".format(args_str, folder, - mark_str, pyargs_str) - print("Running {}".format(cmd)) - subprocess.run(cmd) + args += [folder, mark_str, pyargs_str] + print("run_tests args: {}".format(args)) + import pytest + pytest.main(args) def syncserver(self, active_site): """Start running sync_server in background.""" From 150f6efd08fcf5e1f83d25110c8b76c88b52856f Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 6 Dec 2021 17:00:28 +0100 Subject: [PATCH 098/341] OP-2042 - explicitly sort variants alphabetically --- openpype/lib/remote_publish.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openpype/lib/remote_publish.py b/openpype/lib/remote_publish.py index d7db4d1ab9..976de048f6 100644 --- a/openpype/lib/remote_publish.py +++ b/openpype/lib/remote_publish.py @@ -2,6 +2,7 @@ import os from datetime import datetime import sys from bson.objectid import ObjectId +import collections import pyblish.util import pyblish.api @@ -140,7 +141,9 @@ def find_variant_key(application_manager, host): found_variant_key = None # finds most up-to-date variant if any installed - for variant_key, variant in app_group.variants.items(): + sorted_variants = collections.OrderedDict( + sorted(app_group.variants.items())) + for variant_key, variant in sorted_variants.items(): for executable in variant.executables: if executable.exists(): found_variant_key = variant_key From eda5ff6b91b48bec5e747754cc9f664e7e47c3a8 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 6 Dec 2021 17:28:02 +0100 Subject: [PATCH 099/341] OP-2042 - better format of asserts --- .../hosts/nuke/test_publish_in_nuke.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py index fe1745299d..d603b9f177 100644 --- a/tests/integration/hosts/nuke/test_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -24,7 +24,7 @@ class TestPublishInNuke(PublishTest): {OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests ../tests/integration/hosts/nuke # noqa: E501 """ - PERSIST = False # True - keep test_db, test_openpype, outputted test files + PERSIST = True # True - keep test_db, test_openpype, outputted test files TEST_FILES = [ ("1SUurHj2aiQ21ZIMJfGVBI2KjR8kIjBGI", "test_Nuke_publish.zip", "") @@ -67,8 +67,10 @@ class TestPublishInNuke(PublishTest): def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" print("test_db_asserts") - assert 5 == dbcon.count_documents({"type": "version"}), \ - "Not expected no of versions" + versions = dbcon.count_documents({"type": "version"}) + assert 5 == versions, \ + "Not expected no of versions. "\ + "Expected 5, found {}".format(versions) assert 0 == dbcon.count_documents({"type": "version", "name": {"$ne": 1}}), \ @@ -86,10 +88,12 @@ class TestPublishInNuke(PublishTest): assert 10 == dbcon.count_documents({"type": "representation"}), \ "Not expected no of representations" - assert 1 == dbcon.count_documents({"type": "representation", + reprs = dbcon.count_documents({"type": "representation", "context.subset": "renderCompositingInNukeMain", # noqa: E501 - "context.ext": "exr"}), \ - "Not expected no of representations with ext 'exr'" + "context.ext": "exr"}) + assert 1 == reprs, \ + "Not expected no of representations with ext 'exr'."\ + "Expected 1, found {}".format(reprs) if __name__ == "__main__": From 4a93c6927d52b5f363a2c1ffb6130d84dc0613d5 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 6 Dec 2021 17:28:23 +0100 Subject: [PATCH 100/341] OP-2042 - added mention of possibility to trigger it via executables --- tests/integration/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/integration/README.md b/tests/integration/README.md index aeed53d097..8839e2e43f 100644 --- a/tests/integration/README.md +++ b/tests/integration/README.md @@ -11,6 +11,9 @@ How to run - run in cmd `{OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests {OPENPYPE_ROOT}/tests/integration` - add `hosts/APP_NAME` after integration part to limit only on specific app (eg. `{OPENPYPE_ROOT}/tests/integration/hosts/maya`) + +OR can use built executables +`openpype_console runtests {ABS_PATH}/tests/integration` How to create test for publishing from host ------------------------------------------ From 12498862943b12ba7c039ba19b71d58fa7e85de5 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 6 Dec 2021 18:10:29 +0100 Subject: [PATCH 101/341] text entity may have value hints --- openpype/settings/entities/input_entities.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openpype/settings/entities/input_entities.py b/openpype/settings/entities/input_entities.py index a0598d405e..d45e8f9f01 100644 --- a/openpype/settings/entities/input_entities.py +++ b/openpype/settings/entities/input_entities.py @@ -438,6 +438,7 @@ class TextEntity(InputEntity): # GUI attributes self.multiline = self.schema_data.get("multiline", False) self.placeholder_text = self.schema_data.get("placeholder") + self.value_hints = self.schema_data.get("value_hints") or [] def _convert_to_valid_type(self, value): # Allow numbers converted to string From 376c4f977864a285b2ca2f271e1cf9f4e5571589 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 6 Dec 2021 18:10:49 +0100 Subject: [PATCH 102/341] changed openpype version enums to text inputs --- openpype/settings/entities/__init__.py | 14 +-- openpype/settings/entities/enum_entity.py | 87 ------------------- .../settings/entities/op_version_entity.py | 49 +++++++++++ .../schemas/system_schema/schema_general.json | 4 +- 4 files changed, 59 insertions(+), 95 deletions(-) create mode 100644 openpype/settings/entities/op_version_entity.py diff --git a/openpype/settings/entities/__init__.py b/openpype/settings/entities/__init__.py index e4a13b8053..4efd358297 100644 --- a/openpype/settings/entities/__init__.py +++ b/openpype/settings/entities/__init__.py @@ -107,8 +107,6 @@ from .enum_entity import ( TaskTypeEnumEntity, DeadlineUrlEnumEntity, AnatomyTemplatesEnumEntity, - ProductionVersionsEnumEntity, - StagingVersionsEnumEntity ) from .list_entity import ListEntity @@ -124,7 +122,10 @@ from .dict_conditional import ( ) from .anatomy_entities import AnatomyEntity - +from .op_version_entity import ( + ProductionVersionsInputEntity, + StagingVersionsInputEntity +) __all__ = ( "DefaultsNotDefined", @@ -171,8 +172,6 @@ __all__ = ( "TaskTypeEnumEntity", "DeadlineUrlEnumEntity", "AnatomyTemplatesEnumEntity", - "ProductionVersionsEnumEntity", - "StagingVersionsEnumEntity", "ListEntity", @@ -185,5 +184,8 @@ __all__ = ( "DictConditionalEntity", "SyncServerProviders", - "AnatomyEntity" + "AnatomyEntity", + + "ProductionVersionsInputEntity", + "StagingVersionsInputEntity" ) diff --git a/openpype/settings/entities/enum_entity.py b/openpype/settings/entities/enum_entity.py index 534775a41d..1f9b361f16 100644 --- a/openpype/settings/entities/enum_entity.py +++ b/openpype/settings/entities/enum_entity.py @@ -1,5 +1,4 @@ import copy -import sys from openpype.lib.openpype_version import ( op_version_control_available, get_remote_versions, @@ -9,7 +8,6 @@ from openpype.lib.openpype_version import ( from .input_entities import InputEntity from .exceptions import EntitySchemaError from .lib import ( - OverrideState, NOT_SET, STRING_TYPE ) @@ -572,88 +570,3 @@ class AnatomyTemplatesEnumEntity(BaseEnumEntity): 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 - - -class _OpenPypeVersionEnum(BaseEnumEntity): - def _item_initialization(self): - self.multiselection = False - self.valid_value_types = (STRING_TYPE, ) - - self.value_on_not_set = "" - items = self._get_default_items() - - self.enum_items = items - self.valid_keys = self._extract_valid_keys(items) - - def _extract_valid_keys(self, items): - return { - tuple(item.keys())[0] - for item in items - } - - def _get_default_items(self): - return [ - {"": "Latest"} - ] - - def _get_openpype_versions(self): - return [] - - def set_override_state(self, state, *args, **kwargs): - items = self._get_default_items() - versions = self._get_openpype_versions() - if versions is not None: - for version in versions: - items.append({version: version}) - - self.enum_items = items - self.valid_keys = self._extract_valid_keys(items) - - # Studio value is not available in collected versions - if ( - state is OverrideState.STUDIO - and self.had_studio_override - and self._studio_override_value not in self.valid_keys - ): - # Define if entity should keep the value in settings. - # Value is marked as not existing anymore if - # - openpype version control is available - # - path to openpype zips is set - # - path to openpype zips is accessible (existing for this machine) - keep_value = True - if ( - op_version_control_available() - and openpype_path_is_set() - and openpype_path_is_accessible() - ): - keep_value = False - - if keep_value: - self.enum_items.append( - {self._studio_override_value: self._studio_override_value} - ) - self.valid_keys.add(self._studio_override_value) - - super(_OpenPypeVersionEnum, self).set_override_state( - state, *args, **kwargs - ) - - -class ProductionVersionsEnumEntity(_OpenPypeVersionEnum): - schema_types = ["production-versions-enum"] - - def _get_openpype_versions(self): - if "OpenPypeVersion" in sys.modules: - OpenPypeVersion = sys.modules["OpenPypeVersion"] - return get_remote_versions(production=True) - return None - - -class StagingVersionsEnumEntity(_OpenPypeVersionEnum): - schema_types = ["staging-versions-enum"] - - def _get_openpype_versions(self): - if "OpenPypeVersion" in sys.modules: - OpenPypeVersion = sys.modules["OpenPypeVersion"] - return get_remote_versions(staging=True) - return None diff --git a/openpype/settings/entities/op_version_entity.py b/openpype/settings/entities/op_version_entity.py new file mode 100644 index 0000000000..e00c6a4737 --- /dev/null +++ b/openpype/settings/entities/op_version_entity.py @@ -0,0 +1,49 @@ +from openpype.lib.openpype_version import ( + op_version_control_available, + get_remote_versions, + openpype_path_is_set, + openpype_path_is_accessible +) +from .input_entities import TextEntity +from .lib import OverrideState + + +class _OpenPypeVersionInput(TextEntity): + def _item_initialization(self): + super(_OpenPypeVersionInput, self)._item_initialization() + self.multiline = False + self.placeholder_text = "Latest" + self.value_hints = [] + + def _get_openpype_versions(self): + return [] + + def set_override_state(self, state, *args, **kwargs): + value_hints = [] + if state is OverrideState.STUDIO: + versions = self._get_openpype_versions() + if versions is not None: + for version in versions: + value_hints.append(str(version)) + + self.value_hints = value_hints + + super(_OpenPypeVersionInput, self).set_override_state( + state, *args, **kwargs + ) + + +class ProductionVersionsInputEntity(_OpenPypeVersionInput): + schema_types = ["production-versions-text"] + + def _get_openpype_versions(self): + return ["", "asd", "dsa", "3.6"] + return get_remote_versions(production=True) + + +class StagingVersionsInputEntity(_OpenPypeVersionInput): + schema_types = ["staging-versions-text"] + + def _get_openpype_versions(self): + return ["", "asd+staging", "dsa+staging", "3.6+staging"] + return get_remote_versions(staging=True) diff --git a/openpype/settings/entities/schemas/system_schema/schema_general.json b/openpype/settings/entities/schemas/system_schema/schema_general.json index d548a22c97..b848a34dda 100644 --- a/openpype/settings/entities/schemas/system_schema/schema_general.json +++ b/openpype/settings/entities/schemas/system_schema/schema_general.json @@ -31,12 +31,12 @@ "type": "splitter" }, { - "type": "production-versions-enum", + "type": "production-versions-text", "key": "production_version", "label": "Production version" }, { - "type": "staging-versions-enum", + "type": "staging-versions-text", "key": "staging_version", "label": "Staging version" }, From d856c4602b712d6619883dfb7da819eb2d01dd84 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 6 Dec 2021 18:11:26 +0100 Subject: [PATCH 103/341] added completer implementation for value hints --- openpype/tools/settings/settings/widgets.py | 220 ++++++++++++++++++++ 1 file changed, 220 insertions(+) diff --git a/openpype/tools/settings/settings/widgets.py b/openpype/tools/settings/settings/widgets.py index 7a7213fa66..bf59f605c9 100644 --- a/openpype/tools/settings/settings/widgets.py +++ b/openpype/tools/settings/settings/widgets.py @@ -1,4 +1,5 @@ import os +import copy from Qt import QtWidgets, QtCore, QtGui from avalon.vendor import qtawesome from avalon.mongodb import ( @@ -24,13 +25,232 @@ from .constants import ( ) +class CompleterFilter(QtCore.QSortFilterProxyModel): + def __init__(self, *args, **kwargs): + super(CompleterFilter, self).__init__(*args, **kwargs) + + self.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive) + + self._text_filter = "" + + def set_text_filter(self, text): + if self._text_filter == text: + return + self._text_filter = text + self.invalidateFilter() + + def filterAcceptsRow(self, row, parent_index): + if not self._text_filter: + return True + model = self.sourceModel() + index = model.index(row, self.filterKeyColumn(), parent_index) + value = index.data(QtCore.Qt.DisplayRole) + if self._text_filter in value: + if self._text_filter == value: + return False + return True + return False + + +class CompleterView(QtWidgets.QListView): + row_activated = QtCore.Signal(str) + + def __init__(self, parent): + super(CompleterView, self).__init__(parent) + + self.setWindowFlags( + QtCore.Qt.FramelessWindowHint + | QtCore.Qt.Tool + ) + delegate = QtWidgets.QStyledItemDelegate() + self.setItemDelegate(delegate) + + model = QtGui.QStandardItemModel() + filter_model = CompleterFilter() + filter_model.setSourceModel(model) + self.setModel(filter_model) + + # self.installEventFilter(parent) + + self.clicked.connect(self._on_activated) + + self._last_loaded_values = None + self._model = model + self._filter_model = filter_model + self._delegate = delegate + + def _on_activated(self, index): + if index.isValid(): + value = index.data(QtCore.Qt.DisplayRole) + self.row_activated.emit(value) + + def set_text_filter(self, text): + self._filter_model.set_text_filter(text) + self._update_geo() + + def sizeHint(self): + result = super(CompleterView, self).sizeHint() + height = 0 + for row in range(self._filter_model.rowCount()): + height += self.sizeHintForRow(row) + result.setHeight(height) + return result + + def _update_geo(self): + size_hint = self.sizeHint() + self.resize(size_hint.width(), size_hint.height()) + + def update_values(self, values): + if not values: + values = [] + + if self._last_loaded_values == values: + return + self._last_loaded_values = copy.deepcopy(values) + + root_item = self._model.invisibleRootItem() + existing_values = {} + for row in reversed(range(root_item.rowCount())): + child = root_item.child(row) + value = child.data(QtCore.Qt.DisplayRole) + if value not in values: + root_item.removeRows(child.row()) + else: + existing_values[value] = child + + for row, value in enumerate(values): + if value in existing_values: + item = existing_values[value] + if item.row() == row: + continue + else: + item = QtGui.QStandardItem(value) + item.setEditable(False) + + root_item.setChild(row, item) + + self._update_geo() + + def _get_selected_row(self): + indexes = self.selectionModel().selectedIndexes() + if not indexes: + return -1 + return indexes[0].row() + + def _select_row(self, row): + index = self._filter_model.index(row, 0) + self.setCurrentIndex(index) + + def move_up(self): + rows = self._filter_model.rowCount() + if rows == 0: + return + + selected_row = self._get_selected_row() + if selected_row < 0: + new_row = rows - 1 + else: + new_row = selected_row - 1 + if new_row < 0: + new_row = rows - 1 + + if new_row != selected_row: + self._select_row(new_row) + + def move_down(self): + rows = self._filter_model.rowCount() + if rows == 0: + return + + selected_row = self._get_selected_row() + if selected_row < 0: + new_row = 0 + else: + new_row = selected_row + 1 + if new_row >= rows: + new_row = 0 + + if new_row != selected_row: + self._select_row(new_row) + + def enter_pressed(self): + selected_row = self._get_selected_row() + if selected_row < 0: + return + index = self._filter_model.index(selected_row, 0) + self._on_activated(index) + + class SettingsLineEdit(QtWidgets.QLineEdit): focused_in = QtCore.Signal() + def __init__(self, *args, **kwargs): + super(SettingsLineEdit, self).__init__(*args, **kwargs) + + self._completer = None + + self.textChanged.connect(self._on_text_change) + + def _on_text_change(self, text): + if self._completer is not None: + self._completer.set_text_filter(text) + + def _update_completer(self): + if self._completer is None or not self._completer.isVisible(): + return + point = self.frameGeometry().bottomLeft() + new_point = self.mapToGlobal(point) + self._completer.move(new_point) + def focusInEvent(self, event): super(SettingsLineEdit, self).focusInEvent(event) self.focused_in.emit() + if self._completer is None: + return + self._completer.show() + self._update_completer() + + def focusOutEvent(self, event): + super(SettingsLineEdit, self).focusOutEvent(event) + if self._completer is not None: + self._completer.hide() + + def paintEvent(self, event): + super(SettingsLineEdit, self).paintEvent(event) + self._update_completer() + + def update_completer_values(self, values): + if not values and self._completer is None: + return + + self._create_completer() + + self._completer.update_values(values) + + def _create_completer(self): + if self._completer is None: + self._completer = CompleterView(self) + self._completer.row_activated.connect(self._completer_activated) + + def _completer_activated(self, text): + self.setText(text) + + def keyPressEvent(self, event): + if self._completer is None: + super(SettingsLineEdit, self).keyPressEvent(event) + return + + key = event.key() + if key == QtCore.Qt.Key_Up: + self._completer.move_up() + elif key == QtCore.Qt.Key_Down: + self._completer.move_down() + elif key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return): + self._completer.enter_pressed() + else: + super(SettingsLineEdit, self).keyPressEvent(event) + class SettingsPlainTextEdit(QtWidgets.QPlainTextEdit): focused_in = QtCore.Signal() From 4c2ccb014c3c2a1c815638b5e9f90c86fd36c5cb Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 6 Dec 2021 18:12:17 +0100 Subject: [PATCH 104/341] text input fills value hints --- openpype/tools/settings/settings/item_widgets.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/openpype/tools/settings/settings/item_widgets.py b/openpype/tools/settings/settings/item_widgets.py index 2e00967a60..f20deeb6e4 100644 --- a/openpype/tools/settings/settings/item_widgets.py +++ b/openpype/tools/settings/settings/item_widgets.py @@ -2,6 +2,9 @@ import json from Qt import QtWidgets, QtCore, QtGui +from openpype.widgets.sliders import NiceSlider +from openpype.tools.settings import CHILD_OFFSET + from .widgets import ( ExpandingWidget, NumberSpinBox, @@ -22,9 +25,6 @@ from .base import ( InputWidget ) -from openpype.widgets.sliders import NiceSlider -from openpype.tools.settings import CHILD_OFFSET - class DictImmutableKeysWidget(BaseWidget): def create_ui(self): @@ -378,6 +378,11 @@ class TextWidget(InputWidget): self.input_field.focused_in.connect(self._on_input_focus) self.input_field.textChanged.connect(self._on_value_change) + self._refresh_completer() + + def _refresh_completer(self): + self.input_field.update_completer_values(self.entity.value_hints) + def _on_input_focus(self): self.focused_in() From d7ad673462547ef8c653e2041e71b04594a31d3f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 6 Dec 2021 18:15:26 +0100 Subject: [PATCH 105/341] removed test data --- openpype/settings/entities/op_version_entity.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/openpype/settings/entities/op_version_entity.py b/openpype/settings/entities/op_version_entity.py index e00c6a4737..a6954119aa 100644 --- a/openpype/settings/entities/op_version_entity.py +++ b/openpype/settings/entities/op_version_entity.py @@ -37,7 +37,6 @@ class ProductionVersionsInputEntity(_OpenPypeVersionInput): schema_types = ["production-versions-text"] def _get_openpype_versions(self): - return ["", "asd", "dsa", "3.6"] return get_remote_versions(production=True) @@ -45,5 +44,4 @@ class StagingVersionsInputEntity(_OpenPypeVersionInput): schema_types = ["staging-versions-text"] def _get_openpype_versions(self): - return ["", "asd+staging", "dsa+staging", "3.6+staging"] return get_remote_versions(staging=True) From fc9a50f7423ecf7e684396313a1679e2f3d07b44 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 6 Dec 2021 18:15:54 +0100 Subject: [PATCH 106/341] added special widget for openpype version input --- openpype/settings/entities/op_version_entity.py | 10 +++++----- openpype/tools/settings/settings/categories.py | 7 +++++++ openpype/tools/settings/settings/item_widgets.py | 7 +++++++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/openpype/settings/entities/op_version_entity.py b/openpype/settings/entities/op_version_entity.py index a6954119aa..2458f03852 100644 --- a/openpype/settings/entities/op_version_entity.py +++ b/openpype/settings/entities/op_version_entity.py @@ -8,9 +8,9 @@ from .input_entities import TextEntity from .lib import OverrideState -class _OpenPypeVersionInput(TextEntity): +class OpenPypeVersionInput(TextEntity): def _item_initialization(self): - super(_OpenPypeVersionInput, self)._item_initialization() + super(OpenPypeVersionInput, self)._item_initialization() self.multiline = False self.placeholder_text = "Latest" self.value_hints = [] @@ -28,19 +28,19 @@ class _OpenPypeVersionInput(TextEntity): self.value_hints = value_hints - super(_OpenPypeVersionInput, self).set_override_state( + super(OpenPypeVersionInput, self).set_override_state( state, *args, **kwargs ) -class ProductionVersionsInputEntity(_OpenPypeVersionInput): +class ProductionVersionsInputEntity(OpenPypeVersionInput): schema_types = ["production-versions-text"] def _get_openpype_versions(self): return get_remote_versions(production=True) -class StagingVersionsInputEntity(_OpenPypeVersionInput): +class StagingVersionsInputEntity(OpenPypeVersionInput): schema_types = ["staging-versions-text"] def _get_openpype_versions(self): diff --git a/openpype/tools/settings/settings/categories.py b/openpype/tools/settings/settings/categories.py index a6e4154b2b..af7e0bd742 100644 --- a/openpype/tools/settings/settings/categories.py +++ b/openpype/tools/settings/settings/categories.py @@ -28,6 +28,9 @@ from openpype.settings.entities import ( StudioDefaultsNotDefined, SchemaError ) +from openpype.settings.entities.op_version_entity import ( + OpenPypeVersionInput +) from openpype.settings import SaveWarningExc from .widgets import ProjectListWidget @@ -46,6 +49,7 @@ from .item_widgets import ( BoolWidget, DictImmutableKeysWidget, TextWidget, + OpenPypeVersionText, NumberWidget, RawJsonWidget, EnumeratorWidget, @@ -116,6 +120,9 @@ class SettingsCategoryWidget(QtWidgets.QWidget): elif isinstance(entity, BoolEntity): return BoolWidget(*args) + elif isinstance(entity, OpenPypeVersionInput): + return OpenPypeVersionText(*args) + elif isinstance(entity, TextEntity): return TextWidget(*args) diff --git a/openpype/tools/settings/settings/item_widgets.py b/openpype/tools/settings/settings/item_widgets.py index f20deeb6e4..11f0dc6add 100644 --- a/openpype/tools/settings/settings/item_widgets.py +++ b/openpype/tools/settings/settings/item_widgets.py @@ -389,6 +389,7 @@ class TextWidget(InputWidget): def _on_entity_change(self): if self.entity.value != self.input_value(): self.set_entity_value() + self._refresh_completer() def set_entity_value(self): if self.entity.multiline: @@ -411,6 +412,12 @@ class TextWidget(InputWidget): self.entity.set(self.input_value()) +class OpenPypeVersionText(TextWidget): + def _on_entity_change(self): + super(OpenPypeVersionText, self)._on_entity_change() + self._refresh_completer() + + class NumberWidget(InputWidget): _slider_widget = None From 8b4455721ed26a5bae3a4d74efe88d03a1854a45 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 6 Dec 2021 18:22:01 +0100 Subject: [PATCH 107/341] removed overdone refresh of completer --- openpype/tools/settings/settings/item_widgets.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openpype/tools/settings/settings/item_widgets.py b/openpype/tools/settings/settings/item_widgets.py index 11f0dc6add..bca70edff5 100644 --- a/openpype/tools/settings/settings/item_widgets.py +++ b/openpype/tools/settings/settings/item_widgets.py @@ -389,7 +389,6 @@ class TextWidget(InputWidget): def _on_entity_change(self): if self.entity.value != self.input_value(): self.set_entity_value() - self._refresh_completer() def set_entity_value(self): if self.entity.multiline: From af12e59f826f3b27c3b6c8256650da1360fcffb2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 6 Dec 2021 18:23:40 +0100 Subject: [PATCH 108/341] skip completer refresh for multiline entities --- openpype/tools/settings/settings/item_widgets.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/openpype/tools/settings/settings/item_widgets.py b/openpype/tools/settings/settings/item_widgets.py index bca70edff5..3a7e126846 100644 --- a/openpype/tools/settings/settings/item_widgets.py +++ b/openpype/tools/settings/settings/item_widgets.py @@ -378,9 +378,12 @@ class TextWidget(InputWidget): self.input_field.focused_in.connect(self._on_input_focus) self.input_field.textChanged.connect(self._on_value_change) - self._refresh_completer() - def _refresh_completer(self): + # Multiline entity can't have completer + # - there is not space for this UI component + if self.entity.multiline: + return + self.input_field.update_completer_values(self.entity.value_hints) def _on_input_focus(self): From 8e853314daac94ce4ecf9966ff85d72c75347a03 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 6 Dec 2021 18:23:53 +0100 Subject: [PATCH 109/341] added schema validation for value hints --- openpype/settings/entities/input_entities.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/openpype/settings/entities/input_entities.py b/openpype/settings/entities/input_entities.py index d45e8f9f01..a285bf3433 100644 --- a/openpype/settings/entities/input_entities.py +++ b/openpype/settings/entities/input_entities.py @@ -440,6 +440,15 @@ class TextEntity(InputEntity): self.placeholder_text = self.schema_data.get("placeholder") self.value_hints = self.schema_data.get("value_hints") or [] + def schema_validations(self): + if self.multiline and self.value_hints: + reason = ( + "TextEntity entity can't use value hints" + " for multiline input (yet)." + ) + raise EntitySchemaError(self, reason) + super(TextEntity, self).schema_validations() + def _convert_to_valid_type(self, value): # Allow numbers converted to string if isinstance(value, (int, float)): From 298d2da581805e3f704c651bda6ed7e680d58bf4 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 6 Dec 2021 18:57:36 +0100 Subject: [PATCH 110/341] added refresh of completer to init --- openpype/tools/settings/settings/item_widgets.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openpype/tools/settings/settings/item_widgets.py b/openpype/tools/settings/settings/item_widgets.py index 3a7e126846..1d912a90b7 100644 --- a/openpype/tools/settings/settings/item_widgets.py +++ b/openpype/tools/settings/settings/item_widgets.py @@ -378,6 +378,8 @@ class TextWidget(InputWidget): self.input_field.focused_in.connect(self._on_input_focus) self.input_field.textChanged.connect(self._on_value_change) + self._refresh_completer() + def _refresh_completer(self): # Multiline entity can't have completer # - there is not space for this UI component From c479fdecdb13085ed4d58c5c044ccf77587c3e76 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 10:36:13 +0100 Subject: [PATCH 111/341] added label --- .../entities/schemas/system_schema/schema_general.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openpype/settings/entities/schemas/system_schema/schema_general.json b/openpype/settings/entities/schemas/system_schema/schema_general.json index b848a34dda..ed66cd7ac8 100644 --- a/openpype/settings/entities/schemas/system_schema/schema_general.json +++ b/openpype/settings/entities/schemas/system_schema/schema_general.json @@ -30,6 +30,10 @@ { "type": "splitter" }, + { + "type": "label", + "label": "Define explicit OpenPype version that should be used. Keep empty to use latest available version." + }, { "type": "production-versions-text", "key": "production_version", From c0ad1b5d8b635d24ccb81ac69bc9e38544d6eec9 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 7 Dec 2021 11:01:55 +0100 Subject: [PATCH 112/341] OP-2042 - use existing value of env var OPENPYPE_DATABASE_NAME if possible For better automatic testing --- start.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/start.py b/start.py index 0f7e82071d..ae6aefe34e 100644 --- a/start.py +++ b/start.py @@ -925,7 +925,9 @@ def boot(): sys.exit(1) os.environ["OPENPYPE_MONGO"] = openpype_mongo - os.environ["OPENPYPE_DATABASE_NAME"] = "openpype" # name of Pype database + # name of Pype database + os.environ["OPENPYPE_DATABASE_NAME"] = \ + os.environ.get("OPENPYPE_DATABASE_NAME") or "openpype" _print(">>> run disk mapping command ...") run_disk_mapping_commands(openpype_mongo) From 709d0ee625dfad38b70590ee1804b0f376ce4a10 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 7 Dec 2021 11:02:16 +0100 Subject: [PATCH 113/341] OP-2042 - reset connection to openpype DB --- tests/lib/testing_classes.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index 15ab685739..0a04dc59c2 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -108,6 +108,14 @@ class ModuleUnitTest(BaseTest): import openpype openpype_root = os.path.dirname(os.path.dirname(openpype.__file__)) + + #reset connection to openpype DB with new env var + import openpype.settings.lib as sett_lib + sett_lib._SETTINGS_HANDLER = None + sett_lib._LOCAL_SETTINGS_HANDLER = None + sett_lib.create_settings_handler() + sett_lib.create_local_settings_handler() + # ?? why 2 of those monkeypatch_session.setenv("OPENPYPE_ROOT", openpype_root) monkeypatch_session.setenv("OPENPYPE_REPOS_ROOT", openpype_root) From 1ea180ba8d58fdb4010eefad0739e84d3f1482e9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 11:21:48 +0100 Subject: [PATCH 114/341] removed dot --- .../settings/entities/schemas/system_schema/schema_general.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/settings/entities/schemas/system_schema/schema_general.json b/openpype/settings/entities/schemas/system_schema/schema_general.json index ed66cd7ac8..b4c83fc85f 100644 --- a/openpype/settings/entities/schemas/system_schema/schema_general.json +++ b/openpype/settings/entities/schemas/system_schema/schema_general.json @@ -20,7 +20,7 @@ }, { "type": "label", - "label": "This is NOT a securely stored password!. It only acts as a simple barrier to stop users from accessing studio wide settings." + "label": "This is NOT a securely stored password! It only acts as a simple barrier to stop users from accessing studio wide settings." }, { "type": "text", From 1454efab3a0528ccaa8cbcb417773fafd8f10e2d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 13:43:51 +0100 Subject: [PATCH 115/341] added style for completer view --- openpype/style/style.css | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/openpype/style/style.css b/openpype/style/style.css index 19245cdc40..0ef15a2511 100644 --- a/openpype/style/style.css +++ b/openpype/style/style.css @@ -536,6 +536,27 @@ QAbstractItemView::branch:!has-children:!has-siblings:adjoins-item { background: transparent; } +CompleterView { + border: 1px solid #555555; + background: {color:bg-inputs}; +} + +CompleterView::item:selected { + background: {color:bg-view-hover}; +} + +CompleterView::item:selected:hover { + background: {color:bg-view-hover}; +} + +CompleterView::right-arrow { + min-width: 10px; +} +CompleterView::separator { + background: {color:bg-menu-separator}; + height: 2px; + margin-right: 5px; +} /* Progress bar */ QProgressBar { From 44e00ed1d442d3d9dc3cb0a68a8976fb63da401c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 13:44:02 +0100 Subject: [PATCH 116/341] don't care about ideal height --- openpype/tools/settings/settings/widgets.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/openpype/tools/settings/settings/widgets.py b/openpype/tools/settings/settings/widgets.py index bf59f605c9..4b88c1f93f 100644 --- a/openpype/tools/settings/settings/widgets.py +++ b/openpype/tools/settings/settings/widgets.py @@ -90,10 +90,9 @@ class CompleterView(QtWidgets.QListView): def sizeHint(self): result = super(CompleterView, self).sizeHint() - height = 0 - for row in range(self._filter_model.rowCount()): - height += self.sizeHintForRow(row) - result.setHeight(height) + if self._filter_model.rowCount() == 0: + result.setHeight(0) + return result def _update_geo(self): From 228d6fc914f3f1e6bcd6212d323facb9b67d4364 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 13:45:21 +0100 Subject: [PATCH 117/341] added basic information about valid version --- .../tools/settings/settings/item_widgets.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/openpype/tools/settings/settings/item_widgets.py b/openpype/tools/settings/settings/item_widgets.py index 1d912a90b7..0c66162375 100644 --- a/openpype/tools/settings/settings/item_widgets.py +++ b/openpype/tools/settings/settings/item_widgets.py @@ -417,9 +417,30 @@ class TextWidget(InputWidget): class OpenPypeVersionText(TextWidget): + def __init__(self, *args, **kwargs): + self._info_widget = None + super(OpenPypeVersionText, self).__init__(*args, **kwargs) + + def create_ui(self): + super(OpenPypeVersionText, self).create_ui() + info_widget = QtWidgets.QLabel("Latest", self) + self.content_layout.addWidget(info_widget, 1) + + self._info_widget = info_widget + + def _update_info_widget(self): + value = self.input_value() + if value == "": + self._info_widget.setText("Latest") + elif value in self.entity.value_hints: + self._info_widget.setText("Ok") + else: + self._info_widget.setText("Version not found from this workstation") + def _on_entity_change(self): super(OpenPypeVersionText, self)._on_entity_change() self._refresh_completer() + self._update_info_widget() class NumberWidget(InputWidget): From 87b606582a95696f4a4fc3091c4cbd624538d0b7 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 18:10:13 +0100 Subject: [PATCH 118/341] do not create new qapplication if already exists --- igniter/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/igniter/__init__.py b/igniter/__init__.py index bbc3dbfc88..d974bd9e0d 100644 --- a/igniter/__init__.py +++ b/igniter/__init__.py @@ -28,7 +28,9 @@ def open_dialog(): if scale_attr is not None: QtWidgets.QApplication.setAttribute(scale_attr) - app = QtWidgets.QApplication(sys.argv) + app = QtWidgets.QApplication.instance() + if not app: + app = QtWidgets.QApplication(sys.argv) d = InstallDialog() d.open() @@ -49,7 +51,9 @@ def open_update_window(openpype_version): if scale_attr is not None: QtWidgets.QApplication.setAttribute(scale_attr) - app = QtWidgets.QApplication(sys.argv) + app = QtWidgets.QApplication.instance() + if not app: + app = QtWidgets.QApplication(sys.argv) d = UpdateWindow(version=openpype_version) d.open() From db467dcbfd041a7fdd60399a2535bf215e40a7c3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 18:13:56 +0100 Subject: [PATCH 119/341] added function to get openpype icon to tools.py --- igniter/install_dialog.py | 5 +++-- igniter/tools.py | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/igniter/install_dialog.py b/igniter/install_dialog.py index 1fe67e3397..251adebc9f 100644 --- a/igniter/install_dialog.py +++ b/igniter/install_dialog.py @@ -12,7 +12,8 @@ from Qt.QtCore import QTimer # noqa from .install_thread import InstallThread from .tools import ( validate_mongo_connection, - get_openpype_path_from_db + get_openpype_path_from_db, + get_openpype_icon_path ) from .nice_progress_bar import NiceProgressBar @@ -187,7 +188,6 @@ class InstallDialog(QtWidgets.QDialog): current_dir = os.path.dirname(os.path.abspath(__file__)) roboto_font_path = os.path.join(current_dir, "RobotoMono-Regular.ttf") poppins_font_path = os.path.join(current_dir, "Poppins") - icon_path = os.path.join(current_dir, "openpype_icon.png") # Install roboto font QtGui.QFontDatabase.addApplicationFont(roboto_font_path) @@ -196,6 +196,7 @@ class InstallDialog(QtWidgets.QDialog): QtGui.QFontDatabase.addApplicationFont(filename) # Load logo + icon_path = get_openpype_icon_path() pixmap_openpype_logo = QtGui.QPixmap(icon_path) # Set logo as icon of window self.setWindowIcon(QtGui.QIcon(pixmap_openpype_logo)) diff --git a/igniter/tools.py b/igniter/tools.py index 5cad2b9bf8..72b98f1f82 100644 --- a/igniter/tools.py +++ b/igniter/tools.py @@ -210,3 +210,11 @@ def load_stylesheet() -> str: stylesheet_path = Path(__file__).parent.resolve() / "stylesheet.css" return stylesheet_path.read_text() + + +def get_openpype_icon_path() -> str: + """Path to OpenPype icon png file.""" + return os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "openpype_icon.png" + ) From e4534c5074244afa096bc290809011d0b24eb7a6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 18:21:05 +0100 Subject: [PATCH 120/341] added new message dialog to show a dialog --- igniter/__init__.py | 22 ++++++++++++++++++++ igniter/message_dialog.py | 44 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 igniter/message_dialog.py diff --git a/igniter/__init__.py b/igniter/__init__.py index d974bd9e0d..6f06c1eb90 100644 --- a/igniter/__init__.py +++ b/igniter/__init__.py @@ -63,9 +63,31 @@ def open_update_window(openpype_version): return version_path +def show_message_dialog(title, message): + if os.getenv("OPENPYPE_HEADLESS_MODE"): + print("!!! Can't open dialog in headless mode. Exiting.") + sys.exit(1) + from Qt import QtWidgets, QtCore + from .message_dialog import MessageDialog + + scale_attr = getattr(QtCore.Qt, "AA_EnableHighDpiScaling", None) + if scale_attr is not None: + QtWidgets.QApplication.setAttribute(scale_attr) + + app = QtWidgets.QApplication.instance() + if not app: + app = QtWidgets.QApplication(sys.argv) + + dialog = MessageDialog(title, message) + dialog.open() + + app.exec_() + + __all__ = [ "BootstrapRepos", "open_dialog", "open_update_window", + "show_message_dialog", "version" ] diff --git a/igniter/message_dialog.py b/igniter/message_dialog.py new file mode 100644 index 0000000000..88a086df1e --- /dev/null +++ b/igniter/message_dialog.py @@ -0,0 +1,44 @@ +from Qt import QtWidgets, QtGui + +from .tools import ( + load_stylesheet, + get_openpype_icon_path +) + + +class MessageDialog(QtWidgets.QDialog): + def __init__(self, title, message): + super(MessageDialog, self).__init__() + + # Set logo as icon of window + icon_path = get_openpype_icon_path() + pixmap_openpype_logo = QtGui.QPixmap(icon_path) + self.setWindowIcon(QtGui.QIcon(pixmap_openpype_logo)) + + # Set title + self.setWindowTitle(title) + + # Set message + label_widget = QtWidgets.QLabel(message, self) + + ok_btn = QtWidgets.QPushButton("OK", self) + btns_layout = QtWidgets.QHBoxLayout() + btns_layout.addStretch(1) + btns_layout.addWidget(ok_btn, 0) + + layout = QtWidgets.QVBoxLayout(self) + # layout.setContentsMargins(0, 0, 0, 0) + layout.addWidget(label_widget, 1) + layout.addLayout(btns_layout, 0) + + ok_btn.clicked.connect(self._on_ok_clicked) + + self._label_widget = label_widget + self._ok_btn = ok_btn + + def _on_ok_clicked(self): + self.close() + + def showEvent(self, event): + super(MessageDialog, self).showEvent(event) + self.setStyleSheet(load_stylesheet()) From 500339088d51a2c66536aaffd5bd07ea7a4f6619 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 18:24:25 +0100 Subject: [PATCH 121/341] added new exception into tools --- igniter/tools.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/igniter/tools.py b/igniter/tools.py index 72b98f1f82..2595140582 100644 --- a/igniter/tools.py +++ b/igniter/tools.py @@ -16,6 +16,11 @@ from pymongo.errors import ( ) +class OpenPypeVersionNotFound(Exception): + """OpenPype version was not found in remote and local repository.""" + pass + + def should_add_certificate_path_to_mongo_url(mongo_url): """Check if should add ca certificate to mongo url. From 21b9926be40079b04d970c690d11db8ffb421329 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 18:30:15 +0100 Subject: [PATCH 122/341] simplified _find_frozen_openpype --- start.py | 120 +++++++++++++++++++++++-------------------------------- 1 file changed, 49 insertions(+), 71 deletions(-) diff --git a/start.py b/start.py index 05b7da6308..91221da75d 100644 --- a/start.py +++ b/start.py @@ -196,7 +196,8 @@ from igniter import BootstrapRepos # noqa: E402 from igniter.tools import ( get_openpype_global_settings, get_openpype_path_from_db, - validate_mongo_connection + validate_mongo_connection, + OpenPypeVersionNotFound ) # noqa from igniter.bootstrap_repos import OpenPypeVersion # noqa: E402 @@ -645,67 +646,60 @@ def _find_frozen_openpype(use_version: str = None, (if requested). """ - version_path = None - openpype_version = None - openpype_versions = bootstrap.find_openpype(include_zips=True, - staging=use_staging) - # get local frozen version and add it to detected version so if it is - # newer it will be used instead. - local_version_str = bootstrap.get_version( - Path(os.environ["OPENPYPE_ROOT"])) + # Collect OpenPype versions + openpype_versions = bootstrap.find_openpype( + include_zips=True, + staging=use_staging + ) + openpype_root = Path(os.environ["OPENPYPE_ROOT"]) + local_version_str = bootstrap.get_version(openpype_root) + studio_version = OpenPypeVersion.get_expected_studio_version(use_staging) if local_version_str: local_version = OpenPypeVersion( version=local_version_str, - path=Path(os.environ["OPENPYPE_ROOT"])) + path=openpype_root + ) if local_version not in openpype_versions: openpype_versions.append(local_version) - openpype_versions.sort() - # if latest is currently running, ditch whole list - # and run from current without installing it. - if local_version == openpype_versions[-1]: - os.environ["OPENPYPE_TRYOUT"] = "1" - openpype_versions = [] + + # Find OpenPype version that should be used + openpype_version = None + if use_version is not None: + # Version was specified with arguments or env OPENPYPE_VERSION + # - should crash if version is not available + _print("Finding specified version \"{}\"".format(use_version)) + for version in openpype_versions: + if version == use_version: + openpype_version = version + break + + if openpype_version is None: + raise OpenPypeVersionNotFound( + "Requested version \"{}\" was not found.".format(use_version) + ) + + elif studio_version: + _print("Finding studio version \"{}\"".format(studio_version)) + # Look for version specified by settings + for version in openpype_versions: + if version == studio_version: + openpype_version = version + break + if openpype_version is None: + raise OpenPypeVersionNotFound(( + "Requested OpenPype version \"{}\" defined by settings" + " was not found." + ).format(use_version)) + else: - _print("!!! Warning: cannot determine current running version.") + # Use latest available version + _print("Finding latest version") + openpype_versions.sort() + openpype_version = openpype_versions[-1] - if not os.getenv("OPENPYPE_TRYOUT"): - try: - # use latest one found (last in the list is latest) - openpype_version = openpype_versions[-1] - except IndexError: - # no OpenPype version found, run Igniter and ask for them. - _print('*** No OpenPype versions found.') - if os.getenv("OPENPYPE_HEADLESS_MODE") == "1": - _print("!!! Cannot open Igniter dialog in headless mode.") - sys.exit(1) - _print("--- launching setup UI ...") - import igniter - return_code = igniter.open_dialog() - if return_code == 2: - os.environ["OPENPYPE_TRYOUT"] = "1" - if return_code == 3: - # run OpenPype after installation - - _print('>>> Finding OpenPype again ...') - openpype_versions = bootstrap.find_openpype( - staging=use_staging) - try: - openpype_version = openpype_versions[-1] - except IndexError: - _print(("!!! Something is wrong and we didn't " - "found it again.")) - sys.exit(1) - elif return_code != 2: - _print(f" . finished ({return_code})") - sys.exit(return_code) - - if not openpype_versions: - # no openpype versions found anyway, lets use then the one - # shipped with frozen OpenPype - if not os.getenv("OPENPYPE_TRYOUT"): - _print("*** Still no luck finding OpenPype.") - _print(("*** We'll try to use the one coming " - "with OpenPype installation.")) + # get local frozen version and add it to detected version so if it is + # newer it will be used instead. + if local_version == openpype_version: version_path = _bootstrap_from_code(use_version, use_staging) openpype_version = OpenPypeVersion( version=BootstrapRepos.get_version(version_path), @@ -713,22 +707,6 @@ def _find_frozen_openpype(use_version: str = None, _initialize_environment(openpype_version) return version_path - # get path of version specified in `--use-version` - local_version = bootstrap.get_version(OPENPYPE_ROOT) - if use_version and use_version != local_version: - # force the one user has selected - openpype_version = None - openpype_versions = bootstrap.find_openpype(include_zips=True, - staging=use_staging) - v: OpenPypeVersion - found = [v for v in openpype_versions if str(v) == use_version] - if found: - openpype_version = sorted(found)[-1] - if not openpype_version: - _print(f"!!! Requested version {use_version} was not found.") - list_versions(openpype_versions, local_version) - sys.exit(1) - # test if latest detected is installed (in user data dir) is_inside = False try: From 5d03abe627d890785e8657931559f8dac39d66b1 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 18:30:51 +0100 Subject: [PATCH 123/341] removed play animation part --- start.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/start.py b/start.py index 91221da75d..5f416a47b8 100644 --- a/start.py +++ b/start.py @@ -866,16 +866,6 @@ def boot(): # ------------------------------------------------------------------------ _startup_validations() - # ------------------------------------------------------------------------ - # Play animation - # ------------------------------------------------------------------------ - - # from igniter.terminal_splash import play_animation - - # don't play for silenced commands - # if all(item not in sys.argv for item in silent_commands): - # play_animation() - # ------------------------------------------------------------------------ # Process arguments # ------------------------------------------------------------------------ From 9b369de50c2ad5a281fb0ff84fcb7988f26c224f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 18:38:43 +0100 Subject: [PATCH 124/341] raise OpenPypeVersionNotFound in run from code too --- start.py | 57 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/start.py b/start.py index 5f416a47b8..69774c3a6c 100644 --- a/start.py +++ b/start.py @@ -769,45 +769,50 @@ def _bootstrap_from_code(use_version, use_staging): # get current version of OpenPype local_version = bootstrap.get_local_live_version() - version_to_use = None openpype_versions = bootstrap.find_openpype( include_zips=True, staging=use_staging) if use_staging and not use_version: - try: - version_to_use = openpype_versions[-1] - except IndexError: - _print("!!! No staging versions are found.") - list_versions(openpype_versions, local_version) - sys.exit(1) + if not openpype_versions: + raise OpenPypeVersionNotFound( + "Didn't find any staging versions." + ) + + # Use last found staging version + version_to_use = openpype_versions[-1] if version_to_use.path.is_file(): version_to_use.path = bootstrap.extract_openpype( version_to_use) bootstrap.add_paths_from_directory(version_to_use.path) os.environ["OPENPYPE_VERSION"] = str(version_to_use) version_path = version_to_use.path - os.environ["OPENPYPE_REPOS_ROOT"] = (version_path / "openpype").as_posix() # noqa: E501 + os.environ["OPENPYPE_REPOS_ROOT"] = ( + version_path / "openpype" + ).as_posix() _openpype_root = version_to_use.path.as_posix() elif use_version and use_version != local_version: - v: OpenPypeVersion - found = [v for v in openpype_versions if str(v) == use_version] - if found: - version_to_use = sorted(found)[-1] + version_to_use = None + for version in openpype_versions: + if str(version) == use_version: + version_to_use = version + break - if version_to_use: - # use specified - if version_to_use.path.is_file(): - version_to_use.path = bootstrap.extract_openpype( - version_to_use) - bootstrap.add_paths_from_directory(version_to_use.path) - os.environ["OPENPYPE_VERSION"] = use_version - version_path = version_to_use.path - os.environ["OPENPYPE_REPOS_ROOT"] = (version_path / "openpype").as_posix() # noqa: E501 - _openpype_root = version_to_use.path.as_posix() - else: - _print(f"!!! Requested version {use_version} was not found.") - list_versions(openpype_versions, local_version) - sys.exit(1) + if version_to_use is None: + raise OpenPypeVersionNotFound( + "Requested version \"{}\" was not found.".format(use_version) + ) + + # use specified + if version_to_use.path.is_file(): + version_to_use.path = bootstrap.extract_openpype( + version_to_use) + bootstrap.add_paths_from_directory(version_to_use.path) + os.environ["OPENPYPE_VERSION"] = use_version + version_path = version_to_use.path + os.environ["OPENPYPE_REPOS_ROOT"] = ( + version_path / "openpype" + ).as_posix() + _openpype_root = version_to_use.path.as_posix() else: os.environ["OPENPYPE_VERSION"] = local_version version_path = Path(_openpype_root) From a98bdc7d7f2e91ce6c3855d6ca0ed95c6e84be45 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 18:39:24 +0100 Subject: [PATCH 125/341] catch and handle OpenPypeVersioNotFound exception --- start.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/start.py b/start.py index 69774c3a6c..853e6d13a0 100644 --- a/start.py +++ b/start.py @@ -972,6 +972,15 @@ def boot(): # find versions of OpenPype to be used with frozen code try: version_path = _find_frozen_openpype(use_version, use_staging) + except OpenPypeVersionNotFound as exc: + message = str(exc) + _print(message) + if os.environ.get("OPENPYPE_HEADLESS_MODE") == "1": + list_versions(openpype_versions, local_version) + else: + igniter.show_message_dialog("Version not found", message) + sys.exit(1) + except RuntimeError as e: # no version to run _print(f"!!! {e}") @@ -984,7 +993,17 @@ def boot(): sys.exit(1) _print(f"--- version is valid") else: - version_path = _bootstrap_from_code(use_version, use_staging) + try: + version_path = _bootstrap_from_code(use_version, use_staging) + + except OpenPypeVersionNotFound as exc: + message = str(exc) + _print(message) + if os.environ.get("OPENPYPE_HEADLESS_MODE") == "1": + list_versions(openpype_versions, local_version) + else: + igniter.show_message_dialog("Version not found", message) + sys.exit(1) # set this to point either to `python` from venv in case of live code # or to `openpype` or `openpype_console` in case of frozen code From b0099ea5d4271d997f80932535cc2817574fc73a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Dec 2021 18:39:45 +0100 Subject: [PATCH 126/341] skipped already done imports --- start.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/start.py b/start.py index 853e6d13a0..32fa4bd062 100644 --- a/start.py +++ b/start.py @@ -521,7 +521,7 @@ def _process_arguments() -> tuple: if os.getenv("OPENPYPE_HEADLESS_MODE") == "1": _print("!!! Cannot open Igniter dialog in headless mode.") sys.exit(1) - import igniter + return_code = igniter.open_dialog() # this is when we want to run OpenPype without installing anything. @@ -719,12 +719,12 @@ def _find_frozen_openpype(use_version: str = None, if not is_inside: # install latest version to user data dir - if os.getenv("OPENPYPE_HEADLESS_MODE", "0") != "1": - import igniter - version_path = igniter.open_update_window(openpype_version) - else: + if os.getenv("OPENPYPE_HEADLESS_MODE") == "1": version_path = bootstrap.install_version( - openpype_version, force=True) + openpype_version, force=True + ) + else: + version_path = igniter.open_update_window(openpype_version) openpype_version.path = version_path _initialize_environment(openpype_version) From 23ed14a3973316324e9cac2bdddd2d65ea31ab41 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 8 Dec 2021 11:41:02 +0100 Subject: [PATCH 127/341] OP-2042 - remove superfluous logging --- openpype/lib/path_tools.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openpype/lib/path_tools.py b/openpype/lib/path_tools.py index 6fd0ad0dfe..9bb0231ca7 100644 --- a/openpype/lib/path_tools.py +++ b/openpype/lib/path_tools.py @@ -307,7 +307,6 @@ class HostDirmap: mapping = {} if not project_settings["global"]["sync_server"]["enabled"]: - log.debug("Site Sync not enabled") return mapping from openpype.settings.lib import get_site_local_overrides From 04689e72c0d1e1a546f737aff18b3c52c221ae90 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 8 Dec 2021 12:42:17 +0100 Subject: [PATCH 128/341] flame: moving `utility_scripts` to api folder also with `scripts` @iLLiCiTiT suggestion --- openpype/hosts/flame/{ => api}/scripts/wiretap_com.py | 0 .../export_preset/openpype_seg_thumbnails_jpg.xml | 0 .../export_preset/openpype_seg_video_h264.xml | 0 .../openpype_flame_to_ftrack/modules/__init__.py | 0 .../openpype_flame_to_ftrack/modules/app_utils.py | 0 .../openpype_flame_to_ftrack/modules/ftrack_lib.py | 0 .../openpype_flame_to_ftrack/modules/panel_app.py | 0 .../openpype_flame_to_ftrack/modules/uiwidgets.py | 0 .../openpype_flame_to_ftrack/openpype_flame_to_ftrack.py | 0 .../hosts/flame/{ => api}/utility_scripts/openpype_in_flame.py | 0 openpype/hosts/flame/api/utils.py | 1 + openpype/hosts/flame/hooks/pre_flame_setup.py | 2 +- 12 files changed, 2 insertions(+), 1 deletion(-) rename openpype/hosts/flame/{ => api}/scripts/wiretap_com.py (100%) rename openpype/hosts/flame/{ => api}/utility_scripts/openpype_flame_to_ftrack/export_preset/openpype_seg_thumbnails_jpg.xml (100%) rename openpype/hosts/flame/{ => api}/utility_scripts/openpype_flame_to_ftrack/export_preset/openpype_seg_video_h264.xml (100%) rename openpype/hosts/flame/{ => api}/utility_scripts/openpype_flame_to_ftrack/modules/__init__.py (100%) rename openpype/hosts/flame/{ => api}/utility_scripts/openpype_flame_to_ftrack/modules/app_utils.py (100%) rename openpype/hosts/flame/{ => api}/utility_scripts/openpype_flame_to_ftrack/modules/ftrack_lib.py (100%) rename openpype/hosts/flame/{ => api}/utility_scripts/openpype_flame_to_ftrack/modules/panel_app.py (100%) rename openpype/hosts/flame/{ => api}/utility_scripts/openpype_flame_to_ftrack/modules/uiwidgets.py (100%) rename openpype/hosts/flame/{ => api}/utility_scripts/openpype_flame_to_ftrack/openpype_flame_to_ftrack.py (100%) rename openpype/hosts/flame/{ => api}/utility_scripts/openpype_in_flame.py (100%) diff --git a/openpype/hosts/flame/scripts/wiretap_com.py b/openpype/hosts/flame/api/scripts/wiretap_com.py similarity index 100% rename from openpype/hosts/flame/scripts/wiretap_com.py rename to openpype/hosts/flame/api/scripts/wiretap_com.py diff --git a/openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/export_preset/openpype_seg_thumbnails_jpg.xml b/openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/export_preset/openpype_seg_thumbnails_jpg.xml similarity index 100% rename from openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/export_preset/openpype_seg_thumbnails_jpg.xml rename to openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/export_preset/openpype_seg_thumbnails_jpg.xml diff --git a/openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/export_preset/openpype_seg_video_h264.xml b/openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/export_preset/openpype_seg_video_h264.xml similarity index 100% rename from openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/export_preset/openpype_seg_video_h264.xml rename to openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/export_preset/openpype_seg_video_h264.xml diff --git a/openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/modules/__init__.py b/openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/modules/__init__.py similarity index 100% rename from openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/modules/__init__.py rename to openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/modules/__init__.py diff --git a/openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/modules/app_utils.py b/openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/modules/app_utils.py similarity index 100% rename from openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/modules/app_utils.py rename to openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/modules/app_utils.py diff --git a/openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/modules/ftrack_lib.py b/openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/modules/ftrack_lib.py similarity index 100% rename from openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/modules/ftrack_lib.py rename to openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/modules/ftrack_lib.py diff --git a/openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/modules/panel_app.py b/openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/modules/panel_app.py similarity index 100% rename from openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/modules/panel_app.py rename to openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/modules/panel_app.py diff --git a/openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/modules/uiwidgets.py b/openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/modules/uiwidgets.py similarity index 100% rename from openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/modules/uiwidgets.py rename to openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/modules/uiwidgets.py diff --git a/openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/openpype_flame_to_ftrack.py b/openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/openpype_flame_to_ftrack.py similarity index 100% rename from openpype/hosts/flame/utility_scripts/openpype_flame_to_ftrack/openpype_flame_to_ftrack.py rename to openpype/hosts/flame/api/utility_scripts/openpype_flame_to_ftrack/openpype_flame_to_ftrack.py diff --git a/openpype/hosts/flame/utility_scripts/openpype_in_flame.py b/openpype/hosts/flame/api/utility_scripts/openpype_in_flame.py similarity index 100% rename from openpype/hosts/flame/utility_scripts/openpype_in_flame.py rename to openpype/hosts/flame/api/utility_scripts/openpype_in_flame.py diff --git a/openpype/hosts/flame/api/utils.py b/openpype/hosts/flame/api/utils.py index a750046362..201c7d2fac 100644 --- a/openpype/hosts/flame/api/utils.py +++ b/openpype/hosts/flame/api/utils.py @@ -27,6 +27,7 @@ def _sync_utility_scripts(env=None): fsd_paths = [os.path.join( HOST_DIR, + "api", "utility_scripts" )] diff --git a/openpype/hosts/flame/hooks/pre_flame_setup.py b/openpype/hosts/flame/hooks/pre_flame_setup.py index 718c4b574c..159fb37410 100644 --- a/openpype/hosts/flame/hooks/pre_flame_setup.py +++ b/openpype/hosts/flame/hooks/pre_flame_setup.py @@ -22,7 +22,7 @@ class FlamePrelaunch(PreLaunchHook): flame_python_exe = "/opt/Autodesk/python/2021/bin/python2.7" wtc_script_path = os.path.join( - opflame.HOST_DIR, "scripts", "wiretap_com.py") + opflame.HOST_DIR, "api", "scripts", "wiretap_com.py") def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) From b3d2d41267c313a822c186af9b0232f29baad85e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 12:58:37 +0100 Subject: [PATCH 129/341] added working state context to category widget --- openpype/tools/settings/settings/categories.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/openpype/tools/settings/settings/categories.py b/openpype/tools/settings/settings/categories.py index a6e4154b2b..79b5de952b 100644 --- a/openpype/tools/settings/settings/categories.py +++ b/openpype/tools/settings/settings/categories.py @@ -1,6 +1,7 @@ import os import sys import traceback +import contextlib from enum import Enum from Qt import QtWidgets, QtCore, QtGui @@ -309,6 +310,12 @@ class SettingsCategoryWidget(QtWidgets.QWidget): ) self.content_layout.addWidget(widget, 0) + @contextlib.contextmanager + def working_state_context(self): + self.set_state(CategoryState.Working) + yield + self.set_state(CategoryState.Idle) + def save(self): if not self.items_are_valid(): return From 347b8da8a7a9a1a6c25d113fa6a2588b55acac04 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 12:59:01 +0100 Subject: [PATCH 130/341] use working_state_context for current actions --- openpype/tools/settings/settings/base.py | 39 ++++++++++++++++-------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/openpype/tools/settings/settings/base.py b/openpype/tools/settings/settings/base.py index f8378ed18c..1df7b2c75a 100644 --- a/openpype/tools/settings/settings/base.py +++ b/openpype/tools/settings/settings/base.py @@ -110,9 +110,10 @@ class BaseWidget(QtWidgets.QWidget): return def discard_changes(): - self.ignore_input_changes.set_ignore(True) - self.entity.discard_changes() - self.ignore_input_changes.set_ignore(False) + with self.category_widget.working_state_context(): + self.ignore_input_changes.set_ignore(True) + self.entity.discard_changes() + self.ignore_input_changes.set_ignore(False) action = QtWidgets.QAction("Discard changes") actions_mapping[action] = discard_changes @@ -124,8 +125,11 @@ class BaseWidget(QtWidgets.QWidget): if not self.entity.can_trigger_add_to_studio_default: return + def add_to_studio_default(): + with self.category_widget.working_state_context(): + self.entity.add_to_studio_default() action = QtWidgets.QAction("Add to studio default") - actions_mapping[action] = self.entity.add_to_studio_default + actions_mapping[action] = add_to_studio_default menu.addAction(action) def _remove_from_studio_default_action(self, menu, actions_mapping): @@ -133,9 +137,10 @@ class BaseWidget(QtWidgets.QWidget): return def remove_from_studio_default(): - self.ignore_input_changes.set_ignore(True) - self.entity.remove_from_studio_default() - self.ignore_input_changes.set_ignore(False) + with self.category_widget.working_state_context(): + self.ignore_input_changes.set_ignore(True) + self.entity.remove_from_studio_default() + self.ignore_input_changes.set_ignore(False) action = QtWidgets.QAction("Remove from studio default") actions_mapping[action] = remove_from_studio_default menu.addAction(action) @@ -144,8 +149,12 @@ class BaseWidget(QtWidgets.QWidget): if not self.entity.can_trigger_add_to_project_override: return + def add_to_project_override(): + with self.category_widget.working_state_context(): + self.entity.add_to_project_override + action = QtWidgets.QAction("Add to project project override") - actions_mapping[action] = self.entity.add_to_project_override + actions_mapping[action] = add_to_project_override menu.addAction(action) def _remove_from_project_override_action(self, menu, actions_mapping): @@ -153,9 +162,11 @@ class BaseWidget(QtWidgets.QWidget): return def remove_from_project_override(): - self.ignore_input_changes.set_ignore(True) - self.entity.remove_from_project_override() - self.ignore_input_changes.set_ignore(False) + with self.category_widget.working_state_context(): + self.ignore_input_changes.set_ignore(True) + self.entity.remove_from_project_override() + self.ignore_input_changes.set_ignore(False) + action = QtWidgets.QAction("Remove from project override") actions_mapping[action] = remove_from_project_override menu.addAction(action) @@ -257,14 +268,16 @@ class BaseWidget(QtWidgets.QWidget): # Simple paste value method def paste_value(): - _set_entity_value(self.entity, value) + with self.category_widget.working_state_context(): + _set_entity_value(self.entity, value) action = QtWidgets.QAction("Paste", menu) output.append((action, paste_value)) # Paste value to matchin entity def paste_value_to_path(): - _set_entity_value(matching_entity, value) + with self.category_widget.working_state_context(): + _set_entity_value(matching_entity, value) if matching_entity is not None: action = QtWidgets.QAction("Paste to same place", menu) From 74b6da96aca81a54e32f8984d865d6f5674c4061 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 12:59:21 +0100 Subject: [PATCH 131/341] added method to return project names from project list --- openpype/tools/settings/settings/widgets.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/openpype/tools/settings/settings/widgets.py b/openpype/tools/settings/settings/widgets.py index ac9870287b..4c7bf87ce8 100644 --- a/openpype/tools/settings/settings/widgets.py +++ b/openpype/tools/settings/settings/widgets.py @@ -747,6 +747,13 @@ class ProjectListWidget(QtWidgets.QWidget): index, QtCore.QItemSelectionModel.SelectionFlag.SelectCurrent ) + def get_project_names(self): + output = [] + for row in range(self.project_proxy.rowCount()): + index = self.project_proxy.index(row, 0) + output.append(index.data(PROJECT_NAME_ROLE)) + return output + def refresh(self): selected_project = None for index in self.project_list.selectedIndexes(): From e2f24fb87b3b732740649cf7f70fb32784530dcd Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 12:59:42 +0100 Subject: [PATCH 132/341] project category widget has ability to retrieve project names --- openpype/tools/settings/settings/categories.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openpype/tools/settings/settings/categories.py b/openpype/tools/settings/settings/categories.py index 79b5de952b..029619849e 100644 --- a/openpype/tools/settings/settings/categories.py +++ b/openpype/tools/settings/settings/categories.py @@ -606,6 +606,14 @@ class ProjectWidget(SettingsCategoryWidget): self.project_list_widget = project_list_widget + def get_project_names(self): + if ( + self.modify_defaults_checkbox + and self.modify_defaults_checkbox.isChecked() + ): + return [] + return self.project_list_widget.get_project_names() + def on_saved(self, saved_tab_widget): """Callback on any tab widget save. From 2fdac8639a00e58cb5544a6cdf9822d2bfa3d2c9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 13:00:07 +0100 Subject: [PATCH 133/341] initial version of applying settings from different project --- openpype/tools/settings/settings/base.py | 43 ++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/openpype/tools/settings/settings/base.py b/openpype/tools/settings/settings/base.py index 1df7b2c75a..f03d0c6186 100644 --- a/openpype/tools/settings/settings/base.py +++ b/openpype/tools/settings/settings/base.py @@ -1,7 +1,10 @@ import json from Qt import QtWidgets, QtGui, QtCore + +from openpype.settings.entities import ProjectSettings from openpype.tools.settings import CHILD_OFFSET + from .widgets import ExpandingWidget from .lib import create_deffered_value_change_timer @@ -285,6 +288,45 @@ class BaseWidget(QtWidgets.QWidget): return output + def _apply_values_from_project_action(self, menu, actions_mapping): + for attr_name in ("project_name", "get_project_names"): + if not hasattr(self.category_widget, attr_name): + return + + if self.entity.is_dynamic_item or self.entity.is_in_dynamic_item: + return + + submenu = QtWidgets.QMenu("Apply values from", menu) + + current_project_name = self.category_widget.project_name + for project_name in self.category_widget.get_project_names(): + if current_project_name == project_name: + continue + + if project_name is None: + project_name = "< Default >" + + action = QtWidgets.QAction(project_name) + submenu.addAction(action) + actions_mapping[action] = lambda: self._apply_values_from_project( + project_name + ) + menu.addMenu(submenu) + + def _apply_values_from_project(self, project_name): + with self.category_widget.working_state_context(): + path_keys = [ + item + for item in self.entity.path.split("/") + if item + ] + + settings = ProjectSettings(project_name) + entity = settings + for key in path_keys: + entity = entity[key] + self.entity.set(entity.value) + def show_actions_menu(self, event=None): if event and event.button() != QtCore.Qt.RightButton: return @@ -303,6 +345,7 @@ class BaseWidget(QtWidgets.QWidget): self._remove_from_studio_default_action(menu, actions_mapping) self._add_to_project_override_action(menu, actions_mapping) self._remove_from_project_override_action(menu, actions_mapping) + self._apply_values_from_project_action(menu, actions_mapping) ui_actions = [] ui_actions.extend(self._copy_value_actions(menu)) From c08b4673fd5fd935f41b5277c8977e80aaeb595b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 13:07:38 +0100 Subject: [PATCH 134/341] use defined constant for default project label --- openpype/tools/settings/settings/base.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/tools/settings/settings/base.py b/openpype/tools/settings/settings/base.py index f03d0c6186..94687f4f35 100644 --- a/openpype/tools/settings/settings/base.py +++ b/openpype/tools/settings/settings/base.py @@ -7,6 +7,7 @@ from openpype.tools.settings import CHILD_OFFSET from .widgets import ExpandingWidget from .lib import create_deffered_value_change_timer +from .constants import DEFAULT_PROJECT_LABEL class BaseWidget(QtWidgets.QWidget): @@ -304,7 +305,7 @@ class BaseWidget(QtWidgets.QWidget): continue if project_name is None: - project_name = "< Default >" + project_name = DEFAULT_PROJECT_LABEL action = QtWidgets.QAction(project_name) submenu.addAction(action) From 8270f2fc402a7cb119fdc71ead0bd474f0d7c9d6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 13:07:57 +0100 Subject: [PATCH 135/341] catch exceptions happened during applying values from different project --- openpype/tools/settings/settings/base.py | 40 ++++++++++++++++++------ 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/openpype/tools/settings/settings/base.py b/openpype/tools/settings/settings/base.py index 94687f4f35..6776845125 100644 --- a/openpype/tools/settings/settings/base.py +++ b/openpype/tools/settings/settings/base.py @@ -1,4 +1,6 @@ +import sys import json +import traceback from Qt import QtWidgets, QtGui, QtCore @@ -316,17 +318,35 @@ class BaseWidget(QtWidgets.QWidget): def _apply_values_from_project(self, project_name): with self.category_widget.working_state_context(): - path_keys = [ - item - for item in self.entity.path.split("/") - if item - ] + try: + path_keys = [ + item + for item in self.entity.path.split("/") + if item + ] + entity = ProjectSettings(project_name) + for key in path_keys: + entity = entity[key] + self.entity.set(entity.value) - settings = ProjectSettings(project_name) - entity = settings - for key in path_keys: - entity = entity[key] - self.entity.set(entity.value) + except Exception: + if project_name is None: + project_name = DEFAULT_PROJECT_LABEL + + # TODO better message + title = "Applying values failed" + msg = "Using values from project \"{}\" failed.".format( + project_name + ) + detail_msg = "".join( + traceback.format_exception(*sys.exc_info()) + ) + dialog = QtWidgets.QMessageBox(self) + dialog.setWindowTitle(title) + dialog.setIcon(QtWidgets.QMessageBox.Warning) + dialog.setText(msg) + dialog.setDetailedText(detail_msg) + dialog.exec_() def show_actions_menu(self, event=None): if event and event.button() != QtCore.Qt.RightButton: From 8e71919145a1ad491511697486238e8ebc82221e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 13:25:22 +0100 Subject: [PATCH 136/341] skip action if does not have any projects which can be used as source for values --- openpype/tools/settings/settings/base.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/openpype/tools/settings/settings/base.py b/openpype/tools/settings/settings/base.py index 6776845125..9016e63970 100644 --- a/openpype/tools/settings/settings/base.py +++ b/openpype/tools/settings/settings/base.py @@ -299,13 +299,18 @@ class BaseWidget(QtWidgets.QWidget): if self.entity.is_dynamic_item or self.entity.is_in_dynamic_item: return + current_project_name = self.category_widget.project_name + project_names = [] + for project_name in self.category_widget.get_project_names(): + if project_name != current_project_name: + project_names.append(project_name) + + if not project_names: + return + submenu = QtWidgets.QMenu("Apply values from", menu) - current_project_name = self.category_widget.project_name - for project_name in self.category_widget.get_project_names(): - if current_project_name == project_name: - continue - + for project_name in project_names: if project_name is None: project_name = DEFAULT_PROJECT_LABEL From d3ac116e70554e08397bc644ed3dc5b6fbbcfb5f Mon Sep 17 00:00:00 2001 From: BenoitConnan Date: Wed, 8 Dec 2021 15:09:10 +0100 Subject: [PATCH 137/341] add options to ReferenceLoader "attach_to_root" : wether or not a group should contain reference --- .../hosts/maya/plugins/load/load_reference.py | 111 +++++++++--------- 1 file changed, 57 insertions(+), 54 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_reference.py b/openpype/hosts/maya/plugins/load/load_reference.py index cfe8149218..858eb588b1 100644 --- a/openpype/hosts/maya/plugins/load/load_reference.py +++ b/openpype/hosts/maya/plugins/load/load_reference.py @@ -40,85 +40,88 @@ class ReferenceLoader(openpype.hosts.maya.api.plugin.ReferenceLoader): except ValueError: family = "model" + group_name = "{}:_GRP".format(namespace) + # True by default to keep legacy behaviours + attach_to_root = options.get("attach_to_root", True) + with maya.maintained_selection(): - groupName = "{}:_GRP".format(namespace) cmds.loadPlugin("AbcImport.mll", quiet=True) nodes = cmds.file(self.fname, namespace=namespace, sharedReferenceFile=False, - groupReference=True, - groupName=groupName, reference=True, - returnNewNodes=True) - - # namespace = cmds.referenceQuery(nodes[0], namespace=True) + returnNewNodes=True, + groupReference=attach_to_root, + groupName=group_name) shapes = cmds.ls(nodes, shapes=True, long=True) - newNodes = (list(set(nodes) - set(shapes))) + new_nodes = (list(set(nodes) - set(shapes))) current_namespace = pm.namespaceInfo(currentNamespace=True) if current_namespace != ":": - groupName = current_namespace + ":" + groupName + group_name = current_namespace + ":" + group_name - groupNode = pm.PyNode(groupName) - roots = set() + self[:] = new_nodes - for node in newNodes: - try: - roots.add(pm.PyNode(node).getAllParents()[-2]) - except: # noqa: E722 - pass + if attach_to_root: + group_node = pm.PyNode(group_name) + roots = set() - if family not in ["layout", "setdress", "mayaAscii", "mayaScene"]: + for node in new_nodes: + try: + roots.add(pm.PyNode(node).getAllParents()[-2]) + except: # noqa: E722 + pass + + if family not in [ + "layout", "setdress", "mayaAscii", "mayaScene"]: + for root in roots: + root.setParent(world=True) + + group_node.zeroTransformPivots() for root in roots: - root.setParent(world=True) + root.setParent(group_node) - groupNode.zeroTransformPivots() - for root in roots: - root.setParent(groupNode) + cmds.setAttr(group_name + ".displayHandle", 1) - cmds.setAttr(groupName + ".displayHandle", 1) + settings = get_project_settings(os.environ['AVALON_PROJECT']) + colors = settings['maya']['load']['colors'] + c = colors.get(family) + if c is not None: + group_node.useOutlinerColor.set(1) + group_node.outlinerColor.set( + (float(c[0])/255), + (float(c[1])/255), + (float(c[2])/255)) - settings = get_project_settings(os.environ['AVALON_PROJECT']) - colors = settings['maya']['load']['colors'] - c = colors.get(family) - if c is not None: - groupNode.useOutlinerColor.set(1) - groupNode.outlinerColor.set( - (float(c[0])/255), - (float(c[1])/255), - (float(c[2])/255) - ) - - self[:] = newNodes - - cmds.setAttr(groupName + ".displayHandle", 1) - # get bounding box - bbox = cmds.exactWorldBoundingBox(groupName) - # get pivot position on world space - pivot = cmds.xform(groupName, q=True, sp=True, ws=True) - # center of bounding box - cx = (bbox[0] + bbox[3]) / 2 - cy = (bbox[1] + bbox[4]) / 2 - cz = (bbox[2] + bbox[5]) / 2 - # add pivot position to calculate offset - cx = cx + pivot[0] - cy = cy + pivot[1] - cz = cz + pivot[2] - # set selection handle offset to center of bounding box - cmds.setAttr(groupName + ".selectHandleX", cx) - cmds.setAttr(groupName + ".selectHandleY", cy) - cmds.setAttr(groupName + ".selectHandleZ", cz) + cmds.setAttr(group_name + ".displayHandle", 1) + # get bounding box + bbox = cmds.exactWorldBoundingBox(group_name) + # get pivot position on world space + pivot = cmds.xform(group_name, q=True, sp=True, ws=True) + # center of bounding box + cx = (bbox[0] + bbox[3]) / 2 + cy = (bbox[1] + bbox[4]) / 2 + cz = (bbox[2] + bbox[5]) / 2 + # add pivot position to calculate offset + cx = cx + pivot[0] + cy = cy + pivot[1] + cz = cz + pivot[2] + # set selection handle offset to center of bounding box + cmds.setAttr(group_name + ".selectHandleX", cx) + cmds.setAttr(group_name + ".selectHandleY", cy) + cmds.setAttr(group_name + ".selectHandleZ", cz) if family == "rig": self._post_process_rig(name, namespace, context, options) else: - if "translate" in options: - cmds.setAttr(groupName + ".t", *options["translate"]) - return newNodes + if "translate" in options: + cmds.setAttr(group_name + ".t", *options["translate"]) + + return new_nodes def switch(self, container, representation): self.update(container, representation) From f88f1a5306b86e20e14dd17b313739107c782f5b Mon Sep 17 00:00:00 2001 From: BenoitConnan Date: Wed, 8 Dec 2021 15:24:24 +0100 Subject: [PATCH 138/341] hound fix --- openpype/hosts/maya/plugins/load/load_reference.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_reference.py b/openpype/hosts/maya/plugins/load/load_reference.py index 858eb588b1..dd64fd0a16 100644 --- a/openpype/hosts/maya/plugins/load/load_reference.py +++ b/openpype/hosts/maya/plugins/load/load_reference.py @@ -75,8 +75,8 @@ class ReferenceLoader(openpype.hosts.maya.api.plugin.ReferenceLoader): except: # noqa: E722 pass - if family not in [ - "layout", "setdress", "mayaAscii", "mayaScene"]: + if family not in ["layout", "setdress", + "mayaAscii", "mayaScene"]: for root in roots: root.setParent(world=True) @@ -92,9 +92,9 @@ class ReferenceLoader(openpype.hosts.maya.api.plugin.ReferenceLoader): if c is not None: group_node.useOutlinerColor.set(1) group_node.outlinerColor.set( - (float(c[0])/255), - (float(c[1])/255), - (float(c[2])/255)) + (float(c[0]) / 255), + (float(c[1]) / 255), + (float(c[2]) / 255)) cmds.setAttr(group_name + ".displayHandle", 1) # get bounding box From 6ed4db4da11ae598c8e7ebf3fbf94dc434cfcd47 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Wed, 8 Dec 2021 17:11:45 +0100 Subject: [PATCH 139/341] installand copy xcb libs to pyside2 inside openpype --- Dockerfile.centos7 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Dockerfile.centos7 b/Dockerfile.centos7 index f3b257e66b..ce60ea7fb1 100644 --- a/Dockerfile.centos7 +++ b/Dockerfile.centos7 @@ -41,6 +41,8 @@ RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.n ncurses \ ncurses-devel \ qt5-qtbase-devel \ + xcb-util-wm \ + xcb-util-renderutil && yum clean all # we need to build our own patchelf @@ -92,7 +94,8 @@ RUN source $HOME/.bashrc \ RUN cp /usr/lib64/libffi* ./build/exe.linux-x86_64-3.7/lib \ && cp /usr/lib64/libssl* ./build/exe.linux-x86_64-3.7/lib \ && cp /usr/lib64/libcrypto* ./build/exe.linux-x86_64-3.7/lib \ - && cp /root/.pyenv/versions/${OPENPYPE_PYTHON_VERSION}/lib/libpython* ./build/exe.linux-x86_64-3.7/lib + && cp /root/.pyenv/versions/${OPENPYPE_PYTHON_VERSION}/lib/libpython* ./build/exe.linux-x86_64-3.7/lib \ + && cp /usr/lib64/libxcb* ./build/exe.linux-x86_64-3.7/vendor/python/PySide2/Qt/lib RUN cd /opt/openpype \ rm -rf ./vendor/bin From 0dd3eca360fd10693f3c3a1de6375d55151d7c41 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 17:25:24 +0100 Subject: [PATCH 140/341] added helper method to change style properties --- openpype/tools/settings/settings/base.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openpype/tools/settings/settings/base.py b/openpype/tools/settings/settings/base.py index f8378ed18c..bc6c6d10ff 100644 --- a/openpype/tools/settings/settings/base.py +++ b/openpype/tools/settings/settings/base.py @@ -26,6 +26,14 @@ class BaseWidget(QtWidgets.QWidget): self.label_widget = None self.create_ui() + @staticmethod + def set_style_property(obj, property_name, property_value): + if obj.property(property_name) == property_value: + return + + obj.setProperty(property_name, property_value) + obj.style().polish(obj) + def scroll_to(self, widget): self.category_widget.scroll_to(widget) From 0479d544bd3c23539c3367ac2dada2d8345c7ad0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 17:25:41 +0100 Subject: [PATCH 141/341] update geo on show of completer view --- openpype/tools/settings/settings/widgets.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openpype/tools/settings/settings/widgets.py b/openpype/tools/settings/settings/widgets.py index 4b88c1f93f..bfe8339219 100644 --- a/openpype/tools/settings/settings/widgets.py +++ b/openpype/tools/settings/settings/widgets.py @@ -95,6 +95,10 @@ class CompleterView(QtWidgets.QListView): return result + def showEvent(self, event): + super(CompleterView, self).showEvent(event) + self._update_geo() + def _update_geo(self): size_hint = self.sizeHint() self.resize(size_hint.width(), size_hint.height()) From ccce04309bac2318a6ebf87916b0f646e3204dd1 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 17:26:33 +0100 Subject: [PATCH 142/341] renamed exception BaseInvalidValueType to BaseInvalidValue --- openpype/settings/entities/__init__.py | 4 ++-- openpype/settings/entities/base_entity.py | 4 ++-- openpype/settings/entities/color_entity.py | 6 +++--- openpype/settings/entities/exceptions.py | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/openpype/settings/entities/__init__.py b/openpype/settings/entities/__init__.py index 4efd358297..a173e2454f 100644 --- a/openpype/settings/entities/__init__.py +++ b/openpype/settings/entities/__init__.py @@ -57,7 +57,7 @@ from .exceptions import ( SchemaError, DefaultsNotDefined, StudioDefaultsNotDefined, - BaseInvalidValueType, + BaseInvalidValue, InvalidValueType, InvalidKeySymbols, SchemaMissingFileInfo, @@ -130,7 +130,7 @@ from .op_version_entity import ( __all__ = ( "DefaultsNotDefined", "StudioDefaultsNotDefined", - "BaseInvalidValueType", + "BaseInvalidValue", "InvalidValueType", "InvalidKeySymbols", "SchemaMissingFileInfo", diff --git a/openpype/settings/entities/base_entity.py b/openpype/settings/entities/base_entity.py index 341968bd75..12754d345f 100644 --- a/openpype/settings/entities/base_entity.py +++ b/openpype/settings/entities/base_entity.py @@ -9,7 +9,7 @@ from .lib import ( ) from .exceptions import ( - BaseInvalidValueType, + BaseInvalidValue, InvalidValueType, SchemeGroupHierarchyBug, EntitySchemaError @@ -432,7 +432,7 @@ class BaseItemEntity(BaseEntity): try: new_value = self.convert_to_valid_type(value) - except BaseInvalidValueType: + except BaseInvalidValue: new_value = NOT_SET if new_value is not NOT_SET: diff --git a/openpype/settings/entities/color_entity.py b/openpype/settings/entities/color_entity.py index 3becf2d865..bdaab6f583 100644 --- a/openpype/settings/entities/color_entity.py +++ b/openpype/settings/entities/color_entity.py @@ -1,7 +1,7 @@ from .lib import STRING_TYPE from .input_entities import InputEntity from .exceptions import ( - BaseInvalidValueType, + BaseInvalidValue, InvalidValueType ) @@ -47,7 +47,7 @@ class ColorEntity(InputEntity): reason = "Color entity expect 4 items in list got {}".format( len(value) ) - raise BaseInvalidValueType(reason, self.path) + raise BaseInvalidValue(reason, self.path) new_value = [] for item in value: @@ -60,7 +60,7 @@ class ColorEntity(InputEntity): reason = ( "Color entity expect 4 integers in range 0-255 got {}" ).format(value) - raise BaseInvalidValueType(reason, self.path) + raise BaseInvalidValue(reason, self.path) new_value.append(item) # Make sure diff --git a/openpype/settings/entities/exceptions.py b/openpype/settings/entities/exceptions.py index f352c94f20..d1728a7b12 100644 --- a/openpype/settings/entities/exceptions.py +++ b/openpype/settings/entities/exceptions.py @@ -15,14 +15,14 @@ class StudioDefaultsNotDefined(Exception): super(StudioDefaultsNotDefined, self).__init__(msg) -class BaseInvalidValueType(Exception): +class BaseInvalidValue(Exception): def __init__(self, reason, path): msg = "Path \"{}\". {}".format(path, reason) self.msg = msg - super(BaseInvalidValueType, self).__init__(msg) + super(BaseInvalidValue, self).__init__(msg) -class InvalidValueType(BaseInvalidValueType): +class InvalidValueType(BaseInvalidValue): def __init__(self, valid_types, invalid_type, path): joined_types = ", ".join( [str(valid_type) for valid_type in valid_types] From 703368c5b0eaddc93172d6487ac1b5dcb0e5f91b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 17:27:02 +0100 Subject: [PATCH 143/341] added validation of version value with convert_to_valid_type --- .../settings/entities/op_version_entity.py | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/openpype/settings/entities/op_version_entity.py b/openpype/settings/entities/op_version_entity.py index 2458f03852..20495a0d42 100644 --- a/openpype/settings/entities/op_version_entity.py +++ b/openpype/settings/entities/op_version_entity.py @@ -2,10 +2,15 @@ from openpype.lib.openpype_version import ( op_version_control_available, get_remote_versions, openpype_path_is_set, - openpype_path_is_accessible + openpype_path_is_accessible, + get_OpenPypeVersion ) from .input_entities import TextEntity -from .lib import OverrideState +from .lib import ( + OverrideState, + NOT_SET +) +from .exceptions import BaseInvalidValue class OpenPypeVersionInput(TextEntity): @@ -32,6 +37,21 @@ class OpenPypeVersionInput(TextEntity): state, *args, **kwargs ) + def convert_to_valid_type(self, value): + if value and value is not NOT_SET: + OpenPypeVersion = get_OpenPypeVersion() + if OpenPypeVersion is not None: + try: + OpenPypeVersion(version=value) + except Exception: + raise BaseInvalidValue( + "Value \"{}\"is not valid version format.".format( + value + ), + self.path + ) + return super(OpenPypeVersionInput, self).convert_to_valid_type(value) + class ProductionVersionsInputEntity(OpenPypeVersionInput): schema_types = ["production-versions-text"] From 9acdf2e338ebd44c4321035b4e885e863c81deab Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 17:27:27 +0100 Subject: [PATCH 144/341] added style to info label --- openpype/style/data.json | 4 +++- openpype/style/style.css | 8 ++++++++ openpype/tools/settings/settings/item_widgets.py | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/openpype/style/data.json b/openpype/style/data.json index 026eaf4264..62573f015e 100644 --- a/openpype/style/data.json +++ b/openpype/style/data.json @@ -111,7 +111,9 @@ "focus-border": "#839caf", "image-btn": "#bfccd6", "image-btn-hover": "#189aea", - "image-btn-disabled": "#bfccd6" + "image-btn-disabled": "#bfccd6", + "version-exists": "#458056", + "version-not-found": "#ffc671" } } } diff --git a/openpype/style/style.css b/openpype/style/style.css index 0ef15a2511..9249db5f1e 100644 --- a/openpype/style/style.css +++ b/openpype/style/style.css @@ -1158,6 +1158,14 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { border-radius: 5px; } +#OpenPypeVersionLabel[state="success"] { + color: {color:settings:version-exists}; +} + +#OpenPypeVersionLabel[state="warning"] { + color: {color:settings:version-not-found}; +} + #ShadowWidget { font-size: 36pt; } diff --git a/openpype/tools/settings/settings/item_widgets.py b/openpype/tools/settings/settings/item_widgets.py index 0c66162375..3a7a107965 100644 --- a/openpype/tools/settings/settings/item_widgets.py +++ b/openpype/tools/settings/settings/item_widgets.py @@ -424,6 +424,7 @@ class OpenPypeVersionText(TextWidget): def create_ui(self): super(OpenPypeVersionText, self).create_ui() info_widget = QtWidgets.QLabel("Latest", self) + info_widget.setObjectName("OpenPypeVersionLabel") self.content_layout.addWidget(info_widget, 1) self._info_widget = info_widget From 84022f9e0def952a44a7cbea3f35b690705c2c78 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 17:27:53 +0100 Subject: [PATCH 145/341] added more variants of info label with colors and ivalidation --- .../tools/settings/settings/item_widgets.py | 63 +++++++++++++++++-- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/openpype/tools/settings/settings/item_widgets.py b/openpype/tools/settings/settings/item_widgets.py index 3a7a107965..9f78060c87 100644 --- a/openpype/tools/settings/settings/item_widgets.py +++ b/openpype/tools/settings/settings/item_widgets.py @@ -4,6 +4,7 @@ from Qt import QtWidgets, QtCore, QtGui from openpype.widgets.sliders import NiceSlider from openpype.tools.settings import CHILD_OFFSET +from openpype.settings.entities.exceptions import BaseInvalidValue from .widgets import ( ExpandingWidget, @@ -423,7 +424,7 @@ class OpenPypeVersionText(TextWidget): def create_ui(self): super(OpenPypeVersionText, self).create_ui() - info_widget = QtWidgets.QLabel("Latest", self) + info_widget = QtWidgets.QLabel(self) info_widget.setObjectName("OpenPypeVersionLabel") self.content_layout.addWidget(info_widget, 1) @@ -431,17 +432,67 @@ class OpenPypeVersionText(TextWidget): def _update_info_widget(self): value = self.input_value() - if value == "": - self._info_widget.setText("Latest") + + message = "" + tooltip = "" + state = None + if self._is_invalid: + message = "Invalid version format" + + elif value == "": + message = "Use latest available version" + tooltip = "Latest version from OpenPype zip repository will used" + elif value in self.entity.value_hints: - self._info_widget.setText("Ok") + message = "Version {} will be used".format(value) + state = "success" + else: - self._info_widget.setText("Version not found from this workstation") + message = ( + "Version {} not found in listed versions".format(value) + ) + state = "warning" + if self.entity.value_hints: + tooltip = "Found versions are {}".format(", ".join( + ['"{}"'.format(hint) for hint in self.entity.value_hints] + )) + else: + tooltip = "No versions were found" + + self._info_widget.setText(message) + self._info_widget.setToolTip(tooltip) + self.set_style_property(self._info_widget, "state", state) + + def set_entity_value(self): + super(OpenPypeVersionText, self).set_entity_value() + self._invalidate() + self._update_info_widget() + + def _on_value_change_timer(self): + value = self.input_value() + self._invalidate() + if not self.is_invalid: + self.entity.set(value) + self.update_style() + else: + # Manually trigger hierachical style update + self.ignore_input_changes.set_ignore(True) + self.ignore_input_changes.set_ignore(False) + + self._update_info_widget() + + def _invalidate(self): + value = self.input_value() + try: + self.entity.convert_to_valid_type(value) + is_invalid = False + except BaseInvalidValue: + is_invalid = True + self._is_invalid = is_invalid def _on_entity_change(self): super(OpenPypeVersionText, self)._on_entity_change() self._refresh_completer() - self._update_info_widget() class NumberWidget(InputWidget): From 5181c52d12a2a7e3b2688d01ea7f05df73379d70 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 17:29:49 +0100 Subject: [PATCH 146/341] modified messages a little bit --- openpype/tools/settings/settings/item_widgets.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/openpype/tools/settings/settings/item_widgets.py b/openpype/tools/settings/settings/item_widgets.py index 9f78060c87..22f672da2b 100644 --- a/openpype/tools/settings/settings/item_widgets.py +++ b/openpype/tools/settings/settings/item_widgets.py @@ -437,27 +437,29 @@ class OpenPypeVersionText(TextWidget): tooltip = "" state = None if self._is_invalid: - message = "Invalid version format" + message = "Invalid OpenPype version format" elif value == "": message = "Use latest available version" - tooltip = "Latest version from OpenPype zip repository will used" + tooltip = ( + "Latest version from OpenPype zip repository will be used" + ) elif value in self.entity.value_hints: - message = "Version {} will be used".format(value) state = "success" + message = "Version {} will be used".format(value) else: + state = "warning" message = ( "Version {} not found in listed versions".format(value) ) - state = "warning" if self.entity.value_hints: - tooltip = "Found versions are {}".format(", ".join( + tooltip = "Listed versions: {}".format(", ".join( ['"{}"'.format(hint) for hint in self.entity.value_hints] )) else: - tooltip = "No versions were found" + tooltip = "No versions were listed" self._info_widget.setText(message) self._info_widget.setToolTip(tooltip) From 1588df3ca275165a3fb143ddcd5c9d4b4af92ea8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 17:37:03 +0100 Subject: [PATCH 147/341] added placeholder inheritance back --- openpype/tools/settings/settings/widgets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/tools/settings/settings/widgets.py b/openpype/tools/settings/settings/widgets.py index 3e44bd3969..cc6e396db0 100644 --- a/openpype/tools/settings/settings/widgets.py +++ b/openpype/tools/settings/settings/widgets.py @@ -185,7 +185,7 @@ class CompleterView(QtWidgets.QListView): self._on_activated(index) -class SettingsLineEdit(QtWidgets.QLineEdit): +class SettingsLineEdit(PlaceholderLineEdit): focused_in = QtCore.Signal() def __init__(self, *args, **kwargs): From 9e2760c52e5e0a8964e2ed3f6c1bcb44976408eb Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 8 Dec 2021 18:10:46 +0100 Subject: [PATCH 148/341] OP-2042 - better handling of reusing deployed workfile --- .../hosts/nuke/test_publish_in_nuke.py | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py index d603b9f177..092fd7d1c6 100644 --- a/tests/integration/hosts/nuke/test_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -1,6 +1,7 @@ import pytest import os import logging +import shutil from tests.lib.testing_classes import PublishTest @@ -23,6 +24,8 @@ class TestPublishInNuke(PublishTest): (in cmd with activated {OPENPYPE_ROOT}/.venv) {OPENPYPE_ROOT}/.venv/Scripts/python.exe {OPENPYPE_ROOT}/start.py runtests ../tests/integration/hosts/nuke # noqa: E501 + To check log/errors from launched app's publish process keep PERSIST + to True and check `test_openpype.logs` collection. """ PERSIST = True # True - keep test_db, test_openpype, outputted test files @@ -36,21 +39,32 @@ class TestPublishInNuke(PublishTest): TIMEOUT = 120 # publish timeout - TEST_DATA_FOLDER = None # provide existing folder with test data + TEST_DATA_FOLDER = "C:\\Users\\petrk\\AppData\\Local\\Temp\\tmpbfh976y6" # provide existing folder with test data @pytest.fixture(scope="module") def last_workfile_path(self, download_test_data): """Get last_workfile_path from source data. """ - log.info("log last_workfile_path") - src_path = os.path.join( - download_test_data, - "input", - "workfile", - "test_project_test_asset_CompositingInNuke_v001.nk") + source_file_name = "test_project_test_asset_CompositingInNuke_v001.nk" + src_path = os.path.join(download_test_data, + "input", + "workfile", + source_file_name) + dest_folder = os.path.join(download_test_data, + self.PROJECT, + self.ASSET, + "work", + self.TASK) + if not os.path.exists(dest_folder): + os.makedirs(dest_folder) - yield src_path + dest_path = os.path.join(dest_folder, + source_file_name) + + shutil.copy(src_path, dest_path) + + yield dest_path @pytest.fixture(scope="module") def startup_scripts(self, monkeypatch_session, download_test_data): @@ -68,9 +82,9 @@ class TestPublishInNuke(PublishTest): """Host and input data dependent expected results in DB.""" print("test_db_asserts") versions = dbcon.count_documents({"type": "version"}) - assert 5 == versions, \ + assert 2 == versions, \ "Not expected no of versions. "\ - "Expected 5, found {}".format(versions) + "Expected 2, found {}".format(versions) assert 0 == dbcon.count_documents({"type": "version", "name": {"$ne": 1}}), \ From a3638ef70ffc2c6d6bed9b8bf0126736f59b35fe Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 8 Dec 2021 18:12:01 +0100 Subject: [PATCH 149/341] OP-2042 - injection of TEST_SOURCE_FOLDER It tells Nuke where it should locate test input data --- tests/lib/testing_classes.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index 0a04dc59c2..25ad66cdfb 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -105,9 +105,6 @@ class ModuleUnitTest(BaseTest): value = value.format(**all_vars) print("Setting {}:{}".format(key, value)) monkeypatch_session.setenv(key, str(value)) - import openpype - - openpype_root = os.path.dirname(os.path.dirname(openpype.__file__)) #reset connection to openpype DB with new env var import openpype.settings.lib as sett_lib @@ -116,10 +113,16 @@ class ModuleUnitTest(BaseTest): sett_lib.create_settings_handler() sett_lib.create_local_settings_handler() + import openpype + openpype_root = os.path.dirname(os.path.dirname(openpype.__file__)) + # ?? why 2 of those monkeypatch_session.setenv("OPENPYPE_ROOT", openpype_root) monkeypatch_session.setenv("OPENPYPE_REPOS_ROOT", openpype_root) + # for remapping purposes (currently in Nuke) + monkeypatch_session.setenv("TEST_SOURCE_FOLDER", download_test_data) + @pytest.fixture(scope="module") def db_setup(self, download_test_data, env_var, monkeypatch_session): """Restore prepared MongoDB dumps into selected DB.""" @@ -271,7 +274,8 @@ class PublishTest(ModuleUnitTest): app_name = "{}/{}".format(self.APP, variant) - yield application_manager.launch(app_name, **data) + app_process = application_manager.launch(app_name, **data) + yield app_process @pytest.fixture(scope="module") def publish_finished(self, dbcon, launched_app, download_test_data): From e680a362b778943f9cfe80f18395c69c8c5ca8b2 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 8 Dec 2021 18:13:08 +0100 Subject: [PATCH 150/341] OP-2042 - additions to developer documentation --- tests/integration/README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tests/integration/README.md b/tests/integration/README.md index 8839e2e43f..0b6a1804ae 100644 --- a/tests/integration/README.md +++ b/tests/integration/README.md @@ -15,6 +15,10 @@ How to run OR can use built executables `openpype_console runtests {ABS_PATH}/tests/integration` +How to check logs/errors from app +-------------------------------- +Keep PERSIST to True in the class and check `test_openpype.logs` collection. + How to create test for publishing from host ------------------------------------------ - Extend PublishTest in `tests/lib/testing_classes.py` @@ -28,9 +32,21 @@ How to create test for publishing from host ``` import openpype from avalon import api, HOST + +from openpype.api import Logger + +log = Logger().get_logger(__name__) api.install(HOST) -pyblish.util.publish() +log_lines = [] +for result in pyblish.util.publish_iter(): + for record in result["records"]: # for logging to test_openpype DB + log_lines.append("{}: {}".format( + result["plugin"].label, record.msg)) + + if result["error"]: + err_fmt = "Failed {plugin.__name__}: {error} -- {error.traceback}" + log.error(err_fmt.format(**result)) EXIT_APP (command to exit host) ``` From 767ef9d715c92f50493a1d20352e3df5ecaff63a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 18:31:14 +0100 Subject: [PATCH 151/341] sort versions earlier --- start.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/start.py b/start.py index 32fa4bd062..55008a9526 100644 --- a/start.py +++ b/start.py @@ -662,6 +662,8 @@ def _find_frozen_openpype(use_version: str = None, if local_version not in openpype_versions: openpype_versions.append(local_version) + openpype_versions.sort() + # Find OpenPype version that should be used openpype_version = None if use_version is not None: @@ -694,7 +696,6 @@ def _find_frozen_openpype(use_version: str = None, else: # Use latest available version _print("Finding latest version") - openpype_versions.sort() openpype_version = openpype_versions[-1] # get local frozen version and add it to detected version so if it is From ce204157273e74fd15abd9a37eafbd7722e533a7 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 18:31:40 +0100 Subject: [PATCH 152/341] added option to pass "latest" to use version argument --- start.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/start.py b/start.py index 55008a9526..28c04600c4 100644 --- a/start.py +++ b/start.py @@ -667,13 +667,17 @@ def _find_frozen_openpype(use_version: str = None, # Find OpenPype version that should be used openpype_version = None if use_version is not None: - # Version was specified with arguments or env OPENPYPE_VERSION - # - should crash if version is not available - _print("Finding specified version \"{}\"".format(use_version)) - for version in openpype_versions: - if version == use_version: - openpype_version = version - break + if use_version.lower() == "latest": + openpype_version = openpype_versions[-1] + else: + use_version_obj = OpenPypeVersion(use_version) + # Version was specified with arguments or env OPENPYPE_VERSION + # - should crash if version is not available + _print("Finding specified version \"{}\"".format(use_version)) + for version in openpype_versions: + if version == use_version_obj: + openpype_version = version + break if openpype_version is None: raise OpenPypeVersionNotFound( From 52c5424f2b59987876eb0412dfbdab2c8af0cd09 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 18:31:50 +0100 Subject: [PATCH 153/341] modified messages --- start.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/start.py b/start.py index 28c04600c4..6fa624b5cd 100644 --- a/start.py +++ b/start.py @@ -681,7 +681,9 @@ def _find_frozen_openpype(use_version: str = None, if openpype_version is None: raise OpenPypeVersionNotFound( - "Requested version \"{}\" was not found.".format(use_version) + "Requested version \"{}\" was not found.".format( + use_version + ) ) elif studio_version: @@ -695,7 +697,7 @@ def _find_frozen_openpype(use_version: str = None, raise OpenPypeVersionNotFound(( "Requested OpenPype version \"{}\" defined by settings" " was not found." - ).format(use_version)) + ).format(studio_version)) else: # Use latest available version From 97404abf43adc4ebb38afa1e93403e7d16776b97 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 8 Dec 2021 19:00:12 +0100 Subject: [PATCH 154/341] OP-2053 - added check of installed extension for PS --- .../publish/collect_extension_version.py | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 openpype/hosts/photoshop/plugins/publish/collect_extension_version.py diff --git a/openpype/hosts/photoshop/plugins/publish/collect_extension_version.py b/openpype/hosts/photoshop/plugins/publish/collect_extension_version.py new file mode 100644 index 0000000000..f07ff0b0ff --- /dev/null +++ b/openpype/hosts/photoshop/plugins/publish/collect_extension_version.py @@ -0,0 +1,57 @@ +import os +import re +import pyblish.api + +from avalon import photoshop + + +class CollectExtensionVersion(pyblish.api.ContextPlugin): + """ Pulls and compares version of installed extension. + + It is recommended to use same extension as in provided Openpype code. + + Please use Anastasiy’s Extension Manager or ZXPInstaller to update + extension in case of an error. + + You can locate extension.zxp in your installed Openpype code in + `repos/avalon-core/avalon/photoshop` + """ + # This technically should be a validator, but other collectors might be + # impacted with usage of obsolete extension, so collector that runs first + # was chosen + order = pyblish.api.CollectorOrder - 0.5 + label = "Collect extension version" + hosts = ["photoshop"] + + optional = True + active = True + + def process(self, context): + installed_version = photoshop.stub().get_extension_version() + + if not installed_version: + raise ValueError("Unknown version, probably old extension") + + manifest_url = os.path.join(os.path.dirname(photoshop.__file__), + "extension", "CSXS", "manifest.xml") + + if not os.path.exists(manifest_url): + self.log.debug("Unable to locate extension manifest, not checking") + return + + expected_version = None + with open(manifest_url) as fp: + content = fp.read() + + found = re.findall(r'(ExtensionBundleVersion=")([0-10\.]+)(")', + content) + if found: + expected_version = found[0][1] + + if expected_version != installed_version: + msg = "Expected version '{}' found '{}'\n".format( + expected_version, installed_version) + msg += "Please update your installed extension, it might not work " + msg += "properly." + + raise ValueError(msg) From 5dc2fd05885718cb6c90083f14f60de18cc2c828 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 8 Dec 2021 19:00:44 +0100 Subject: [PATCH 155/341] OP-2053 - bump down order of collector for current file It depends on valid extension --- .../hosts/photoshop/plugins/publish/collect_current_file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/photoshop/plugins/publish/collect_current_file.py b/openpype/hosts/photoshop/plugins/publish/collect_current_file.py index 3cc3e3f636..4d4829555e 100644 --- a/openpype/hosts/photoshop/plugins/publish/collect_current_file.py +++ b/openpype/hosts/photoshop/plugins/publish/collect_current_file.py @@ -8,7 +8,7 @@ from avalon import photoshop class CollectCurrentFile(pyblish.api.ContextPlugin): """Inject the current working file into context""" - order = pyblish.api.CollectorOrder - 0.5 + order = pyblish.api.CollectorOrder - 0.49 label = "Current File" hosts = ["photoshop"] From d2edf3da743459bf3b043d5c855098b04cb66e79 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 19:02:37 +0100 Subject: [PATCH 156/341] don't return latest version --- igniter/bootstrap_repos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 9446b3e8ce..3db9dd0b91 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -589,7 +589,7 @@ class OpenPypeVersion(semver.VersionInfo): """ result = get_expected_studio_version_str(staging) if not result: - return cls.get_latest_version(staging, False) + return None return OpenPypeVersion(version=result) From 02b8e57a81a2b4c9782dc69a57e7b53c29598d8a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 19:03:16 +0100 Subject: [PATCH 157/341] return None from get_latest_version if there are any openpype versions available --- igniter/bootstrap_repos.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 3db9dd0b91..163db07f59 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -559,7 +559,8 @@ class OpenPypeVersion(semver.VersionInfo): staging: bool = False, local: bool = False) -> OpenPypeVersion: """Get latest available version. - This is utility version to get latest version from all found. + This is utility version to get latest version from all found except + build. Args: staging (bool, optional): List staging versions if True. @@ -572,6 +573,8 @@ class OpenPypeVersion(semver.VersionInfo): openpype_versions = OpenPypeVersion.get_available_versions( staging, local) + if not openpype_versions: + return None return openpype_versions[-1] @classmethod From a160e2229068007f28a320800c0d983784f11405 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 19:03:29 +0100 Subject: [PATCH 158/341] have ability to get build version --- igniter/bootstrap_repos.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 163db07f59..920eb5fa6b 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -554,6 +554,19 @@ class OpenPypeVersion(semver.VersionInfo): return sorted(_openpype_versions) + @staticmethod + def get_build_version(): + """Get version of OpenPype inside build.""" + openpype_root = Path(os.environ["OPENPYPE_ROOT"]) + build_version_str = BootstrapRepos.get_version(openpype_root) + build_version = None + if build_version_str: + build_version = OpenPypeVersion( + version=build_version_str, + path=openpype_root + ) + return build_version + @staticmethod def get_latest_version( staging: bool = False, local: bool = False) -> OpenPypeVersion: From 406ece7e44db78e44d365632ec6ac1ddaf8494fe Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 19:03:55 +0100 Subject: [PATCH 159/341] use new methods in start.py --- start.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/start.py b/start.py index 6fa624b5cd..80baff5496 100644 --- a/start.py +++ b/start.py @@ -651,16 +651,11 @@ def _find_frozen_openpype(use_version: str = None, include_zips=True, staging=use_staging ) - openpype_root = Path(os.environ["OPENPYPE_ROOT"]) - local_version_str = bootstrap.get_version(openpype_root) + local_version = OpenPypeVersion.get_build_version() + if local_version not in openpype_versions: + openpype_versions.append(local_version) + studio_version = OpenPypeVersion.get_expected_studio_version(use_staging) - if local_version_str: - local_version = OpenPypeVersion( - version=local_version_str, - path=openpype_root - ) - if local_version not in openpype_versions: - openpype_versions.append(local_version) openpype_versions.sort() @@ -668,6 +663,7 @@ def _find_frozen_openpype(use_version: str = None, openpype_version = None if use_version is not None: if use_version.lower() == "latest": + _print("Finding latest version") openpype_version = openpype_versions[-1] else: use_version_obj = OpenPypeVersion(use_version) From 715e1a6d32e19fe53ecd3c2061fac6cd87549f04 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 19:06:16 +0100 Subject: [PATCH 160/341] cache build version is it probably won't change during process time --- igniter/bootstrap_repos.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 920eb5fa6b..5e8efd1cc4 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -63,6 +63,7 @@ class OpenPypeVersion(semver.VersionInfo): staging = False path = None _VERSION_REGEX = re.compile(r"(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)(?:-(?P(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$") # noqa: E501 + _build_version = None def __init__(self, *args, **kwargs): """Create OpenPype version. @@ -554,18 +555,20 @@ class OpenPypeVersion(semver.VersionInfo): return sorted(_openpype_versions) - @staticmethod - def get_build_version(): + @classmethod + def get_build_version(cls): """Get version of OpenPype inside build.""" - openpype_root = Path(os.environ["OPENPYPE_ROOT"]) - build_version_str = BootstrapRepos.get_version(openpype_root) - build_version = None - if build_version_str: - build_version = OpenPypeVersion( - version=build_version_str, - path=openpype_root - ) - return build_version + if cls._build_version is None: + openpype_root = Path(os.environ["OPENPYPE_ROOT"]) + build_version_str = BootstrapRepos.get_version(openpype_root) + build_version = None + if build_version_str: + build_version = OpenPypeVersion( + version=build_version_str, + path=openpype_root + ) + cls._build_version = build_version + return cls._build_version @staticmethod def get_latest_version( From 02686ff096cb3dafd51aa74d1d288c6b7c556506 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 19:31:29 +0100 Subject: [PATCH 161/341] added get build version --- openpype/lib/openpype_version.py | 10 ++++++++++ openpype/settings/entities/op_version_entity.py | 11 ++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/openpype/lib/openpype_version.py b/openpype/lib/openpype_version.py index 42ee454378..7d9dc6ef94 100644 --- a/openpype/lib/openpype_version.py +++ b/openpype/lib/openpype_version.py @@ -20,6 +20,16 @@ def op_version_control_available(): return True +def get_build_version(): + """Get OpenPype version inside build. + + This version is not returned by any other functions here. + """ + if op_version_control_available(): + return get_OpenPypeVersion().get_build_version() + return None + + def get_available_versions(*args, **kwargs): """Get list of available versions.""" if op_version_control_available(): diff --git a/openpype/settings/entities/op_version_entity.py b/openpype/settings/entities/op_version_entity.py index 20495a0d42..cf2150f12e 100644 --- a/openpype/settings/entities/op_version_entity.py +++ b/openpype/settings/entities/op_version_entity.py @@ -3,7 +3,8 @@ from openpype.lib.openpype_version import ( get_remote_versions, openpype_path_is_set, openpype_path_is_accessible, - get_OpenPypeVersion + get_OpenPypeVersion, + get_build_version ) from .input_entities import TextEntity from .lib import ( @@ -57,11 +58,15 @@ class ProductionVersionsInputEntity(OpenPypeVersionInput): schema_types = ["production-versions-text"] def _get_openpype_versions(self): - return get_remote_versions(production=True) + versions = get_remote_versions(staging=False, production=True) + versions.append(get_build_version()) + return sorted(versions) class StagingVersionsInputEntity(OpenPypeVersionInput): schema_types = ["staging-versions-text"] def _get_openpype_versions(self): - return get_remote_versions(staging=True) + versions = get_remote_versions(staging=True, production=False) + versions.append(get_build_version()) + return sorted(versions) From b3c1bbd84ee31795a3425d5fd245c2d639b8b58f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 19:31:36 +0100 Subject: [PATCH 162/341] removed unused imports --- openpype/settings/entities/enum_entity.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/openpype/settings/entities/enum_entity.py b/openpype/settings/entities/enum_entity.py index 7c8721556f..fb6099e82a 100644 --- a/openpype/settings/entities/enum_entity.py +++ b/openpype/settings/entities/enum_entity.py @@ -1,10 +1,4 @@ import copy -from openpype.lib.openpype_version import ( - op_version_control_available, - get_remote_versions, - openpype_path_is_set, - openpype_path_is_accessible -) from .input_entities import InputEntity from .exceptions import EntitySchemaError from .lib import ( From c05ec98b6049202aacb3273ed2d5ea38b97b5e00 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 8 Dec 2021 19:32:07 +0100 Subject: [PATCH 163/341] removed current verions functions and replace then with get_expected_studio_version --- openpype/lib/openpype_version.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/openpype/lib/openpype_version.py b/openpype/lib/openpype_version.py index 7d9dc6ef94..9a92454eca 100644 --- a/openpype/lib/openpype_version.py +++ b/openpype/lib/openpype_version.py @@ -2,7 +2,11 @@ Access to logic from igniter is available only for OpenPype processes. Is meant to be able check OpenPype versions for studio. The logic is dependent -on igniter's logic of processing. +on igniter's inner logic of versions. + +Keep in mind that all functions except 'get_build_version' does not return +OpenPype version located in build but versions available in remote versions +repository or locally available. """ import sys @@ -40,42 +44,42 @@ def get_available_versions(*args, **kwargs): def openpype_path_is_set(): + """OpenPype repository path is set in settings.""" if op_version_control_available(): return get_OpenPypeVersion().openpype_path_is_set() return None def openpype_path_is_accessible(): + """OpenPype version repository path can be accessed.""" if op_version_control_available(): return get_OpenPypeVersion().openpype_path_is_accessible() return None def get_local_versions(*args, **kwargs): + """OpenPype versions available on this workstation.""" if op_version_control_available(): return get_OpenPypeVersion().get_local_versions(*args, **kwargs) return None def get_remote_versions(*args, **kwargs): + """OpenPype versions in repository path.""" if op_version_control_available(): return get_OpenPypeVersion().get_remote_versions(*args, **kwargs) return None def get_latest_version(*args, **kwargs): + """Get latest version from repository path.""" if op_version_control_available(): return get_OpenPypeVersion().get_latest_version(*args, **kwargs) return None -def get_current_production_version(): +def get_expected_studio_version(staging=False): + """Expected production or staging version in studio.""" if op_version_control_available(): - return get_OpenPypeVersion().get_production_version() - return None - - -def get_current_staging_version(): - if op_version_control_available(): - return get_OpenPypeVersion().get_staging_version() + return get_OpenPypeVersion().get_expected_studio_version(staging) return None From 1a60f7fa0f047132c79a9a148b4ca8d1a474977e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 11:33:32 +0100 Subject: [PATCH 164/341] keep previous find_openpype implementation --- igniter/bootstrap_repos.py | 62 ++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 5e8efd1cc4..9e58f5bad2 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -1115,21 +1115,65 @@ class BootstrapRepos: @staticmethod def find_openpype( + self, openpype_path: Union[Path, str] = None, staging: bool = False, include_zips: bool = False) -> Union[List[OpenPypeVersion], None]: + """Get ordered dict of detected OpenPype version. + Resolution order for OpenPype is following: + + 1) First we test for ``OPENPYPE_PATH`` environment variable + 2) We try to find ``openPypePath`` in registry setting + 3) We use user data directory + + Args: + openpype_path (Path or str, optional): Try to find OpenPype on + the given path or url. + staging (bool, optional): Filter only staging version, skip them + otherwise. + include_zips (bool, optional): If set True it will try to find + OpenPype in zip files in given directory. + + Returns: + dict of Path: Dictionary of detected OpenPype version. + Key is version, value is path to zip file. + + None: if OpenPype is not found. + + Todo: + implement git/url support as OpenPype location, so it would be + possible to enter git url, OpenPype would check it out and if it is + ok install it as normal version. + + """ + if openpype_path and not isinstance(openpype_path, Path): + raise NotImplementedError( + ("Finding OpenPype in non-filesystem locations is" + " not implemented yet.")) + + dir_to_search = self.data_dir + user_versions = self.get_openpype_versions(self.data_dir, staging) + # if we have openpype_path specified, search only there. if openpype_path: - openpype_versions = OpenPypeVersion.get_versions_from_directory( - openpype_path) - # filter out staging - - openpype_versions = [ - v for v in openpype_versions if v.is_staging() == staging - ] - + dir_to_search = openpype_path else: - openpype_versions = OpenPypeVersion.get_available_versions(staging) + if os.getenv("OPENPYPE_PATH"): + if Path(os.getenv("OPENPYPE_PATH")).exists(): + dir_to_search = Path(os.getenv("OPENPYPE_PATH")) + else: + try: + registry_dir = Path( + str(self.registry.get_item("openPypePath"))) + if registry_dir.exists(): + dir_to_search = registry_dir + + except ValueError: + # nothing found in registry, we'll use data dir + pass + + openpype_versions = self.get_openpype_versions(dir_to_search, staging) + openpype_versions += user_versions # remove zip file version if needed. if not include_zips: From 77730e8d2b3b2e13026e77a618271936e5a2a7b5 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 11:35:03 +0100 Subject: [PATCH 165/341] added new methods to find openpype versions --- igniter/bootstrap_repos.py | 58 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 9e58f5bad2..a258f71a20 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -1114,6 +1114,64 @@ class BootstrapRepos: os.environ["PYTHONPATH"] = os.pathsep.join(paths) @staticmethod + def find_openpype_version(version, staging): + if isinstance(version, str): + version = OpenPypeVersion(version=version) + + build_version = OpenPypeVersion.get_build_version() + if build_version == version: + return build_version + + local_versions = OpenPypeVersion.get_local_versions( + staging=staging, production=not staging + ) + zip_version = None + for local_version in local_versions: + if local_version == version: + if local_version.suffix.lower() == ".zip": + zip_version = local_version + else: + return local_version + + if zip_version is not None: + return zip_version + + remote_versions = OpenPypeVersion.get_remote_versions( + staging=staging, production=not staging + ) + for remote_version in remote_versions: + if remote_version == version: + return remote_version + return None + + @staticmethod + def find_latest_openpype_version(staging): + build_version = OpenPypeVersion.get_build_version() + local_versions = OpenPypeVersion.get_local_versions( + staging=staging + ) + remote_versions = OpenPypeVersion.get_remote_versions( + staging=staging + ) + all_versions = local_versions + remote_versions + if not staging: + all_versions.append(build_version) + + if not all_versions: + return None + + all_versions.sort() + latest_version = all_versions[-1] + if latest_version == build_version: + return latest_version + + if not latest_version.path.is_dir(): + for version in local_versions: + if version == latest_version and version.path.is_dir(): + latest_version = version + break + return latest_version + def find_openpype( self, openpype_path: Union[Path, str] = None, From d22214415c17a8037353406c90a509954dcce8ac Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 11:59:57 +0100 Subject: [PATCH 166/341] simplified get build version --- igniter/bootstrap_repos.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index a258f71a20..7a367e6f09 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -561,13 +561,11 @@ class OpenPypeVersion(semver.VersionInfo): if cls._build_version is None: openpype_root = Path(os.environ["OPENPYPE_ROOT"]) build_version_str = BootstrapRepos.get_version(openpype_root) - build_version = None if build_version_str: - build_version = OpenPypeVersion( + cls._build_version = OpenPypeVersion( version=build_version_str, path=openpype_root ) - cls._build_version = build_version return cls._build_version @staticmethod From bc301fc7893551767763545e689d6ade875da428 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 12:02:19 +0100 Subject: [PATCH 167/341] modified get latest versions --- igniter/bootstrap_repos.py | 56 ++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 7a367e6f09..7de4c5db4b 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -570,26 +570,58 @@ class OpenPypeVersion(semver.VersionInfo): @staticmethod def get_latest_version( - staging: bool = False, local: bool = False) -> OpenPypeVersion: + staging: bool = False, + local: bool = None, + remote: bool = None + ) -> OpenPypeVersion: """Get latest available version. - This is utility version to get latest version from all found except - build. + The version does not contain information about path and source. + + This is utility version to get latest version from all found. Build + version is not listed if staging is enabled. + + Arguments 'local' and 'remote' define if local and remote repository + versions are used. All versions are used if both are not set (or set + to 'None'). If only one of them is set to 'True' the other is disabled. + It is possible to set both to 'True' (same as both set to None) and to + 'False' in that case only build version can be used. Args: staging (bool, optional): List staging versions if True. - local (bool, optional): List only local versions. - - See also: - OpenPypeVersion.get_available_versions() - + local (bool, optional): List local versions if True. + remote (bool, optional): List remote versions if True. """ - openpype_versions = OpenPypeVersion.get_available_versions( - staging, local) + if local is None and remote is None: + local = True + remote = True - if not openpype_versions: + elif local is None and not remote: + local = True + + elif remote is None and not local: + remote = True + + build_version = OpenPypeVersion.get_build_version() + local_versions = [] + remote_versions = [] + if local: + local_versions = OpenPypeVersion.get_local_versions( + staging=staging + ) + if remote: + remote_versions = OpenPypeVersion.get_remote_versions( + staging=staging + ) + all_versions = local_versions + remote_versions + if not staging: + all_versions.append(build_version) + + if not all_versions: return None - return openpype_versions[-1] + + all_versions.sort() + return all_versions[-1] @classmethod def get_expected_studio_version(cls, staging=False): From 105e6241b46da79102d50fb84c7376155478a31a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 12:02:32 +0100 Subject: [PATCH 168/341] fixed zip check --- igniter/bootstrap_repos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 7de4c5db4b..2f49fee064 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -1158,7 +1158,7 @@ class BootstrapRepos: zip_version = None for local_version in local_versions: if local_version == version: - if local_version.suffix.lower() == ".zip": + if local_version.path.suffix.lower() == ".zip": zip_version = local_version else: return local_version From 3e04f294e09d98102a673ebc5182258a07866070 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 12:02:44 +0100 Subject: [PATCH 169/341] removed unused method --- igniter/bootstrap_repos.py | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 2f49fee064..77fcd15f1e 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -477,39 +477,6 @@ class OpenPypeVersion(semver.VersionInfo): filtered_versions.append(version) return list(sorted(set(filtered_versions))) - @classmethod - def get_available_versions( - cls, staging: bool = False, local: bool = False) -> List: - """Get ordered dict of detected OpenPype version. - - Resolution order for OpenPype is following: - - 1) First we test for ``OPENPYPE_PATH`` environment variable - 2) We try to find ``openPypePath`` in registry setting - 3) We use user data directory - - Only versions from 3) will be listed when ``local`` is set to True. - - Args: - staging (bool, optional): List staging versions if True. - local (bool, optional): List only local versions. - - """ - user_versions = cls.get_local_versions() - # if we have openpype_path specified, search only there. - openpype_versions = [] - if not local: - openpype_versions = cls.get_remote_versions() - openpype_versions += user_versions - - # remove duplicates and staging/production - openpype_versions = [ - v for v in openpype_versions if v.is_staging() == staging - ] - openpype_versions = sorted(list(set(openpype_versions))) - - return openpype_versions - @staticmethod def get_versions_from_directory(openpype_dir: Path) -> List: """Get all detected OpenPype versions in directory. From d71b8e2e40d2215a7b7c644d2debbf6549e7e171 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 12:03:23 +0100 Subject: [PATCH 170/341] modified use version argument handling to be able pass "latest" --- start.py | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/start.py b/start.py index 80baff5496..29afb759c5 100644 --- a/start.py +++ b/start.py @@ -467,23 +467,41 @@ def _process_arguments() -> tuple: use_version = None use_staging = False commands = [] - for arg in sys.argv: - if arg == "--use-version": - _print("!!! Please use option --use-version like:") - _print(" --use-version=3.0.0") - sys.exit(1) - if arg.startswith("--use-version="): - m = re.search( - r"--use-version=(?P\d+\.\d+\.\d+(?:\S*)?)", arg) - if m and m.group('version'): - use_version = m.group('version') - _print(">>> Requested version [ {} ]".format(use_version)) - sys.argv.remove(arg) - if "+staging" in use_version: - use_staging = True - break + # OpenPype version specification through arguments + use_version_arg = "--use-version" + + for arg in sys.argv: + if arg.startswith(use_version_arg): + # Remove arg from sys argv + sys.argv.remove(arg) + # Extract string after use version arg + use_version_value = arg[len(use_version_arg):] + + if ( + not use_version_value + or not use_version_value.startswith("=") + ): + _print("!!! Please use option --use-version like:") + _print(" --use-version=3.0.0") + sys.exit(1) + + version_str = use_version_value[1:] + use_version = None + if version_str.lower() == "latest": + use_version = "latest" else: + m = re.search( + r"(?P\d+\.\d+\.\d+(?:\S*)?)", version_str + ) + if m and m.group('version'): + use_version = m.group('version') + _print(">>> Requested version [ {} ]".format(use_version)) + if "+staging" in use_version: + use_staging = True + break + + if use_version is None: _print("!!! Requested version isn't in correct format.") _print((" Use --list-versions to find out" " proper version string.")) From 27df5b5d924b18c0fcd8c0ae321a3464070e37c7 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 12:03:50 +0100 Subject: [PATCH 171/341] use new methods in bootstrap from code --- start.py | 66 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/start.py b/start.py index 29afb759c5..674cc66a0f 100644 --- a/start.py +++ b/start.py @@ -781,6 +781,13 @@ def _bootstrap_from_code(use_version, use_staging): # run through repos and add them to `sys.path` and `PYTHONPATH` # set root _openpype_root = OPENPYPE_ROOT + # Unset use version if latest should be used + # - when executed from code then code is expected as latest + # - when executed from build then build is already marked as latest + # in '_find_frozen_openpype' + if use_version and use_version.lower() == "latest": + use_version = None + if getattr(sys, 'frozen', False): local_version = bootstrap.get_version(Path(_openpype_root)) switch_str = f" - will switch to {use_version}" if use_version else "" @@ -790,43 +797,35 @@ def _bootstrap_from_code(use_version, use_staging): # get current version of OpenPype local_version = bootstrap.get_local_live_version() - openpype_versions = bootstrap.find_openpype( - include_zips=True, staging=use_staging) - if use_staging and not use_version: - if not openpype_versions: - raise OpenPypeVersionNotFound( - "Didn't find any staging versions." + # All cases when should be used different version than build + if (use_version and use_version != local_version) or use_staging: + if use_version: + # Explicit version should be used + version_to_use = bootstrap.find_openpype_version( + use_version, use_staging ) - - # Use last found staging version - version_to_use = openpype_versions[-1] - if version_to_use.path.is_file(): - version_to_use.path = bootstrap.extract_openpype( - version_to_use) - bootstrap.add_paths_from_directory(version_to_use.path) - os.environ["OPENPYPE_VERSION"] = str(version_to_use) - version_path = version_to_use.path - os.environ["OPENPYPE_REPOS_ROOT"] = ( - version_path / "openpype" - ).as_posix() - _openpype_root = version_to_use.path.as_posix() - - elif use_version and use_version != local_version: - version_to_use = None - for version in openpype_versions: - if str(version) == use_version: - version_to_use = version - break - - if version_to_use is None: - raise OpenPypeVersionNotFound( - "Requested version \"{}\" was not found.".format(use_version) + if version_to_use is None: + raise OpenPypeVersionNotFound( + "Requested version \"{}\" was not found.".format( + use_version + ) + ) + else: + # Staging version should be used + version_to_use = bootstrap.find_latest_openpype_version( + use_staging ) + if version_to_use is None: + if use_staging: + reason = "Didn't find any staging versions." + else: + # This reason is backup for possible bug in code + reason = "Didn't find any versions." + raise OpenPypeVersionNotFound(reason) - # use specified + # Start extraction of version if needed if version_to_use.path.is_file(): - version_to_use.path = bootstrap.extract_openpype( - version_to_use) + version_to_use.path = bootstrap.extract_openpype(version_to_use) bootstrap.add_paths_from_directory(version_to_use.path) os.environ["OPENPYPE_VERSION"] = use_version version_path = version_to_use.path @@ -834,6 +833,7 @@ def _bootstrap_from_code(use_version, use_staging): version_path / "openpype" ).as_posix() _openpype_root = version_to_use.path.as_posix() + else: os.environ["OPENPYPE_VERSION"] = local_version version_path = Path(_openpype_root) From d219ff0cd18219051a00de65ccfa9c6990d94e5b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 12:04:13 +0100 Subject: [PATCH 172/341] use new methods in find frozen openpype --- start.py | 59 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/start.py b/start.py index 674cc66a0f..58c88df340 100644 --- a/start.py +++ b/start.py @@ -665,33 +665,25 @@ def _find_frozen_openpype(use_version: str = None, """ # Collect OpenPype versions - openpype_versions = bootstrap.find_openpype( - include_zips=True, - staging=use_staging - ) - local_version = OpenPypeVersion.get_build_version() - if local_version not in openpype_versions: - openpype_versions.append(local_version) - + build_version = OpenPypeVersion.get_build_version() + # Expected version that should be used by studio settings + # - this option is used only if version is not explictly set and if + # studio has set explicit version in settings studio_version = OpenPypeVersion.get_expected_studio_version(use_staging) - openpype_versions.sort() - - # Find OpenPype version that should be used - openpype_version = None if use_version is not None: + # Specific version is defined if use_version.lower() == "latest": - _print("Finding latest version") - openpype_version = openpype_versions[-1] + # Version says to use latest version + _print("Finding latest version defined by use version") + openpype_version = bootstrap.find_latest_openpype_version( + use_staging + ) else: - use_version_obj = OpenPypeVersion(use_version) - # Version was specified with arguments or env OPENPYPE_VERSION - # - should crash if version is not available _print("Finding specified version \"{}\"".format(use_version)) - for version in openpype_versions: - if version == use_version_obj: - openpype_version = version - break + openpype_version = bootstrap.find_openpype_version( + use_version, use_staging + ) if openpype_version is None: raise OpenPypeVersionNotFound( @@ -700,13 +692,12 @@ def _find_frozen_openpype(use_version: str = None, ) ) - elif studio_version: + elif studio_version is not None: + # Studio has defined a version to use _print("Finding studio version \"{}\"".format(studio_version)) - # Look for version specified by settings - for version in openpype_versions: - if version == studio_version: - openpype_version = version - break + openpype_version = bootstrap.find_openpype_version( + studio_version, use_staging + ) if openpype_version is None: raise OpenPypeVersionNotFound(( "Requested OpenPype version \"{}\" defined by settings" @@ -714,13 +705,21 @@ def _find_frozen_openpype(use_version: str = None, ).format(studio_version)) else: - # Use latest available version + # Default behavior to use latest version _print("Finding latest version") - openpype_version = openpype_versions[-1] + openpype_version = bootstrap.find_latest_openpype_version( + use_staging + ) + if openpype_version is None: + if use_staging: + reason = "Didn't find any staging versions." + else: + reason = "Didn't find any versions." + raise OpenPypeVersionNotFound(reason) # get local frozen version and add it to detected version so if it is # newer it will be used instead. - if local_version == openpype_version: + if build_version == openpype_version: version_path = _bootstrap_from_code(use_version, use_staging) openpype_version = OpenPypeVersion( version=BootstrapRepos.get_version(version_path), From a82bf00d7a28242aa0bc134b4220a806cd108b00 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 12:13:00 +0100 Subject: [PATCH 173/341] removed unused imports --- openpype/settings/entities/op_version_entity.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/openpype/settings/entities/op_version_entity.py b/openpype/settings/entities/op_version_entity.py index cf2150f12e..97b3efa028 100644 --- a/openpype/settings/entities/op_version_entity.py +++ b/openpype/settings/entities/op_version_entity.py @@ -1,8 +1,5 @@ from openpype.lib.openpype_version import ( - op_version_control_available, get_remote_versions, - openpype_path_is_set, - openpype_path_is_accessible, get_OpenPypeVersion, get_build_version ) From 070078d1578cb3bb177cbb53a807bd145602d084 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 12:13:12 +0100 Subject: [PATCH 174/341] do not add build version to staging --- openpype/settings/entities/op_version_entity.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openpype/settings/entities/op_version_entity.py b/openpype/settings/entities/op_version_entity.py index 97b3efa028..bd481dc497 100644 --- a/openpype/settings/entities/op_version_entity.py +++ b/openpype/settings/entities/op_version_entity.py @@ -65,5 +65,4 @@ class StagingVersionsInputEntity(OpenPypeVersionInput): def _get_openpype_versions(self): versions = get_remote_versions(staging=True, production=False) - versions.append(get_build_version()) return sorted(versions) From 43c552dbbfd74712eeebb57e22bc1ef4b807b92e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 12:13:36 +0100 Subject: [PATCH 175/341] added option to pass global settings to 'get_expected_studio_version_str' --- igniter/bootstrap_repos.py | 7 +++++-- igniter/tools.py | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 77fcd15f1e..70e6a75b9d 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -591,19 +591,22 @@ class OpenPypeVersion(semver.VersionInfo): return all_versions[-1] @classmethod - def get_expected_studio_version(cls, staging=False): + def get_expected_studio_version(cls, staging=False, global_settings=None): """Expected OpenPype version that should be used at the moment. If version is not defined in settings the latest found version is used. + Using precached global settings is needed for usage inside OpenPype. + Args: staging (bool): Staging version or production version. + global_settings (dict): Optional precached global settings. Returns: OpenPypeVersion: Version that should be used. """ - result = get_expected_studio_version_str(staging) + result = get_expected_studio_version_str(staging, global_settings) if not result: return None return OpenPypeVersion(version=result) diff --git a/igniter/tools.py b/igniter/tools.py index 2595140582..735402e9a2 100644 --- a/igniter/tools.py +++ b/igniter/tools.py @@ -187,17 +187,21 @@ def get_openpype_path_from_db(url: str) -> Union[str, None]: return None -def get_expected_studio_version_str(staging=False) -> str: +def get_expected_studio_version_str( + staging=False, global_settings=None +) -> str: """Version that should be currently used in studio. Args: staging (bool): Get current version for staging. + global_settings (dict): Optional precached global settings. Returns: str: OpenPype version which should be used. Empty string means latest. """ mongo_url = os.environ.get("OPENPYPE_MONGO") - global_settings = get_openpype_global_settings(mongo_url) + if global_settings is None: + global_settings = get_openpype_global_settings(mongo_url) if staging: key = "staging_version" else: From ad99d2a841f4cf581f13f2ef1e9f93e95c84760e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 9 Dec 2021 12:21:12 +0100 Subject: [PATCH 176/341] added few docstrings --- igniter/__init__.py | 4 ++++ igniter/message_dialog.py | 2 +- .../settings/entities/op_version_entity.py | 19 ++++++++++++++++++- openpype/tools/settings/settings/base.py | 1 + 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/igniter/__init__.py b/igniter/__init__.py index 6f06c1eb90..02cba6a483 100644 --- a/igniter/__init__.py +++ b/igniter/__init__.py @@ -12,6 +12,9 @@ from .bootstrap_repos import ( ) from .version import __version__ as version +# Store OpenPypeVersion to 'sys.modules' +# - this makes it available in OpenPype processes without modifying +# 'sys.path' or 'PYTHONPATH' if "OpenPypeVersion" not in sys.modules: sys.modules["OpenPypeVersion"] = OpenPypeVersion @@ -64,6 +67,7 @@ def open_update_window(openpype_version): def show_message_dialog(title, message): + """Show dialog with a message and title to user.""" if os.getenv("OPENPYPE_HEADLESS_MODE"): print("!!! Can't open dialog in headless mode. Exiting.") sys.exit(1) diff --git a/igniter/message_dialog.py b/igniter/message_dialog.py index 88a086df1e..c8e875cc37 100644 --- a/igniter/message_dialog.py +++ b/igniter/message_dialog.py @@ -7,6 +7,7 @@ from .tools import ( class MessageDialog(QtWidgets.QDialog): + """Simple message dialog with title, message and OK button.""" def __init__(self, title, message): super(MessageDialog, self).__init__() @@ -27,7 +28,6 @@ class MessageDialog(QtWidgets.QDialog): btns_layout.addWidget(ok_btn, 0) layout = QtWidgets.QVBoxLayout(self) - # layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(label_widget, 1) layout.addLayout(btns_layout, 0) diff --git a/openpype/settings/entities/op_version_entity.py b/openpype/settings/entities/op_version_entity.py index bd481dc497..62c5bf4ff9 100644 --- a/openpype/settings/entities/op_version_entity.py +++ b/openpype/settings/entities/op_version_entity.py @@ -12,6 +12,16 @@ from .exceptions import BaseInvalidValue class OpenPypeVersionInput(TextEntity): + """Entity to store OpenPype version to use. + + It is text input as creating of settings on different machines may + affect which versions are available so it must have option to set OpenPype + version which is not available for machine where settings entities are + loaded. + + It is possible to enter empty string. In that case is used any latest + version. Any other string must match regex of OpenPype version semantic. + """ def _item_initialization(self): super(OpenPypeVersionInput, self)._item_initialization() self.multiline = False @@ -19,9 +29,13 @@ class OpenPypeVersionInput(TextEntity): self.value_hints = [] def _get_openpype_versions(self): - return [] + """This is abstract method returning version hints for UI purposes.""" + raise NotImplementedError(( + "{} does not have implemented '_get_openpype_versions'" + ).format(self.__class__.__name__)) def set_override_state(self, state, *args, **kwargs): + """Update value hints for UI purposes.""" value_hints = [] if state is OverrideState.STUDIO: versions = self._get_openpype_versions() @@ -36,6 +50,7 @@ class OpenPypeVersionInput(TextEntity): ) def convert_to_valid_type(self, value): + """Add validation of version regex.""" if value and value is not NOT_SET: OpenPypeVersion = get_OpenPypeVersion() if OpenPypeVersion is not None: @@ -52,6 +67,7 @@ class OpenPypeVersionInput(TextEntity): class ProductionVersionsInputEntity(OpenPypeVersionInput): + """Entity meant only for global settings to define production version.""" schema_types = ["production-versions-text"] def _get_openpype_versions(self): @@ -61,6 +77,7 @@ class ProductionVersionsInputEntity(OpenPypeVersionInput): class StagingVersionsInputEntity(OpenPypeVersionInput): + """Entity meant only for global settings to define staging version.""" schema_types = ["staging-versions-text"] def _get_openpype_versions(self): diff --git a/openpype/tools/settings/settings/base.py b/openpype/tools/settings/settings/base.py index bc6c6d10ff..48c2b42ebd 100644 --- a/openpype/tools/settings/settings/base.py +++ b/openpype/tools/settings/settings/base.py @@ -28,6 +28,7 @@ class BaseWidget(QtWidgets.QWidget): @staticmethod def set_style_property(obj, property_name, property_value): + """Change QWidget property and polish it's style.""" if obj.property(property_name) == property_value: return From 2673b587731576c30b26f6ec045c3cbff91f0fa3 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 9 Dec 2021 14:01:28 +0100 Subject: [PATCH 177/341] OP-2053 - added possibility to check installed extension version --- .../plugins/publish/collect_current_file.py | 2 +- .../publish/collect_extension_version.py | 56 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 openpype/hosts/aftereffects/plugins/publish/collect_extension_version.py diff --git a/openpype/hosts/aftereffects/plugins/publish/collect_current_file.py b/openpype/hosts/aftereffects/plugins/publish/collect_current_file.py index b59ff41a0e..51f6f5c844 100644 --- a/openpype/hosts/aftereffects/plugins/publish/collect_current_file.py +++ b/openpype/hosts/aftereffects/plugins/publish/collect_current_file.py @@ -8,7 +8,7 @@ from avalon import aftereffects class CollectCurrentFile(pyblish.api.ContextPlugin): """Inject the current working file into context""" - order = pyblish.api.CollectorOrder - 0.5 + order = pyblish.api.CollectorOrder - 0.49 label = "Current File" hosts = ["aftereffects"] diff --git a/openpype/hosts/aftereffects/plugins/publish/collect_extension_version.py b/openpype/hosts/aftereffects/plugins/publish/collect_extension_version.py new file mode 100644 index 0000000000..3352fd21f0 --- /dev/null +++ b/openpype/hosts/aftereffects/plugins/publish/collect_extension_version.py @@ -0,0 +1,56 @@ +import os +import re +import pyblish.api + +from avalon import aftereffects + + +class CollectExtensionVersion(pyblish.api.ContextPlugin): + """ Pulls and compares version of installed extension. + + It is recommended to use same extension as in provided Openpype code. + + Please use Anastasiy’s Extension Manager or ZXPInstaller to update + extension in case of an error. + + You can locate extension.zxp in your installed Openpype code in + `repos/avalon-core/avalon/aftereffects` + """ + # This technically should be a validator, but other collectors might be + # impacted with usage of obsolete extension, so collector that runs first + # was chosen + order = pyblish.api.CollectorOrder - 0.5 + label = "Collect extension version" + hosts = ["aftereffects"] + + optional = True + active = True + + def process(self, context): + installed_version = aftereffects.stub().get_extension_version() + + if not installed_version: + raise ValueError("Unknown version, probably old extension") + + manifest_url = os.path.join(os.path.dirname(aftereffects.__file__), + "extension", "CSXS", "manifest.xml") + + if not os.path.exists(manifest_url): + self.log.debug("Unable to locate extension manifest, not checking") + return + + expected_version = None + with open(manifest_url) as fp: + content = fp.read() + found = re.findall(r'(ExtensionBundleVersion=")([0-9\.]+)(")', + content) + if found: + expected_version = found[0][1] + + if expected_version != installed_version: + msg = "Expected version '{}' found '{}'\n".format( + expected_version, installed_version) + msg += "Please update your installed extension, it might not work " + msg += "properly." + + raise ValueError(msg) From a80ed0deecc0440fcbc779d4c855f5c6713db958 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 9 Dec 2021 14:25:24 +0100 Subject: [PATCH 178/341] OP-2053 - Hound --- openpype/hosts/aftereffects/plugins/publish/closeAE.py | 2 -- .../hosts/aftereffects/test_publish_in_aftereffects.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/openpype/hosts/aftereffects/plugins/publish/closeAE.py b/openpype/hosts/aftereffects/plugins/publish/closeAE.py index e6e9623474..21bedf0125 100644 --- a/openpype/hosts/aftereffects/plugins/publish/closeAE.py +++ b/openpype/hosts/aftereffects/plugins/publish/closeAE.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- """Close AE after publish. For Webpublishing only.""" -import os - import pyblish.api from avalon import aftereffects diff --git a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py index 3d1fa8f804..e0f6b3e48e 100644 --- a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py +++ b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py @@ -92,7 +92,7 @@ class TestPublishInAfterEffects(PublishTest): "Not expected no of representations" assert 1 == dbcon.count_documents({"type": "representation", - "context.subset": "imageMainBackgroundcopy", #noqa E501 + "context.subset": "imageMainBackgroundcopy", # noqa E501 "context.ext": "png"}), \ "Not expected no of representations with ext 'png'" From 2f2116b4bda283fa9b8e20464a97fb8a3dd25fc7 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 9 Dec 2021 18:30:43 +0100 Subject: [PATCH 179/341] OP-2042 - added test_data_folder to command line --- openpype/cli.py | 8 ++++++-- openpype/pype_commands.py | 18 +++++++++--------- tests/integration/conftest.py | 12 ++++++++++++ tests/lib/testing_classes.py | 8 ++++---- 4 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 tests/integration/conftest.py diff --git a/openpype/cli.py b/openpype/cli.py index 4c4dc1a3c6..1f444006ca 100644 --- a/openpype/cli.py +++ b/openpype/cli.py @@ -356,9 +356,13 @@ def run(script): "--pyargs", help="Run tests from package", default=None) -def runtests(folder, mark, pyargs): +@click.option("-t", + "--test_data_folder", + help="Unzipped directory path of test file", + default=None) +def runtests(folder, mark, pyargs, test_data_folder): """Run all automatic tests after proper initialization via start.py""" - PypeCommands().run_tests(folder, mark, pyargs) + PypeCommands().run_tests(folder, mark, pyargs, test_data_folder) @main.command() diff --git a/openpype/pype_commands.py b/openpype/pype_commands.py index f01c6f0e42..7b3c799b3c 100644 --- a/openpype/pype_commands.py +++ b/openpype/pype_commands.py @@ -341,7 +341,7 @@ class PypeCommands: def validate_jsons(self): pass - def run_tests(self, folder, mark, pyargs): + def run_tests(self, folder, mark, pyargs, test_data_folder): """ Runs tests from 'folder' @@ -349,26 +349,26 @@ class PypeCommands: folder (str): relative path to folder with tests mark (str): label to run tests marked by it (slow etc) pyargs (str): package path to test + test_data_folder (str): url to unzipped folder of test data """ print("run_tests") - import subprocess - if folder: folder = " ".join(list(folder)) else: folder = "../tests" - mark_str = pyargs_str = '' + # disable warnings and show captured stdout even if success + args = ["--disable-pytest-warnings", "-rP", folder] + if mark: - mark_str = "-m {}".format(mark) + args.extend(["-m", mark]) if pyargs: - pyargs_str = "--pyargs {}".format(pyargs) + args.extend(["--pyargs", pyargs]) - # disable warnings and show captured stdout even if success - args = ["--disable-pytest-warnings", "-rP"] + if test_data_folder: + args.extend(["--test_data_folder", test_data_folder]) - args += [folder, mark_str, pyargs_str] print("run_tests args: {}".format(args)) import pytest pytest.main(args) diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py new file mode 100644 index 0000000000..bc002e8f86 --- /dev/null +++ b/tests/integration/conftest.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +import pytest + +def pytest_addoption(parser): + parser.addoption( + "--test_data_folder", action="store", default=None, + help="Provide url of a folder of unzipped test file" + ) + +@pytest.fixture(scope="module") +def test_data_folder(request): + return request.config.getoption("--test_data_folder") \ No newline at end of file diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index 25ad66cdfb..541a92d15d 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -58,10 +58,10 @@ class ModuleUnitTest(BaseTest): m.undo() @pytest.fixture(scope="module") - def download_test_data(self): - if self.TEST_DATA_FOLDER: - print("Using existing folder {}".format(self.TEST_DATA_FOLDER)) - yield self.TEST_DATA_FOLDER + def download_test_data(self, test_data_folder): + if test_data_folder: + print("Using existing folder {}".format(test_data_folder)) + yield test_data_folder else: tmpdir = tempfile.mkdtemp() for test_file in self.TEST_FILES: From 53bbae2cbd1d19b25b6acbde3a0195aec58bfd2a Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 9 Dec 2021 18:34:40 +0100 Subject: [PATCH 180/341] OP-2042 - better error message in validator --- .../hosts/nuke/plugins/publish/validate_rendered_frames.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/nuke/plugins/publish/validate_rendered_frames.py b/openpype/hosts/nuke/plugins/publish/validate_rendered_frames.py index 29faf867d2..af5e8e9d27 100644 --- a/openpype/hosts/nuke/plugins/publish/validate_rendered_frames.py +++ b/openpype/hosts/nuke/plugins/publish/validate_rendered_frames.py @@ -67,7 +67,9 @@ class ValidateRenderedFrames(pyblish.api.InstancePlugin): if not repre.get("files"): msg = ("no frames were collected, " - "you need to render them") + "you need to render them.\n" + "Check properties of write node (group) and" + "select 'Local' option in 'Publish' dropdown.") self.log.error(msg) raise ValidationException(msg) From 6b5706ef78a3c3bde0a4efd2235bd46dfe8b9d81 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 10 Dec 2021 10:38:23 +0100 Subject: [PATCH 181/341] added method to get installed version --- igniter/bootstrap_repos.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 70e6a75b9d..b603fe74f1 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -522,6 +522,16 @@ class OpenPypeVersion(semver.VersionInfo): return sorted(_openpype_versions) + @staticmethod + def get_installed_version_str() -> str: + """Get version of local OpenPype.""" + + version = {} + path = Path(os.environ["OPENPYPE_ROOT"]) / "openpype" / "version.py" + with open(path, "r") as fp: + exec(fp.read(), version) + return version["__version__"] + @classmethod def get_build_version(cls): """Get version of OpenPype inside build.""" From 1b4e5dd4435ae7acba7be6f21f6304a99ed9e938 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 10 Dec 2021 10:40:20 +0100 Subject: [PATCH 182/341] replaced get_local_live_version with get_installed_version_str --- igniter/bootstrap_repos.py | 12 +----------- start.py | 6 +++--- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index b603fe74f1..890df453a1 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -690,16 +690,6 @@ class BootstrapRepos: return v.path return None - @staticmethod - def get_local_live_version() -> str: - """Get version of local OpenPype.""" - - version = {} - path = Path(os.environ["OPENPYPE_ROOT"]) / "openpype" / "version.py" - with open(path, "r") as fp: - exec(fp.read(), version) - return version["__version__"] - @staticmethod def get_version(repo_dir: Path) -> Union[str, None]: """Get version of OpenPype in given directory. @@ -747,7 +737,7 @@ class BootstrapRepos: # version and use it as a source. Otherwise repo_dir is user # entered location. if not repo_dir: - version = self.get_local_live_version() + version = OpenPypeVersion.get_installed_version_str() repo_dir = self.live_repo_dir else: version = self.get_version(repo_dir) diff --git a/start.py b/start.py index 58c88df340..975249b4e2 100644 --- a/start.py +++ b/start.py @@ -794,7 +794,7 @@ def _bootstrap_from_code(use_version, use_staging): assert local_version else: # get current version of OpenPype - local_version = bootstrap.get_local_live_version() + local_version = OpenPypeVersion.get_installed_version_str() # All cases when should be used different version than build if (use_version and use_version != local_version) or use_staging: @@ -930,7 +930,7 @@ def boot(): if getattr(sys, 'frozen', False): local_version = bootstrap.get_version(Path(OPENPYPE_ROOT)) else: - local_version = bootstrap.get_local_live_version() + local_version = OpenPypeVersion.get_installed_version_str() if "validate" in commands: _print(f">>> Validating version [ {use_version} ]") @@ -978,7 +978,7 @@ def boot(): if getattr(sys, 'frozen', False): local_version = bootstrap.get_version(Path(_openpype_root)) else: - local_version = bootstrap.get_local_live_version() + local_version = OpenPypeVersion.get_installed_version_str() list_versions(openpype_versions, local_version) sys.exit(1) From 53e362f3db616ee95585856780b557cdcc502a25 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 10 Dec 2021 10:40:42 +0100 Subject: [PATCH 183/341] renamed build verion to installed version --- igniter/bootstrap_repos.py | 35 +++++++++++++++++------------------ start.py | 4 ++-- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 890df453a1..db62cbbe91 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -63,7 +63,7 @@ class OpenPypeVersion(semver.VersionInfo): staging = False path = None _VERSION_REGEX = re.compile(r"(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)(?:-(?P(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$") # noqa: E501 - _build_version = None + _installed_version = None def __init__(self, *args, **kwargs): """Create OpenPype version. @@ -533,17 +533,16 @@ class OpenPypeVersion(semver.VersionInfo): return version["__version__"] @classmethod - def get_build_version(cls): + def get_installed_version(cls): """Get version of OpenPype inside build.""" - if cls._build_version is None: - openpype_root = Path(os.environ["OPENPYPE_ROOT"]) - build_version_str = BootstrapRepos.get_version(openpype_root) - if build_version_str: - cls._build_version = OpenPypeVersion( - version=build_version_str, - path=openpype_root + if cls._installed_version is None: + installed_version_str = cls.get_installed_version_str() + if installed_version_str: + cls._installed_version = OpenPypeVersion( + version=installed_version_str, + path=Path(os.environ["OPENPYPE_ROOT"]) ) - return cls._build_version + return cls._installed_version @staticmethod def get_latest_version( @@ -579,7 +578,7 @@ class OpenPypeVersion(semver.VersionInfo): elif remote is None and not local: remote = True - build_version = OpenPypeVersion.get_build_version() + installed_version = OpenPypeVersion.get_installed_version() local_versions = [] remote_versions = [] if local: @@ -592,7 +591,7 @@ class OpenPypeVersion(semver.VersionInfo): ) all_versions = local_versions + remote_versions if not staging: - all_versions.append(build_version) + all_versions.append(installed_version) if not all_versions: return None @@ -1118,9 +1117,9 @@ class BootstrapRepos: if isinstance(version, str): version = OpenPypeVersion(version=version) - build_version = OpenPypeVersion.get_build_version() - if build_version == version: - return build_version + installed_version = OpenPypeVersion.get_installed_version() + if installed_version == version: + return installed_version local_versions = OpenPypeVersion.get_local_versions( staging=staging, production=not staging @@ -1146,7 +1145,7 @@ class BootstrapRepos: @staticmethod def find_latest_openpype_version(staging): - build_version = OpenPypeVersion.get_build_version() + installed_version = OpenPypeVersion.get_installed_version() local_versions = OpenPypeVersion.get_local_versions( staging=staging ) @@ -1155,14 +1154,14 @@ class BootstrapRepos: ) all_versions = local_versions + remote_versions if not staging: - all_versions.append(build_version) + all_versions.append(installed_version) if not all_versions: return None all_versions.sort() latest_version = all_versions[-1] - if latest_version == build_version: + if latest_version == installed_version: return latest_version if not latest_version.path.is_dir(): diff --git a/start.py b/start.py index 975249b4e2..5a5039cd5c 100644 --- a/start.py +++ b/start.py @@ -665,7 +665,7 @@ def _find_frozen_openpype(use_version: str = None, """ # Collect OpenPype versions - build_version = OpenPypeVersion.get_build_version() + installed_version = OpenPypeVersion.get_installed_version() # Expected version that should be used by studio settings # - this option is used only if version is not explictly set and if # studio has set explicit version in settings @@ -719,7 +719,7 @@ def _find_frozen_openpype(use_version: str = None, # get local frozen version and add it to detected version so if it is # newer it will be used instead. - if build_version == openpype_version: + if installed_version == openpype_version: version_path = _bootstrap_from_code(use_version, use_staging) openpype_version = OpenPypeVersion( version=BootstrapRepos.get_version(version_path), From 06a8f5014023ec1c792263fc66eb82c15159f908 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 Dec 2021 13:46:08 +0100 Subject: [PATCH 184/341] OP-2042 - evaluate paths in write nodes Paths in write nodes could contain python code for automatic testing. It needs to be evaluated to all os operations to work properly. --- .../nuke/plugins/publish/extract_render_local.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/openpype/hosts/nuke/plugins/publish/extract_render_local.py b/openpype/hosts/nuke/plugins/publish/extract_render_local.py index bc7b41c733..50a5d01483 100644 --- a/openpype/hosts/nuke/plugins/publish/extract_render_local.py +++ b/openpype/hosts/nuke/plugins/publish/extract_render_local.py @@ -42,10 +42,14 @@ class NukeRenderLocal(openpype.api.Extractor): self.log.info("Start frame: {}".format(first_frame)) self.log.info("End frame: {}".format(last_frame)) + # write node url might contain nuke's ctl expressin + # as [python ...]/path... + path = node["file"].evaluate() + # Ensure output directory exists. - directory = os.path.dirname(node["file"].value()) - if not os.path.exists(directory): - os.makedirs(directory) + out_dir = os.path.dirname(path) + if not os.path.exists(out_dir): + os.makedirs(out_dir) # Render frames nuke.execute( @@ -58,15 +62,12 @@ class NukeRenderLocal(openpype.api.Extractor): if "slate" in families: first_frame += 1 - path = node['file'].value() - out_dir = os.path.dirname(path) ext = node["file_type"].value() if "representations" not in instance.data: instance.data["representations"] = [] collected_frames = os.listdir(out_dir) - if len(collected_frames) == 1: repre = { 'name': ext, From 00d9681d56e381169e47f6561a065ca9d2e4ea88 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 Dec 2021 13:47:55 +0100 Subject: [PATCH 185/341] OP-2042 - better cleanup of test DBs before start of test --- tests/lib/db_handler.py | 14 +++++++++++--- tests/lib/testing_classes.py | 6 ++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/tests/lib/db_handler.py b/tests/lib/db_handler.py index 0aa4c69ca6..b181055012 100644 --- a/tests/lib/db_handler.py +++ b/tests/lib/db_handler.py @@ -112,9 +112,17 @@ class DBHandler: source 'db_name' """ db_name_out = db_name_out or db_name - if self._db_exists(db_name) and not overwrite: - raise RuntimeError("DB {} already exists".format(db_name_out) + - "Run with overwrite=True") + if self._db_exists(db_name_out): + if not overwrite: + raise RuntimeError("DB {} already exists".format(db_name_out) + + "Run with overwrite=True") + else: + if collection: + coll = self.client[db_name_out].get(collection) + if coll: + coll.drop() + else: + self.teardown(db_name_out) dir_path = os.path.join(dump_dir, db_name) if not os.path.exists(dir_path): diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index 541a92d15d..96e7148bff 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -130,10 +130,12 @@ class ModuleUnitTest(BaseTest): uri = os.environ.get("OPENPYPE_MONGO") db_handler = DBHandler(uri) - db_handler.setup_from_dump(self.TEST_DB_NAME, backup_dir, True, + db_handler.setup_from_dump(self.TEST_DB_NAME, backup_dir, + overwrite=True, db_name_out=self.TEST_DB_NAME) - db_handler.setup_from_dump("openpype", backup_dir, True, + db_handler.setup_from_dump("openpype", backup_dir, + overwrite=True, db_name_out=self.TEST_OPENPYPE_NAME) yield db_handler From 6e9c9c087cd5047c5f4d7e32b6019ce6a782df3d Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 Dec 2021 15:04:10 +0100 Subject: [PATCH 186/341] OP-2042 - adding persist, app_variant to cli --- openpype/cli.py | 13 +++++- openpype/pype_commands.py | 15 ++++++- tests/integration/conftest.py | 25 ++++++++++- .../hosts/nuke/test_publish_in_nuke.py | 15 ++++--- tests/lib/testing_classes.py | 45 ++++++++++++------- 5 files changed, 85 insertions(+), 28 deletions(-) diff --git a/openpype/cli.py b/openpype/cli.py index 1f444006ca..6b20fb5203 100644 --- a/openpype/cli.py +++ b/openpype/cli.py @@ -360,9 +360,18 @@ def run(script): "--test_data_folder", help="Unzipped directory path of test file", default=None) -def runtests(folder, mark, pyargs, test_data_folder): +@click.option("-s", + "--persist", + help="Persist test DB and published files after test end", + default=None) +@click.option("-a", + "--app_variant", + help="Provide specific app variant for test, empty for latest", + default=None) +def runtests(folder, mark, pyargs, test_data_folder, persist, app_variant): """Run all automatic tests after proper initialization via start.py""" - PypeCommands().run_tests(folder, mark, pyargs, test_data_folder) + PypeCommands().run_tests(folder, mark, pyargs, test_data_folder, + persist, app_variant) @main.command() diff --git a/openpype/pype_commands.py b/openpype/pype_commands.py index 7b3c799b3c..a6330bae1f 100644 --- a/openpype/pype_commands.py +++ b/openpype/pype_commands.py @@ -341,7 +341,8 @@ class PypeCommands: def validate_jsons(self): pass - def run_tests(self, folder, mark, pyargs, test_data_folder): + def run_tests(self, folder, mark, pyargs, + test_data_folder, persist, app_variant): """ Runs tests from 'folder' @@ -350,6 +351,10 @@ class PypeCommands: mark (str): label to run tests marked by it (slow etc) pyargs (str): package path to test test_data_folder (str): url to unzipped folder of test data + persist (bool): True if keep test db and published after test + end + app_variant (str): variant (eg 2020 for AE), empty if use + latest installed version """ print("run_tests") if folder: @@ -366,9 +371,15 @@ class PypeCommands: if pyargs: args.extend(["--pyargs", pyargs]) - if test_data_folder: + if persist: args.extend(["--test_data_folder", test_data_folder]) + if persist: + args.extend(["--persist", persist]) + + if app_variant: + args.extend(["--app_variant", app_variant]) + print("run_tests args: {}".format(args)) import pytest pytest.main(args) diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index bc002e8f86..400c0dcc2a 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -1,12 +1,35 @@ # -*- coding: utf-8 -*- +# adds command line arguments for 'runtests' as a fixtures import pytest + def pytest_addoption(parser): parser.addoption( "--test_data_folder", action="store", default=None, help="Provide url of a folder of unzipped test file" ) + parser.addoption( + "--persist", action="store", default=None, + help="True - keep test_db, test_openpype, outputted test files" + ) + + parser.addoption( + "--app_variant", action="store", default=None, + help="Keep empty to locate latest installed variant or explicit" + ) + + @pytest.fixture(scope="module") def test_data_folder(request): - return request.config.getoption("--test_data_folder") \ No newline at end of file + return request.config.getoption("--test_data_folder") + + +@pytest.fixture(scope="module") +def persist(request): + return request.config.getoption("--persist") + + +@pytest.fixture(scope="module") +def app_variant(request): + return request.config.getoption("--app_variant") diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py index 092fd7d1c6..a5a09bdd04 100644 --- a/tests/integration/hosts/nuke/test_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -27,22 +27,23 @@ class TestPublishInNuke(PublishTest): To check log/errors from launched app's publish process keep PERSIST to True and check `test_openpype.logs` collection. """ - PERSIST = True # True - keep test_db, test_openpype, outputted test files - + # https://drive.google.com/file/d/1SUurHj2aiQ21ZIMJfGVBI2KjR8kIjBGI/view?usp=sharing # noqa: E501 TEST_FILES = [ ("1SUurHj2aiQ21ZIMJfGVBI2KjR8kIjBGI", "test_Nuke_publish.zip", "") ] APP = "nuke" - # keep empty to locate latest installed variant or explicit - APP_VARIANT = "" TIMEOUT = 120 # publish timeout - TEST_DATA_FOLDER = "C:\\Users\\petrk\\AppData\\Local\\Temp\\tmpbfh976y6" # provide existing folder with test data + # could be overwritten by command line arguments + # keep empty to locate latest installed variant or explicit + APP_VARIANT = "" + PERSIST = True # True - keep test_db, test_openpype, outputted test files + TEST_DATA_FOLDER = None @pytest.fixture(scope="module") - def last_workfile_path(self, download_test_data): + def last_workfile_path(self, download_test_data, output_folder_url): """Get last_workfile_path from source data. """ @@ -99,7 +100,7 @@ class TestPublishInNuke(PublishTest): "name": "workfileTest_task"}), \ "workfileTest_task subset must be present" - assert 10 == dbcon.count_documents({"type": "representation"}), \ + assert 4 == dbcon.count_documents({"type": "representation"}), \ "Not expected no of representations" reprs = dbcon.count_documents({"type": "representation", diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index 96e7148bff..40363e928f 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -7,6 +7,7 @@ import pytest import tempfile import shutil import glob +import platform from tests.lib.db_handler import DBHandler from tests.lib.file_handler import RemoteFileHandler @@ -58,7 +59,8 @@ class ModuleUnitTest(BaseTest): m.undo() @pytest.fixture(scope="module") - def download_test_data(self, test_data_folder): + def download_test_data(self, test_data_folder, persist=False): + test_data_folder = test_data_folder or self.TEST_DATA_FOLDER if test_data_folder: print("Using existing folder {}".format(test_data_folder)) yield test_data_folder @@ -78,7 +80,8 @@ class ModuleUnitTest(BaseTest): print("Temporary folder created:: {}".format(tmpdir)) yield tmpdir - if not self.PERSIST: + persist = persist or self.PERSIST + if not persist: print("Removing {}".format(tmpdir)) shutil.rmtree(tmpdir) @@ -188,14 +191,28 @@ class PublishTest(ModuleUnitTest): """ APP = "" - APP_VARIANT = "" # keep empty to locate latest installed variant TIMEOUT = 120 # publish timeout - @property - def app_name(self): - if self.APP_VARIANT: - return "{}/{}".format(self.APP, self.APP_VARIANT) + # could be overwritten by command line arguments + # command line value takes precedence + + # keep empty to locate latest installed variant or explicit + APP_VARIANT = "" + PERSIST = True # True - keep test_db, test_openpype, outputted test files + TEST_DATA_FOLDER = None # use specific folder of unzipped test file + + @pytest.fixture(scope="module") + def app_name(self, app_variant): + """Returns calculated value for ApplicationManager. Eg.(nuke/12-2)""" + from openpype.lib import ApplicationManager + app_variant = app_variant or self.APP_VARIANT + + application_manager = ApplicationManager() + if not app_variant: + app_variant = find_variant_key(application_manager, self.APP) + + yield "{}/{}".format(self.APP, app_variant) @pytest.fixture(scope="module") def last_workfile_path(self, download_test_data): @@ -203,6 +220,7 @@ class PublishTest(ModuleUnitTest): @pytest.fixture(scope="module") def startup_scripts(self, monkeypatch_session, download_test_data): + """"Adds init scripts (like userSetup) to expected location""" raise NotImplementedError @pytest.fixture(scope="module") @@ -270,12 +288,6 @@ class PublishTest(ModuleUnitTest): if app_args: data["app_args"] = app_args - variant = self.APP_VARIANT - if not variant: - variant = find_variant_key(application_manager, self.APP) - - app_name = "{}/{}".format(self.APP, variant) - app_process = application_manager.launch(app_name, **data) yield app_process @@ -295,13 +307,13 @@ class PublishTest(ModuleUnitTest): yield True def test_folder_structure_same(self, dbcon, publish_finished, - download_test_data): + download_test_data, output_folder_url): """Check if expected and published subfolders contain same files. Compares only presence, not size nor content! """ published_dir_base = download_test_data - published_dir = os.path.join(published_dir_base, + published_dir = os.path.join(output_folder_url, self.PROJECT, self.TASK, "**") @@ -311,7 +323,8 @@ class PublishTest(ModuleUnitTest): self.PROJECT, self.TASK, "**") - + print("Comparing published:'{}' : expected:'{}'".format(published_dir, + expected_dir)) published = set(f.replace(published_dir_base, '') for f in glob.glob(published_dir, recursive=True) if f != published_dir_base and os.path.exists(f)) From 9a0d55e2f3c6e07d1ccfffd3cd1f5f04669b15b7 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 Dec 2021 15:08:13 +0100 Subject: [PATCH 187/341] OP-2042 - added new fixture output_folder_url Explicitly sets directory of published files. (Purges them if exist!) --- .../hosts/maya/test_publish_in_maya.py | 4 ++-- .../hosts/nuke/test_publish_in_nuke.py | 2 +- .../photoshop/test_publish_in_photoshop.py | 4 ++-- tests/lib/testing_classes.py | 19 +++++++++++++++---- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/tests/integration/hosts/maya/test_publish_in_maya.py b/tests/integration/hosts/maya/test_publish_in_maya.py index 687e6fbc6e..5f3a550c6a 100644 --- a/tests/integration/hosts/maya/test_publish_in_maya.py +++ b/tests/integration/hosts/maya/test_publish_in_maya.py @@ -39,7 +39,7 @@ class TestPublishInMaya(PublishTest): TIMEOUT = 120 # publish timeout @pytest.fixture(scope="module") - def last_workfile_path(self, download_test_data): + def last_workfile_path(self, download_test_data, output_folder_url): """Get last_workfile_path from source data. Maya expects workfile in proper folder, so copy is done first. @@ -48,7 +48,7 @@ class TestPublishInMaya(PublishTest): "input", "workfile", "test_project_test_asset_TestTask_v001.mb") - dest_folder = os.path.join(download_test_data, + dest_folder = os.path.join(output_folder_url, self.PROJECT, self.ASSET, "work", diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py index a5a09bdd04..797bc0a9d3 100644 --- a/tests/integration/hosts/nuke/test_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -52,7 +52,7 @@ class TestPublishInNuke(PublishTest): "input", "workfile", source_file_name) - dest_folder = os.path.join(download_test_data, + dest_folder = os.path.join(output_folder_url, self.PROJECT, self.ASSET, "work", diff --git a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py index c7f2399494..541552fedf 100644 --- a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py +++ b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py @@ -37,7 +37,7 @@ class TestPublishInPhotoshop(PublishTest): TIMEOUT = 120 # publish timeout @pytest.fixture(scope="module") - def last_workfile_path(self, download_test_data): + def last_workfile_path(self, download_test_data, output_folder_url): """Get last_workfile_path from source data. Maya expects workfile in proper folder, so copy is done first. @@ -46,7 +46,7 @@ class TestPublishInPhotoshop(PublishTest): "input", "workfile", "test_project_test_asset_TestTask_v001.psd") - dest_folder = os.path.join(download_test_data, + dest_folder = os.path.join(output_folder_url, self.PROJECT, self.ASSET, "work", diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index 40363e928f..ad637e6974 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -215,7 +215,17 @@ class PublishTest(ModuleUnitTest): yield "{}/{}".format(self.APP, app_variant) @pytest.fixture(scope="module") - def last_workfile_path(self, download_test_data): + def output_folder_url(self, download_test_data): + """Returns location of published data, cleans it first if exists.""" + path = os.path.join(download_test_data, "output") + if os.path.exists(path): + print("Purging {}".format(path)) + shutil.rmtree(path) + yield path + + @pytest.fixture(scope="module") + def last_workfile_path(self, download_test_data, output_folder_url): + """Returns url of workfile""" raise NotImplementedError @pytest.fixture(scope="module") @@ -251,15 +261,16 @@ class PublishTest(ModuleUnitTest): @pytest.fixture(scope="module") def launched_app(self, dbcon, download_test_data, last_workfile_path, - startup_scripts, app_args): + startup_scripts, app_args, app_name, output_folder_url): """Launch host app""" # set publishing folders - root_key = "config.roots.work.{}".format("windows") # TEMP + platform_str = platform.system().lower() + root_key = "config.roots.work.{}".format(platform_str) dbcon.update_one( {"type": "project"}, {"$set": { - root_key: download_test_data + root_key: output_folder_url }} ) From 09bbebae18bca1da746229963bc45cf2f48f8d32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20LORRAIN?= Date: Fri, 10 Dec 2021 15:14:03 +0100 Subject: [PATCH 188/341] Add settings to repair --- .../publish/validate_render_image_rule.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/validate_render_image_rule.py b/openpype/hosts/maya/plugins/publish/validate_render_image_rule.py index a912431b55..642ca9e25d 100644 --- a/openpype/hosts/maya/plugins/publish/validate_render_image_rule.py +++ b/openpype/hosts/maya/plugins/publish/validate_render_image_rule.py @@ -23,11 +23,7 @@ class ValidateRenderImageRule(pyblish.api.InstancePlugin): def process(self, instance): - default_render_file = instance.context.data.get('project_settings')\ - .get('maya') \ - .get('create') \ - .get('CreateRender') \ - .get('default_render_image_folder') + default_render_file = self.get_default_render_image_folder(instance) assert get_file_rule("images") == default_render_file, ( "Workspace's `images` file rule must be set to: {}".format( @@ -37,5 +33,14 @@ class ValidateRenderImageRule(pyblish.api.InstancePlugin): @classmethod def repair(cls, instance): - pm.workspace.fileRules["images"] = "renders" + default = cls.get_default_render_image_folder(instance) + pm.workspace.fileRules["images"] = default pm.system.Workspace.save() + + @staticmethod + def get_default_render_image_folder(instance): + return instance.context.data.get('project_settings')\ + .get('maya') \ + .get('create') \ + .get('CreateRender') \ + .get('default_render_image_folder') From c754521d0aa5ba0bed5baab997e3278224d7a602 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 Dec 2021 16:40:23 +0100 Subject: [PATCH 189/341] OP-2042 - added new handling of asserts Added DBAssert class which wraps standard use cases for asserts --- .../hosts/nuke/test_publish_in_nuke.py | 43 +++++++++--------- tests/lib/assert_classes.py | 45 +++++++++++++++++++ 2 files changed, 66 insertions(+), 22 deletions(-) create mode 100644 tests/lib/assert_classes.py diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py index 797bc0a9d3..6b1088206a 100644 --- a/tests/integration/hosts/nuke/test_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -4,6 +4,7 @@ import logging import shutil from tests.lib.testing_classes import PublishTest +from tests.lib.assert_classes import DBAssert log = logging.getLogger("test_publish_in_nuke") @@ -82,33 +83,31 @@ class TestPublishInNuke(PublishTest): def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" print("test_db_asserts") - versions = dbcon.count_documents({"type": "version"}) - assert 2 == versions, \ - "Not expected no of versions. "\ - "Expected 2, found {}".format(versions) + failures = [] - assert 0 == dbcon.count_documents({"type": "version", - "name": {"$ne": 1}}), \ - "Only versions with 1 expected" + failures.append(DBAssert.count_of_types(dbcon, "version", 2)) - assert 1 == dbcon.count_documents({"type": "subset", - "name": "renderCompositingInNukeMain"} # noqa: E501 - ), \ - "renderCompositingInNukeMain subset must be present" + failures.append( + DBAssert.count_of_types(dbcon, "version", 0, name={"$ne": 1})) - assert 1 == dbcon.count_documents({"type": "subset", - "name": "workfileTest_task"}), \ - "workfileTest_task subset must be present" + failures.append( + DBAssert.count_of_types(dbcon, "subset", 1, + name="renderCompositingInNukeMain")) - assert 4 == dbcon.count_documents({"type": "representation"}), \ - "Not expected no of representations" + failures.append( + DBAssert.count_of_types(dbcon, "subset", 1, + name="workfileTest_task")) - reprs = dbcon.count_documents({"type": "representation", - "context.subset": "renderCompositingInNukeMain", # noqa: E501 - "context.ext": "exr"}) - assert 1 == reprs, \ - "Not expected no of representations with ext 'exr'."\ - "Expected 1, found {}".format(reprs) + failures.append( + DBAssert.count_of_types(dbcon, "representation", 4)) + + additional_args = {"context.subset": "renderCompositingInNukeMain", + "context.ext": "exr"} + failures.append( + DBAssert.count_of_types(dbcon, "representation", 1, + additional_args=additional_args)) + + assert not any(failures) if __name__ == "__main__": diff --git a/tests/lib/assert_classes.py b/tests/lib/assert_classes.py new file mode 100644 index 0000000000..7298853b67 --- /dev/null +++ b/tests/lib/assert_classes.py @@ -0,0 +1,45 @@ +"""Classed and methods for comparing expected and published items in DBs""" + +class DBAssert: + + @classmethod + def count_of_types(cls, dbcon, queried_type, expected, **kwargs): + """Queries 'dbcon' and counts documents of type 'queried_type' + + Args: + dbcon (AvalonMongoDB) + queried_type (str): type of document ("asset", "version"...) + expected (int): number of documents found + any number of additional keyword arguments + + special handling of argument additional_args (dict) + with additional args like + {"context.subset": "XXX"} + """ + args = {"type": queried_type} + for key, val in kwargs.items(): + if key == "additional_args": + args.update(val) + else: + args[key] = val + + msg = None + no_of_docs = dbcon.count_documents(args) + if expected != no_of_docs: + msg = "Not expected no of versions. "\ + "Expected {}, found {}".format(expected, no_of_docs) + + args.pop("type") + detail_str = " " + if args: + detail_str = " with {}".format(args) + + status = "successful" + if msg: + status = "failed" + + print("Comparing count of {}{} {}".format(queried_type, + detail_str, + status)) + + return msg From ec15b482dbfd38a0a4c18831f38009c900156632 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 Dec 2021 17:25:37 +0100 Subject: [PATCH 190/341] OP-2042 - added additional class wrapper per host --- tests/integration/hosts/maya/lib.py | 41 +++++++++++++++++ .../hosts/maya/test_publish_in_maya.py | 42 +----------------- tests/integration/hosts/nuke/lib.py | 44 +++++++++++++++++++ .../hosts/nuke/test_publish_in_nuke.py | 44 +------------------ tests/integration/hosts/photoshop/lib.py | 34 ++++++++++++++ .../photoshop/test_publish_in_photoshop.py | 35 +-------------- tests/lib/testing_classes.py | 23 +++++----- 7 files changed, 138 insertions(+), 125 deletions(-) create mode 100644 tests/integration/hosts/maya/lib.py create mode 100644 tests/integration/hosts/nuke/lib.py create mode 100644 tests/integration/hosts/photoshop/lib.py diff --git a/tests/integration/hosts/maya/lib.py b/tests/integration/hosts/maya/lib.py new file mode 100644 index 0000000000..f3a438c065 --- /dev/null +++ b/tests/integration/hosts/maya/lib.py @@ -0,0 +1,41 @@ +import os +import pytest +import shutil + +from tests.lib.testing_classes import HostFixtures + + +class MayaTestClass(HostFixtures): + @pytest.fixture(scope="module") + def last_workfile_path(self, download_test_data, output_folder_url): + """Get last_workfile_path from source data. + + Maya expects workfile in proper folder, so copy is done first. + """ + src_path = os.path.join(download_test_data, + "input", + "workfile", + "test_project_test_asset_TestTask_v001.mb") + dest_folder = os.path.join(output_folder_url, + self.PROJECT, + self.ASSET, + "work", + self.TASK) + os.makedirs(dest_folder) + dest_path = os.path.join(dest_folder, + "test_project_test_asset_TestTask_v001.mb") + shutil.copy(src_path, dest_path) + + yield dest_path + + @pytest.fixture(scope="module") + def startup_scripts(self, monkeypatch_session, download_test_data): + """Points Maya to userSetup file from input data""" + startup_path = os.path.join(download_test_data, + "input", + "startup") + original_pythonpath = os.environ.get("PYTHONPATH") + monkeypatch_session.setenv("PYTHONPATH", + "{}{}{}".format(startup_path, + os.pathsep, + original_pythonpath)) diff --git a/tests/integration/hosts/maya/test_publish_in_maya.py b/tests/integration/hosts/maya/test_publish_in_maya.py index 5f3a550c6a..68b0564428 100644 --- a/tests/integration/hosts/maya/test_publish_in_maya.py +++ b/tests/integration/hosts/maya/test_publish_in_maya.py @@ -1,11 +1,7 @@ -import pytest -import os -import shutil - -from tests.lib.testing_classes import PublishTest +from tests.integration.hosts.maya.lib import MayaTestClass -class TestPublishInMaya(PublishTest): +class TestPublishInMaya(MayaTestClass): """Basic test case for publishing in Maya Shouldnt be running standalone only via 'runtests' pype command! (??) @@ -38,40 +34,6 @@ class TestPublishInMaya(PublishTest): TIMEOUT = 120 # publish timeout - @pytest.fixture(scope="module") - def last_workfile_path(self, download_test_data, output_folder_url): - """Get last_workfile_path from source data. - - Maya expects workfile in proper folder, so copy is done first. - """ - src_path = os.path.join(download_test_data, - "input", - "workfile", - "test_project_test_asset_TestTask_v001.mb") - dest_folder = os.path.join(output_folder_url, - self.PROJECT, - self.ASSET, - "work", - self.TASK) - os.makedirs(dest_folder) - dest_path = os.path.join(dest_folder, - "test_project_test_asset_TestTask_v001.mb") - shutil.copy(src_path, dest_path) - - yield dest_path - - @pytest.fixture(scope="module") - def startup_scripts(self, monkeypatch_session, download_test_data): - """Points Maya to userSetup file from input data""" - startup_path = os.path.join(download_test_data, - "input", - "startup") - original_pythonpath = os.environ.get("PYTHONPATH") - monkeypatch_session.setenv("PYTHONPATH", - "{}{}{}".format(startup_path, - os.pathsep, - original_pythonpath)) - def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" print("test_db_asserts") diff --git a/tests/integration/hosts/nuke/lib.py b/tests/integration/hosts/nuke/lib.py new file mode 100644 index 0000000000..d3c3d7ba81 --- /dev/null +++ b/tests/integration/hosts/nuke/lib.py @@ -0,0 +1,44 @@ +import os +import pytest +import shutil + +from tests.lib.testing_classes import HostFixtures + + +class NukeTestClass(HostFixtures): + @pytest.fixture(scope="module") + def last_workfile_path(self, download_test_data, output_folder_url): + """Get last_workfile_path from source data. + + """ + source_file_name = "test_project_test_asset_CompositingInNuke_v001.nk" + src_path = os.path.join(download_test_data, + "input", + "workfile", + source_file_name) + dest_folder = os.path.join(output_folder_url, + self.PROJECT, + self.ASSET, + "work", + self.TASK) + if not os.path.exists(dest_folder): + os.makedirs(dest_folder) + + dest_path = os.path.join(dest_folder, + source_file_name) + + shutil.copy(src_path, dest_path) + + yield dest_path + + @pytest.fixture(scope="module") + def startup_scripts(self, monkeypatch_session, download_test_data): + """Points Nuke to userSetup file from input data""" + startup_path = os.path.join(download_test_data, + "input", + "startup") + original_nuke_path = os.environ.get("NUKE_PATH", "") + monkeypatch_session.setenv("NUKE_PATH", + "{}{}{}".format(startup_path, + os.pathsep, + original_nuke_path)) \ No newline at end of file diff --git a/tests/integration/hosts/nuke/test_publish_in_nuke.py b/tests/integration/hosts/nuke/test_publish_in_nuke.py index 6b1088206a..884160e0b5 100644 --- a/tests/integration/hosts/nuke/test_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_publish_in_nuke.py @@ -1,15 +1,12 @@ -import pytest -import os import logging -import shutil -from tests.lib.testing_classes import PublishTest from tests.lib.assert_classes import DBAssert +from tests.integration.hosts.nuke.lib import NukeTestClass log = logging.getLogger("test_publish_in_nuke") -class TestPublishInNuke(PublishTest): +class TestPublishInNuke(NukeTestClass): """Basic test case for publishing in Nuke Uses generic TestCase to prepare fixtures for test data, testing DBs, @@ -43,43 +40,6 @@ class TestPublishInNuke(PublishTest): PERSIST = True # True - keep test_db, test_openpype, outputted test files TEST_DATA_FOLDER = None - @pytest.fixture(scope="module") - def last_workfile_path(self, download_test_data, output_folder_url): - """Get last_workfile_path from source data. - - """ - source_file_name = "test_project_test_asset_CompositingInNuke_v001.nk" - src_path = os.path.join(download_test_data, - "input", - "workfile", - source_file_name) - dest_folder = os.path.join(output_folder_url, - self.PROJECT, - self.ASSET, - "work", - self.TASK) - if not os.path.exists(dest_folder): - os.makedirs(dest_folder) - - dest_path = os.path.join(dest_folder, - source_file_name) - - shutil.copy(src_path, dest_path) - - yield dest_path - - @pytest.fixture(scope="module") - def startup_scripts(self, monkeypatch_session, download_test_data): - """Points Nuke to userSetup file from input data""" - startup_path = os.path.join(download_test_data, - "input", - "startup") - original_nuke_path = os.environ.get("NUKE_PATH", "") - monkeypatch_session.setenv("NUKE_PATH", - "{}{}{}".format(startup_path, - os.pathsep, - original_nuke_path)) - def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" print("test_db_asserts") diff --git a/tests/integration/hosts/photoshop/lib.py b/tests/integration/hosts/photoshop/lib.py new file mode 100644 index 0000000000..16ef2d3ae6 --- /dev/null +++ b/tests/integration/hosts/photoshop/lib.py @@ -0,0 +1,34 @@ +import os +import pytest +import shutil + +from tests.lib.testing_classes import HostFixtures + + +class PhotoshopTestClass(HostFixtures): + @pytest.fixture(scope="module") + def last_workfile_path(self, download_test_data, output_folder_url): + """Get last_workfile_path from source data. + + Maya expects workfile in proper folder, so copy is done first. + """ + src_path = os.path.join(download_test_data, + "input", + "workfile", + "test_project_test_asset_TestTask_v001.psd") + dest_folder = os.path.join(output_folder_url, + self.PROJECT, + self.ASSET, + "work", + self.TASK) + os.makedirs(dest_folder) + dest_path = os.path.join(dest_folder, + "test_project_test_asset_TestTask_v001.psd") + shutil.copy(src_path, dest_path) + + yield dest_path + + @pytest.fixture(scope="module") + def startup_scripts(self, monkeypatch_session, download_test_data): + """Points Maya to userSetup file from input data""" + pass diff --git a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py index 541552fedf..ab07577b4a 100644 --- a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py +++ b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py @@ -1,11 +1,7 @@ -import pytest -import os -import shutil - -from tests.lib.testing_classes import PublishTest +from tests.integration.hosts.photoshop.lib import PhotoshopTestClass -class TestPublishInPhotoshop(PublishTest): +class TestPublishInPhotoshop(PhotoshopTestClass): """Basic test case for publishing in Photoshop Uses generic TestCase to prepare fixtures for test data, testing DBs, @@ -36,33 +32,6 @@ class TestPublishInPhotoshop(PublishTest): TIMEOUT = 120 # publish timeout - @pytest.fixture(scope="module") - def last_workfile_path(self, download_test_data, output_folder_url): - """Get last_workfile_path from source data. - - Maya expects workfile in proper folder, so copy is done first. - """ - src_path = os.path.join(download_test_data, - "input", - "workfile", - "test_project_test_asset_TestTask_v001.psd") - dest_folder = os.path.join(output_folder_url, - self.PROJECT, - self.ASSET, - "work", - self.TASK) - os.makedirs(dest_folder) - dest_path = os.path.join(dest_folder, - "test_project_test_asset_TestTask_v001.psd") - shutil.copy(src_path, dest_path) - - yield dest_path - - @pytest.fixture(scope="module") - def startup_scripts(self, monkeypatch_session, download_test_data): - """Points Maya to userSetup file from input data""" - pass - def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" print("test_db_asserts") diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index ad637e6974..06922abc01 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -223,16 +223,6 @@ class PublishTest(ModuleUnitTest): shutil.rmtree(path) yield path - @pytest.fixture(scope="module") - def last_workfile_path(self, download_test_data, output_folder_url): - """Returns url of workfile""" - raise NotImplementedError - - @pytest.fixture(scope="module") - def startup_scripts(self, monkeypatch_session, download_test_data): - """"Adds init scripts (like userSetup) to expected location""" - raise NotImplementedError - @pytest.fixture(scope="module") def app_args(self, download_test_data): """Returns additional application arguments from a test file. @@ -345,3 +335,16 @@ class PublishTest(ModuleUnitTest): not_matched = expected.difference(published) assert not not_matched, "Missing {} files".format(not_matched) + + +class HostFixtures(PublishTest): + """Host specific fixtures. Should be implemented once per host.""" + @pytest.fixture(scope="module") + def last_workfile_path(self, download_test_data, output_folder_url): + """Returns url of workfile""" + raise NotImplementedError + + @pytest.fixture(scope="module") + def startup_scripts(self, monkeypatch_session, download_test_data): + """"Adds init scripts (like userSetup) to expected location""" + raise NotImplementedError \ No newline at end of file From ea034447ed88285f52e1d7466bdfa4d26b82bed3 Mon Sep 17 00:00:00 2001 From: OpenPype Date: Sat, 11 Dec 2021 03:41:14 +0000 Subject: [PATCH 191/341] [Automated] Bump version --- CHANGELOG.md | 6 +++--- openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a38bbf7af..860e26c59c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [3.7.0-nightly.6](https://github.com/pypeclub/OpenPype/tree/HEAD) +## [3.7.0-nightly.7](https://github.com/pypeclub/OpenPype/tree/HEAD) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...HEAD) @@ -30,6 +30,7 @@ - General: Reduce vendor imports [\#2305](https://github.com/pypeclub/OpenPype/pull/2305) - Tools: Cleanup of unused classes [\#2304](https://github.com/pypeclub/OpenPype/pull/2304) - Project Manager: Added ability to delete project [\#2298](https://github.com/pypeclub/OpenPype/pull/2298) +- Ftrack: Synchronize input links [\#2287](https://github.com/pypeclub/OpenPype/pull/2287) - Nuke: extract baked review videos presets [\#2248](https://github.com/pypeclub/OpenPype/pull/2248) **🐛 Bug fixes** @@ -93,7 +94,6 @@ - Tools: Assets widget [\#2265](https://github.com/pypeclub/OpenPype/pull/2265) - SceneInventory: Choose loader in asset switcher [\#2262](https://github.com/pypeclub/OpenPype/pull/2262) - Style: New fonts in OpenPype style [\#2256](https://github.com/pypeclub/OpenPype/pull/2256) -- Tools: SceneInventory in OpenPype [\#2255](https://github.com/pypeclub/OpenPype/pull/2255) - Tools: Tasks widget [\#2251](https://github.com/pypeclub/OpenPype/pull/2251) - Tools: Creator in OpenPype [\#2244](https://github.com/pypeclub/OpenPype/pull/2244) @@ -121,8 +121,8 @@ **🚀 Enhancements** +- Tools: SceneInventory in OpenPype [\#2255](https://github.com/pypeclub/OpenPype/pull/2255) - Tools: Subset manager in OpenPype [\#2243](https://github.com/pypeclub/OpenPype/pull/2243) -- General: Skip module directories without init file [\#2239](https://github.com/pypeclub/OpenPype/pull/2239) **🐛 Bug fixes** diff --git a/openpype/version.py b/openpype/version.py index 8909c5edac..95cd7a285f 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.7.0-nightly.6" +__version__ = "3.7.0-nightly.7" diff --git a/pyproject.toml b/pyproject.toml index 0b2176d277..d994569fa7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.7.0-nightly.6" # OpenPype +version = "3.7.0-nightly.7" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From c78d4d89a4a36b7987b0ba7d7fc175a282cf0593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20LORRAIN?= Date: Mon, 13 Dec 2021 10:45:30 +0100 Subject: [PATCH 192/341] Handle message type attribute --- openpype/hosts/maya/plugins/publish/collect_look.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openpype/hosts/maya/plugins/publish/collect_look.py b/openpype/hosts/maya/plugins/publish/collect_look.py index 20a9d4ca12..0ab278772e 100644 --- a/openpype/hosts/maya/plugins/publish/collect_look.py +++ b/openpype/hosts/maya/plugins/publish/collect_look.py @@ -489,6 +489,8 @@ class CollectLook(pyblish.api.InstancePlugin): if not cmds.attributeQuery(attr, node=node, exists=True): continue attribute = "{}.{}".format(node, attr) + if cmds.getAttr(attribute, type=True) == "message": + continue node_attributes[attr] = cmds.getAttr(attribute) attributes.append({"name": node, From daa8eb532a2428d93376cf67a591c89319f9ac9d Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 13 Dec 2021 11:49:19 +0100 Subject: [PATCH 193/341] OP-2042 - fix tested output path --- tests/lib/testing_classes.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index 06922abc01..fa467acf9c 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -316,12 +316,14 @@ class PublishTest(ModuleUnitTest): published_dir_base = download_test_data published_dir = os.path.join(output_folder_url, self.PROJECT, + self.ASSET, self.TASK, "**") expected_dir_base = os.path.join(published_dir_base, "expected") expected_dir = os.path.join(expected_dir_base, self.PROJECT, + self.ASSET, self.TASK, "**") print("Comparing published:'{}' : expected:'{}'".format(published_dir, From 165b5b0b0bb335511d70d68e8db4f2b6b8d4679b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20LORRAIN?= Date: Mon, 13 Dec 2021 11:59:43 +0100 Subject: [PATCH 194/341] Add zero padding to otio burnins --- openpype/scripts/otio_burnin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/scripts/otio_burnin.py b/openpype/scripts/otio_burnin.py index 68f4728bc7..156550aab1 100644 --- a/openpype/scripts/otio_burnin.py +++ b/openpype/scripts/otio_burnin.py @@ -342,7 +342,8 @@ class ModifiedBurnins(ffmpeg_burnins.Burnins): if frame_start is None: replacement_final = replacement_size = str(MISSING_KEY_VALUE) else: - replacement_final = "%{eif:n+" + str(frame_start) + ":d}" + replacement_final = "%{eif:n+" + str(frame_start) + ":d:" + \ + str(len(str(frame_end))) + "}" replacement_size = str(frame_end) final_text = final_text.replace( From fed3013703b944142bc5f084b23b0705fbd0aaa0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 13 Dec 2021 12:37:33 +0100 Subject: [PATCH 195/341] fix changed state of wrapper label --- openpype/style/style.css | 57 +++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/openpype/style/style.css b/openpype/style/style.css index 19245cdc40..81aa70ea62 100644 --- a/openpype/style/style.css +++ b/openpype/style/style.css @@ -1044,16 +1044,45 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { color: {color:settings:label-fg}; } #SettingsLabel:hover {color: {color:settings:label-fg-hover};} -#SettingsLabel[state="studio"] {color: {color:settings:studio-light};} -#SettingsLabel[state="studio"]:hover {color: {color:settings:studio-label-hover};} -#SettingsLabel[state="modified"] {color: {color:settings:modified-mid};} -#SettingsLabel[state="modified"]:hover {color: {color:settings:modified-light};} -#SettingsLabel[state="overriden-modified"] {color: {color:settings:modified-mid};} -#SettingsLabel[state="overriden-modified"]:hover {color: {color:settings:modified-light};} -#SettingsLabel[state="overriden"] {color: {color:settings:project-mid};} -#SettingsLabel[state="overriden"]:hover {color: {color:settings:project-light};} -#SettingsLabel[state="invalid"] {color:{color:settings:invalid-dark};} -#SettingsLabel[state="invalid"]:hover {color: {color:settings:invalid-dark};} + +#ExpandLabel { + font-weight: bold; + color: {color:settings:label-fg}; +} +#ExpandLabel:hover { + color: {color:settings:label-fg-hover}; +} + +#ExpandLabel[state="studio"], #SettingsLabel[state="studio"] { + color: {color:settings:studio-light}; +} +#ExpandLabel[state="studio"]:hover, #SettingsLabel[state="studio"]:hover { + color: {color:settings:studio-label-hover}; +} +#ExpandLabel[state="modified"], #SettingsLabel[state="modified"] { + color: {color:settings:modified-mid}; +} +#ExpandLabel[state="modified"]:hover, #SettingsLabel[state="modified"]:hover { + color: {color:settings:modified-light}; +} +#ExpandLabel[state="overriden-modified"], #SettingsLabel[state="overriden-modified"] { + color: {color:settings:modified-mid}; +} +#ExpandLabel[state="overriden-modified"]:hover, #SettingsLabel[state="overriden-modified"]:hover { + color: {color:settings:modified-light}; +} +#ExpandLabel[state="overriden"], #SettingsLabel[state="overriden"] {color: { + color:settings:project-mid}; +} +#ExpandLabel[state="overriden"]:hover, #SettingsLabel[state="overriden"]:hover { + color: {color:settings:project-light}; +} +#ExpandLabel[state="invalid"], #SettingsLabel[state="invalid"] { + color:{color:settings:invalid-dark}; +} +#ExpandLabel[state="invalid"]:hover, #SettingsLabel[state="invalid"]:hover { + color: {color:settings:invalid-dark}; +} /* TODO Replace these with explicit widget types if possible */ #SettingsMainWidget QWidget[input-state="modified"] { @@ -1085,14 +1114,6 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { #DictKey[state="modified"] {border-color: {color:settings:modified-mid};} #DictKey[state="invalid"] {border-color: {color:settings:invalid-dark};} -#ExpandLabel { - font-weight: bold; - color: {color:settings:label-fg}; -} -#ExpandLabel:hover { - color: {color:settings:label-fg-hover}; -} - #ContentWidget { background-color: transparent; } From 590f19e96f0b6a903cb760157a50ed55f0a782c3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 13 Dec 2021 12:44:37 +0100 Subject: [PATCH 196/341] fixed typo --- openpype/style/style.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/style/style.css b/openpype/style/style.css index 81aa70ea62..4159fe1676 100644 --- a/openpype/style/style.css +++ b/openpype/style/style.css @@ -1071,8 +1071,8 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { #ExpandLabel[state="overriden-modified"]:hover, #SettingsLabel[state="overriden-modified"]:hover { color: {color:settings:modified-light}; } -#ExpandLabel[state="overriden"], #SettingsLabel[state="overriden"] {color: { - color:settings:project-mid}; +#ExpandLabel[state="overriden"], #SettingsLabel[state="overriden"] { + color: {color:settings:project-mid}; } #ExpandLabel[state="overriden"]:hover, #SettingsLabel[state="overriden"]:hover { color: {color:settings:project-light}; From 4013412c638f7bafb050e941b757ca69ddf7a2c2 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 13 Dec 2021 13:42:40 +0100 Subject: [PATCH 197/341] send_selection returns True --- openpype/hosts/flame/api/menu.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openpype/hosts/flame/api/menu.py b/openpype/hosts/flame/api/menu.py index 85fcb86026..f216428e18 100644 --- a/openpype/hosts/flame/api/menu.py +++ b/openpype/hosts/flame/api/menu.py @@ -28,6 +28,7 @@ def send_selection(selection): import openpype.hosts.flame as opflame opflame.selection = selection print(opflame.selection) + return True class _FlameMenuApp(object): def __init__(self, framework): From c4106bf95a9e604c760c1c449ef456c884b27f40 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 13 Dec 2021 14:01:28 +0100 Subject: [PATCH 198/341] set placeholder font color on initialization instead of after show --- openpype/tools/utils/widgets.py | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/openpype/tools/utils/widgets.py b/openpype/tools/utils/widgets.py index 009c1dc506..3bfa092a21 100644 --- a/openpype/tools/utils/widgets.py +++ b/openpype/tools/utils/widgets.py @@ -12,22 +12,17 @@ class PlaceholderLineEdit(QtWidgets.QLineEdit): """Set placeholder color of QLineEdit in Qt 5.12 and higher.""" def __init__(self, *args, **kwargs): super(PlaceholderLineEdit, self).__init__(*args, **kwargs) - self._first_show = True - - def showEvent(self, event): - super(PlaceholderLineEdit, self).showEvent(event) - if self._first_show: - self._first_show = False + # Change placeholder palette color + if hasattr(QtGui.QPalette, "PlaceholderText"): filter_palette = self.palette() - if hasattr(filter_palette, "PlaceholderText"): - color_obj = get_objected_colors()["font"] - color = color_obj.get_qcolor() - color.setAlpha(67) - filter_palette.setColor( - filter_palette.PlaceholderText, - color - ) - self.setPalette(filter_palette) + color_obj = get_objected_colors()["font"] + color = color_obj.get_qcolor() + color.setAlpha(67) + filter_palette.setColor( + QtGui.QPalette.PlaceholderText, + color + ) + self.setPalette(filter_palette) class ImageButton(QtWidgets.QPushButton): From 0b6e2f337aa94e0aa35beb17937a2d7a49fd889b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 6 Dec 2021 12:24:02 +0100 Subject: [PATCH 199/341] modified version regex for installation of PySide2 into blender --- openpype/hosts/blender/hooks/pre_pyside_install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/blender/hooks/pre_pyside_install.py b/openpype/hosts/blender/hooks/pre_pyside_install.py index 6d253300d9..e2a419c8ef 100644 --- a/openpype/hosts/blender/hooks/pre_pyside_install.py +++ b/openpype/hosts/blender/hooks/pre_pyside_install.py @@ -32,7 +32,7 @@ class InstallPySideToBlender(PreLaunchHook): def inner_execute(self): # Get blender's python directory - version_regex = re.compile(r"^2\.[0-9]{2}$") + version_regex = re.compile(r"^[2-3]\.[0-9]+$") executable = self.launch_context.executable.executable_path if os.path.basename(executable).lower() != "blender.exe": From 818740c359b336925fe4b8e662ca610c75fbfe75 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 13 Dec 2021 19:23:59 +0100 Subject: [PATCH 200/341] use default components in log mongo --- openpype/lib/log.py | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/openpype/lib/log.py b/openpype/lib/log.py index 85cbc733ba..a34cb898e3 100644 --- a/openpype/lib/log.py +++ b/openpype/lib/log.py @@ -27,7 +27,7 @@ import copy from . import Terminal from .mongo import ( MongoEnvNotSet, - decompose_url, + get_default_components, OpenPypeMongoConnection ) try: @@ -202,10 +202,6 @@ class PypeLogger: use_mongo_logging = None mongo_process_id = None - # Information about mongo url - log_mongo_url = None - log_mongo_url_components = None - # Database name in Mongo log_database_name = os.environ["OPENPYPE_DATABASE_NAME"] # Collection name under database in Mongo @@ -282,9 +278,9 @@ class PypeLogger: if not cls.use_mongo_logging: return - components = cls.log_mongo_url_components + components = get_default_components() kwargs = { - "host": cls.log_mongo_url, + "host": components["host"], "database_name": cls.log_database_name, "collection": cls.log_collection_name, "username": components["username"], @@ -354,14 +350,8 @@ class PypeLogger: # Define if is in OPENPYPE_DEBUG mode cls.pype_debug = int(os.getenv("OPENPYPE_DEBUG") or "0") - # Mongo URL where logs will be stored - cls.log_mongo_url = os.environ.get("OPENPYPE_MONGO") - - if not cls.log_mongo_url: + if not os.environ.get("OPENPYPE_MONGO"): cls.use_mongo_logging = False - else: - # Decompose url - cls.log_mongo_url_components = decompose_url(cls.log_mongo_url) # Mark as initialized cls.initialized = True @@ -474,7 +464,7 @@ class PypeLogger: if not cls.initialized: cls.initialize() - return OpenPypeMongoConnection.get_mongo_client(cls.log_mongo_url) + return OpenPypeMongoConnection.get_mongo_client() def timeit(method): From f712b207f20456621511052da6c6a2d7bd706102 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 13 Dec 2021 19:25:08 +0100 Subject: [PATCH 201/341] removed compose_url and decompose_url from api and lib functions --- openpype/api.py | 4 ---- openpype/lib/__init__.py | 4 ---- 2 files changed, 8 deletions(-) diff --git a/openpype/api.py b/openpype/api.py index a6529202ff..51854492ab 100644 --- a/openpype/api.py +++ b/openpype/api.py @@ -31,8 +31,6 @@ from .lib import ( ) from .lib.mongo import ( - decompose_url, - compose_url, get_default_components ) @@ -84,8 +82,6 @@ __all__ = [ "Anatomy", "config", "execute", - "decompose_url", - "compose_url", "get_default_components", "ApplicationManager", "BuildWorkfile", diff --git a/openpype/lib/__init__.py b/openpype/lib/__init__.py index efd2cddf7e..c99e3bc28d 100644 --- a/openpype/lib/__init__.py +++ b/openpype/lib/__init__.py @@ -32,8 +32,6 @@ from .execute import ( ) from .log import PypeLogger, timeit from .mongo import ( - decompose_url, - compose_url, get_default_components, validate_mongo_connection, OpenPypeMongoConnection @@ -276,8 +274,6 @@ __all__ = [ "get_datetime_data", "PypeLogger", - "decompose_url", - "compose_url", "get_default_components", "validate_mongo_connection", "OpenPypeMongoConnection", From 975f0a1c6857fb950e176fc70560bd7929feb8cb Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 13 Dec 2021 19:25:17 +0100 Subject: [PATCH 202/341] removed unused compose_url --- openpype/lib/mongo.py | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/openpype/lib/mongo.py b/openpype/lib/mongo.py index 0fd4517b5b..9f2463eb89 100644 --- a/openpype/lib/mongo.py +++ b/openpype/lib/mongo.py @@ -48,35 +48,6 @@ def decompose_url(url): return components -def compose_url(scheme=None, - host=None, - username=None, - password=None, - port=None, - auth_db=None): - - url = "{scheme}://" - - if username and password: - url += "{username}:{password}@" - - url += "{host}" - if port: - url += ":{port}" - - if auth_db: - url += "?authSource={auth_db}" - - return url.format(**{ - "scheme": scheme, - "host": host, - "username": username, - "password": password, - "port": port, - "auth_db": auth_db - }) - - def get_default_components(): mongo_url = os.environ.get("OPENPYPE_MONGO") if mongo_url is None: From 432c9f8f15377f506b5895d7f4433c2946c6ca9f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 13 Dec 2021 19:27:31 +0100 Subject: [PATCH 203/341] decompose_url is now private function _decompose_url --- openpype/lib/mongo.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/openpype/lib/mongo.py b/openpype/lib/mongo.py index 9f2463eb89..fb4eb76f28 100644 --- a/openpype/lib/mongo.py +++ b/openpype/lib/mongo.py @@ -15,7 +15,14 @@ class MongoEnvNotSet(Exception): pass -def decompose_url(url): +def _decompose_url(url): + """Decompose mongo url to basic components. + + Used for creation of MongoHandler which expect mongo url components as + separated kwargs. Components are at the end not used as we're setting + connection directly this is just a dumb components for MongoHandler + validation pass. + """ components = { "scheme": None, "host": None, @@ -54,7 +61,7 @@ def get_default_components(): raise MongoEnvNotSet( "URL for Mongo logging connection is not set." ) - return decompose_url(mongo_url) + return _decompose_url(mongo_url) def should_add_certificate_path_to_mongo_url(mongo_url): From d83989c9b31be293d52de4e8a210d6e5f09a6c6d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 13 Dec 2021 19:28:14 +0100 Subject: [PATCH 204/341] use first part of url for replica set urls --- openpype/lib/mongo.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openpype/lib/mongo.py b/openpype/lib/mongo.py index fb4eb76f28..7e0bd4f796 100644 --- a/openpype/lib/mongo.py +++ b/openpype/lib/mongo.py @@ -23,6 +23,11 @@ def _decompose_url(url): connection directly this is just a dumb components for MongoHandler validation pass. """ + # Use first url from passed url + # - this is beacuse it is possible to pass multiple urls for multiple + # replica sets which would crash on urlparse otherwise + # - please don't use comma in username of password + url = url.split(",")[0] components = { "scheme": None, "host": None, From f52d4700ae75b26ded49adbcadc1ad5818555b39 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 13 Dec 2021 20:10:36 +0100 Subject: [PATCH 205/341] added new plugin that will cleanup paths defined in context --- openpype/plugins/publish/cleanup_explicit.py | 152 +++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 openpype/plugins/publish/cleanup_explicit.py diff --git a/openpype/plugins/publish/cleanup_explicit.py b/openpype/plugins/publish/cleanup_explicit.py new file mode 100644 index 0000000000..88bba34532 --- /dev/null +++ b/openpype/plugins/publish/cleanup_explicit.py @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- +"""Cleanup files when publishing is done.""" +import os +import shutil +import pyblish.api + + +class ExplicitCleanUp(pyblish.api.ContextPlugin): + """Cleans up the files and folder defined to be deleted. + + plugin is looking for 2 keys into context data: + - `cleanupFullPaths` - full paths that should be removed not matter if + is path to file or to directory + - `cleanupEmptyDirs` - full paths to directories that should be removed + only if do not contain any file in it but will be removed if contain + sub-folders + """ + + order = pyblish.api.IntegratorOrder + 10 + label = "Explicit Clean Up" + optional = True + active = True + + def process(self, context): + cleanup_full_paths = context.data.get("cleanupFullPaths") + cleanup_empty_dirs = context.data.get("cleanupEmptyDirs") + + self._remove_full_paths(cleanup_full_paths) + self._remove_empty_dirs(cleanup_empty_dirs) + + def _remove_full_paths(self, full_paths): + """Remove files and folders from disc. + + Folders are removed with whole content. + """ + if not full_paths: + self.log.debug("No full paths to cleanup were collected.") + return + + # Separate paths into files and directories + filepaths = set() + dirpaths = set() + for path in full_paths: + # Skip empty items + if not path: + continue + # Normalize path + normalized = os.path.normpath(path) + # Check if path exists + if not os.path.exists(normalized): + continue + + if os.path.isfile(normalized): + filepaths.add(normalized) + else: + dirpaths.add(normalized) + + # Store failed paths with exception + failed = [] + # Store removed filepaths for logging + succeded_files = set() + # Remove file by file + for filepath in filepaths: + try: + os.remove(filepath) + succeded_files.add(filepath) + except Exception as exc: + failed.append((filepath, exc)) + + if succeded_files: + self.log.info( + "Removed files:\n{}".format("\n".join(succeded_files)) + ) + + # Delete folders with it's content + succeded_dirs = set() + for dirpath in dirpaths: + # Check if directory still exists + # - it is possible that directory was already deleted with + # different dirpath to delete + if os.path.exists(dirpath): + try: + shutil.rmtree(dirpath) + succeded_dirs.add(dirpath) + except Exception: + failed.append(dirpath) + + if succeded_dirs: + self.log.info( + "Removed direcoties:\n{}".format("\n".join(succeded_dirs)) + ) + + # Prepare lines for report of failed removements + lines = [] + for filepath, exc in failed: + lines.append("{}: {}".format(filepath, str(exc))) + + if lines: + self.log.warning( + "Failed to remove filepaths:\n{}".format("\n".join(lines)) + ) + + def _remove_empty_dirs(self, empty_dirpaths): + """Remove directories if do not contain any files.""" + if not empty_dirpaths: + self.log.debug("No empty dirs to cleanup were collected.") + return + + # First filtering of directories and making sure those are + # existing directories + filtered_dirpaths = set() + for path in empty_dirpaths: + if ( + path + and os.path.exists(path) + and os.path.isdir(path) + ): + filtered_dirpaths.add(os.path.normpath(path)) + + to_delete_dirpaths = set() + to_skip_dirpaths = set() + # Check if contain any files (or it's subfolders contain files) + for dirpath in filtered_dirpaths: + valid = True + for _, _, filenames in os.walk(dirpath): + if filenames: + valid = False + break + + if valid: + to_delete_dirpaths.add(dirpath) + else: + to_skip_dirpaths.add(dirpath) + + if to_skip_dirpaths: + self.log.debug( + "Skipped directories because contain files:\n{}".format( + "\n".join(to_skip_dirpaths) + ) + ) + + # Remove empty directies + for dirpath in to_delete_dirpaths: + if os.path.exists(dirpath): + shutil.rmtree(dirpath) + + if to_delete_dirpaths: + self.log.debug( + "Deleted empty directories:\n{}".format( + "\n".join(to_delete_dirpaths) + ) + ) From 6e64e385544bb439e81eb9a8712275f094620d7b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 13 Dec 2021 20:16:48 +0100 Subject: [PATCH 206/341] added hosts filter for old cleanup plugin --- openpype/plugins/publish/cleanup.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/openpype/plugins/publish/cleanup.py b/openpype/plugins/publish/cleanup.py index b8104078d9..f29e6ccd4e 100644 --- a/openpype/plugins/publish/cleanup.py +++ b/openpype/plugins/publish/cleanup.py @@ -15,6 +15,25 @@ class CleanUp(pyblish.api.InstancePlugin): order = pyblish.api.IntegratorOrder + 10 label = "Clean Up" + hosts = [ + "aftereffects", + "blender", + "celaction", + "flame", + "fusion", + "harmony", + "hiero", + "houdini", + "maya", + "nuke", + "photoshop", + "resolve", + "tvpaint", + "unreal", + "standalonepublisher", + "webpublisher", + "shell" + ] exclude_families = ["clip"] optional = True active = True From 148bb47b7d2c2ad366b2271a1c6916016651fdb2 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 14 Dec 2021 10:54:10 +0100 Subject: [PATCH 207/341] OP-2053 - allow injection of AVALON_DB env var as a db --- start.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/start.py b/start.py index 0f7e82071d..10b81bc725 100644 --- a/start.py +++ b/start.py @@ -339,13 +339,14 @@ def set_avalon_environments(): os.environ.get("AVALON_MONGO") or os.environ["OPENPYPE_MONGO"] ) + avalon_db = os.environ.get("AVALON_DB") or "avalon" # for tests os.environ.update({ # Mongo url (use same as OpenPype has) "AVALON_MONGO": avalon_mongo_url, "AVALON_SCHEMA": schema_path, # Mongo DB name where avalon docs are stored - "AVALON_DB": "avalon", + "AVALON_DB": avalon_db, # Name of config "AVALON_CONFIG": "openpype", "AVALON_LABEL": "OpenPype" From a6a7348a73ac5249cbbcd143b8e0f9678c4b0b6e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 14 Dec 2021 11:12:06 +0100 Subject: [PATCH 208/341] fix access to default settings in get_general_environments --- openpype/settings/lib.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openpype/settings/lib.py b/openpype/settings/lib.py index ff75562413..43489aecfd 100644 --- a/openpype/settings/lib.py +++ b/openpype/settings/lib.py @@ -933,8 +933,10 @@ def get_general_environments(): # - prevent to use `get_system_settings` where `get_default_settings` # is used default_values = load_openpype_default_settings() + system_settings = default_values["system_settings"] studio_overrides = get_studio_system_settings_overrides() - result = apply_overrides(default_values, studio_overrides) + + result = apply_overrides(system_settings, studio_overrides) environments = result["general"]["environment"] clear_metadata_from_settings(environments) From 8739dd9f05e7f70dddd388da2de0b7efd4456832 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 14 Dec 2021 11:13:02 +0100 Subject: [PATCH 209/341] OP-2053 - fix counts in db_asserts --- .../hosts/aftereffects/test_publish_in_aftereffects.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py index e0f6b3e48e..ec0280e7c6 100644 --- a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py +++ b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py @@ -68,7 +68,7 @@ class TestPublishInAfterEffects(PublishTest): def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" print("test_db_asserts") - assert 3 == dbcon.count_documents({"type": "version"}), \ + assert 2 == dbcon.count_documents({"type": "version"}), \ "Not expected no of versions" assert 0 == dbcon.count_documents({"type": "version", @@ -88,7 +88,7 @@ class TestPublishInAfterEffects(PublishTest): "name": "reviewTesttask"}), \ "reviewTesttask subset must be present" - assert 6 == dbcon.count_documents({"type": "representation"}), \ + assert 4 == dbcon.count_documents({"type": "representation"}), \ "Not expected no of representations" assert 1 == dbcon.count_documents({"type": "representation", From 02717fac4eaaf5dbd17ddcf86e59bc58b136a8ff Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 14 Dec 2021 11:15:51 +0100 Subject: [PATCH 210/341] Update error msg format Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../plugins/publish/collect_extension_version.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openpype/hosts/aftereffects/plugins/publish/collect_extension_version.py b/openpype/hosts/aftereffects/plugins/publish/collect_extension_version.py index 3352fd21f0..4e74252043 100644 --- a/openpype/hosts/aftereffects/plugins/publish/collect_extension_version.py +++ b/openpype/hosts/aftereffects/plugins/publish/collect_extension_version.py @@ -48,9 +48,9 @@ class CollectExtensionVersion(pyblish.api.ContextPlugin): expected_version = found[0][1] if expected_version != installed_version: - msg = "Expected version '{}' found '{}'\n".format( - expected_version, installed_version) - msg += "Please update your installed extension, it might not work " - msg += "properly." + msg = ( + "Expected version '{}' found '{}'\n Please update" + " your installed extension, it might not work properly." + ).format(expected_version, installed_version) raise ValueError(msg) From aa232b43268cd38a0162eb6af6d50a8d4b1d998c Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 14 Dec 2021 11:13:02 +0100 Subject: [PATCH 211/341] OP-2053 - fix counts in db_asserts --- .../hosts/aftereffects/test_publish_in_aftereffects.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py index e0f6b3e48e..c3ca9aa9d2 100644 --- a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py +++ b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py @@ -68,7 +68,7 @@ class TestPublishInAfterEffects(PublishTest): def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" print("test_db_asserts") - assert 3 == dbcon.count_documents({"type": "version"}), \ + assert 2 == dbcon.count_documents({"type": "version"}), \ "Not expected no of versions" assert 0 == dbcon.count_documents({"type": "version", @@ -81,18 +81,18 @@ class TestPublishInAfterEffects(PublishTest): "modelMain subset must be present" assert 1 == dbcon.count_documents({"type": "subset", - "name": "workfileTesttask"}), \ + "name": "workfileTest_task"}), \ "workfileTesttask subset must be present" assert 1 == dbcon.count_documents({"type": "subset", "name": "reviewTesttask"}), \ "reviewTesttask subset must be present" - assert 6 == dbcon.count_documents({"type": "representation"}), \ + assert 4 == dbcon.count_documents({"type": "representation"}), \ "Not expected no of representations" assert 1 == dbcon.count_documents({"type": "representation", - "context.subset": "imageMainBackgroundcopy", # noqa E501 + "context.subset": "renderTestTaskDefault", # noqa E501 "context.ext": "png"}), \ "Not expected no of representations with ext 'png'" From 0ff12fdaeeb6629e74a26cd56c06fa4d459ddd8d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 14 Dec 2021 11:48:23 +0100 Subject: [PATCH 212/341] cache object types --- .../default_modules/ftrack/lib/avalon_sync.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/lib/avalon_sync.py b/openpype/modules/default_modules/ftrack/lib/avalon_sync.py index 3ba874281a..392b64eb57 100644 --- a/openpype/modules/default_modules/ftrack/lib/avalon_sync.py +++ b/openpype/modules/default_modules/ftrack/lib/avalon_sync.py @@ -360,6 +360,8 @@ class SyncEntitiesFactory: self._subsets_by_parent_id = None self._changeability_by_mongo_id = None + self._object_types_by_name = None + self.all_filtered_entities = {} self.filtered_ids = [] self.not_selected_ids = [] @@ -651,6 +653,18 @@ class SyncEntitiesFactory: self._bubble_changeability(list(self.subsets_by_parent_id.keys())) return self._changeability_by_mongo_id + @property + def object_types_by_name(self): + if self._object_types_by_name is None: + object_types_by_name = self.session.query( + "select id, name from ObjectType" + ).all() + self._object_types_by_name = { + object_type["name"]: object_type + for object_type in object_types_by_name + } + return self._object_types_by_name + @property def all_ftrack_names(self): """ @@ -880,10 +894,7 @@ class SyncEntitiesFactory: custom_attrs, hier_attrs = get_openpype_attr( self.session, query_keys=self.cust_attr_query_keys ) - ent_types = self.session.query("select id, name from ObjectType").all() - ent_types_by_name = { - ent_type["name"]: ent_type["id"] for ent_type in ent_types - } + ent_types_by_name = self.object_types_by_name # Custom attribute types cust_attr_types = self.session.query( "select id, name from CustomAttributeType" From 00b143066ea99ffabd32ea7bf32b711d4f07a849 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 14 Dec 2021 11:48:55 +0100 Subject: [PATCH 213/341] check existence of entity type on recreation and use Folder if not found --- .../modules/default_modules/ftrack/lib/avalon_sync.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/openpype/modules/default_modules/ftrack/lib/avalon_sync.py b/openpype/modules/default_modules/ftrack/lib/avalon_sync.py index 392b64eb57..f58eb91485 100644 --- a/openpype/modules/default_modules/ftrack/lib/avalon_sync.py +++ b/openpype/modules/default_modules/ftrack/lib/avalon_sync.py @@ -2502,7 +2502,13 @@ class SyncEntitiesFactory: parent_entity = self.entities_dict[parent_id]["entity"] _name = av_entity["name"] - _type = av_entity["data"].get("entityType", "folder") + _type = av_entity["data"].get("entityType") + # Check existence of object type + if _type and _type not in self.object_types_by_name: + _type = None + + if not _type: + _type = "Folder" self.log.debug(( "Re-ceating deleted entity {} <{}>" From f1ab759a6179efbd96f4db17957351f60984fb04 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 14 Dec 2021 13:28:00 +0100 Subject: [PATCH 214/341] OP-2151 - replaced PATH usage with oiio path for maketx utility --- openpype/hosts/maya/plugins/publish/extract_look.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_look.py b/openpype/hosts/maya/plugins/publish/extract_look.py index 2407617b6f..92587c2910 100644 --- a/openpype/hosts/maya/plugins/publish/extract_look.py +++ b/openpype/hosts/maya/plugins/publish/extract_look.py @@ -55,8 +55,11 @@ def maketx(source, destination, *args): str: Output of `maketx` command. """ + from openpype.lib import get_oiio_tools_path + + maketx_path = get_oiio_tools_path("maketx") cmd = [ - "maketx", + maketx_path, "-v", # verbose "-u", # update mode # unpremultiply before conversion (recommended when alpha present) From 209dbea1a5b83aa61047b072923565fe238c56ff Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 14 Dec 2021 13:44:21 +0100 Subject: [PATCH 215/341] OP-2151 - added logging and exception if oiio utilities not found --- openpype/hosts/maya/plugins/publish/extract_look.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openpype/hosts/maya/plugins/publish/extract_look.py b/openpype/hosts/maya/plugins/publish/extract_look.py index 92587c2910..953539f65c 100644 --- a/openpype/hosts/maya/plugins/publish/extract_look.py +++ b/openpype/hosts/maya/plugins/publish/extract_look.py @@ -58,6 +58,11 @@ def maketx(source, destination, *args): from openpype.lib import get_oiio_tools_path maketx_path = get_oiio_tools_path("maketx") + if not os.path.exists(maketx_path): + print( + "OIIO tool not found in {}".format(maketx_path)) + raise AssertionError("OIIO tool not found") + cmd = [ maketx_path, "-v", # verbose From ebbd43bd5fd6d587f6e88558df5512d8c9e971d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= <33513211+antirotor@users.noreply.github.com> Date: Tue, 14 Dec 2021 13:46:34 +0100 Subject: [PATCH 216/341] Update Dockerfile.centos7 Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- Dockerfile.centos7 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.centos7 b/Dockerfile.centos7 index ce60ea7fb1..736a42663c 100644 --- a/Dockerfile.centos7 +++ b/Dockerfile.centos7 @@ -42,7 +42,7 @@ RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.n ncurses-devel \ qt5-qtbase-devel \ xcb-util-wm \ - xcb-util-renderutil + xcb-util-renderutil \ && yum clean all # we need to build our own patchelf From 12282ca19cb931ea5499b0665a74e6e830df6eb4 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 14 Dec 2021 14:54:23 +0100 Subject: [PATCH 217/341] nuke: baking representations was not additive --- .../nuke/plugins/publish/extract_review_data_mov.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/nuke/plugins/publish/extract_review_data_mov.py b/openpype/hosts/nuke/plugins/publish/extract_review_data_mov.py index 261fca6583..32962b57a6 100644 --- a/openpype/hosts/nuke/plugins/publish/extract_review_data_mov.py +++ b/openpype/hosts/nuke/plugins/publish/extract_review_data_mov.py @@ -42,6 +42,7 @@ class ExtractReviewDataMov(openpype.api.Extractor): # generate data with anlib.maintained_selection(): + generated_repres = [] for o_name, o_data in self.outputs.items(): f_families = o_data["filter"]["families"] f_task_types = o_data["filter"]["task_types"] @@ -112,11 +113,13 @@ class ExtractReviewDataMov(openpype.api.Extractor): }) else: data = exporter.generate_mov(**o_data) + generated_repres.extend(data["representations"]) - self.log.info(data["representations"]) + self.log.info(generated_repres) - # assign to representations - instance.data["representations"] += data["representations"] + if generated_repres: + # assign to representations + instance.data["representations"] += generated_repres self.log.debug( "_ representations: {}".format( From b57a09b430a8dd1e09db2fa97cf37685b0ca9aa8 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 14 Dec 2021 15:16:48 +0100 Subject: [PATCH 218/341] OP-2019 - revert unwanted commit --- openpype/hooks/pre_foundry_apps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hooks/pre_foundry_apps.py b/openpype/hooks/pre_foundry_apps.py index 70554cbedb..85f68c6b60 100644 --- a/openpype/hooks/pre_foundry_apps.py +++ b/openpype/hooks/pre_foundry_apps.py @@ -13,7 +13,7 @@ class LaunchFoundryAppsWindows(PreLaunchHook): # Should be as last hook because must change launch arguments to string order = 1000 - app_groups = ["nuke", "nukex", "hiero", "nukestudio", "aftereffects"] + app_groups = ["nuke", "nukex", "hiero", "nukestudio"] platforms = ["windows"] def execute(self): From 450dbf3fd25225b4d94a6f92f6404ccb5a0c80c3 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 14 Dec 2021 15:29:42 +0100 Subject: [PATCH 219/341] OP-2053 - fix PS after merge --- .../photoshop/test_publish_in_photoshop.py | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py index b52af48009..f7bedf6069 100644 --- a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py +++ b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py @@ -44,32 +44,6 @@ class TestPublishInPhotoshop(PhotoshopTestClass): TIMEOUT = 120 # publish timeout - @pytest.fixture(scope="module") - def last_workfile_path(self, download_test_data): - """Get last_workfile_path from source data. - - Maya expects workfile in proper folder, so copy is done first. - """ - src_path = os.path.join(download_test_data, - "input", - "workfile", - "test_project_test_asset_TestTask_v001.psd") - dest_folder = os.path.join(download_test_data, - self.PROJECT, - self.ASSET, - "work", - self.TASK) - os.makedirs(dest_folder) - dest_path = os.path.join(dest_folder, - "test_project_test_asset_TestTask_v001.psd") - shutil.copy(src_path, dest_path) - - yield dest_path - - @pytest.fixture(scope="module") - def startup_scripts(self, monkeypatch_session, download_test_data): - """Points Maya to userSetup file from input data""" - pass def test_db_asserts(self, dbcon, publish_finished): """Host and input data dependent expected results in DB.""" From 2c66a1eab2527a34029fc639fc475efa2dc77896 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 14 Dec 2021 15:31:03 +0100 Subject: [PATCH 220/341] OP-2053 - fix PS after merge --- tests/integration/hosts/photoshop/test_publish_in_photoshop.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py index f7bedf6069..32053cd9d4 100644 --- a/tests/integration/hosts/photoshop/test_publish_in_photoshop.py +++ b/tests/integration/hosts/photoshop/test_publish_in_photoshop.py @@ -37,7 +37,7 @@ class TestPublishInPhotoshop(PhotoshopTestClass): ] APP = "photoshop" - # keep empty to locate latest installed variant or explicit + # keep empty to locate latest installed variant or explicit APP_VARIANT = "" APP_NAME = "{}/{}".format(APP, APP_VARIANT) From 68b99391acecec1a208468df98026506db7ac95a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 14 Dec 2021 15:35:39 +0100 Subject: [PATCH 221/341] modified message --- openpype/tools/settings/settings/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/tools/settings/settings/base.py b/openpype/tools/settings/settings/base.py index 9016e63970..b10c958880 100644 --- a/openpype/tools/settings/settings/base.py +++ b/openpype/tools/settings/settings/base.py @@ -340,7 +340,7 @@ class BaseWidget(QtWidgets.QWidget): # TODO better message title = "Applying values failed" - msg = "Using values from project \"{}\" failed.".format( + msg = "Applying values from project \"{}\" failed.".format( project_name ) detail_msg = "".join( From 7dc4264d834dd4262a5ebeeca5552a0d9c1c5062 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 14 Dec 2021 16:46:25 +0100 Subject: [PATCH 222/341] flame otio export wip --- openpype/hosts/flame/otio/flame_export.py | 186 ++++++++++++++-------- 1 file changed, 118 insertions(+), 68 deletions(-) diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index af4322e3d9..13199fe6c7 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -5,17 +5,16 @@ import os import re import sys import ast -from compiler.ast import flatten + import opentimelineio as otio from . import utils -import hiero.core -import hiero.ui +import flame self = sys.modules[__name__] -self.track_types = { - hiero.core.VideoTrack: otio.schema.TrackKind.Video, - hiero.core.AudioTrack: otio.schema.TrackKind.Audio -} +# self.track_types = { +# hiero.core.VideoTrack: otio.schema.TrackKind.Video, +# hiero.core.AudioTrack: otio.schema.TrackKind.Audio +# } self.project_fps = None self.marker_color_map = { "magenta": otio.schema.MarkerColor.MAGENTA, @@ -29,17 +28,17 @@ self.timeline = None self.include_tags = True -def get_current_hiero_project(remove_untitled=False): - projects = flatten(hiero.core.projects()) - if not remove_untitled: - return next(iter(projects)) - - # if remove_untitled - for proj in projects: - if "Untitled" in proj.name(): - proj.close() +def flatten(_list): + for item in _list: + if isinstance(item, (list, tuple)): + for sub_item in flatten(item): + yield sub_item else: - return proj + yield item + + +def get_current_flame_project(): + return flame.project.current_project def create_otio_rational_time(frame, fps): @@ -313,7 +312,7 @@ def create_otio_gap(gap_start, clip_start, tl_start_frame, fps): def _create_otio_timeline(): - project = get_current_hiero_project(remove_untitled=False) + project = get_current_flame_project() metadata = _get_metadata(self.timeline) metadata.update({ @@ -375,73 +374,124 @@ def add_otio_metadata(otio_item, media_source, **kwargs): for key, value in metadata.items(): otio_item.metadata.update({key: value}) +def get_segment_attributes(segment, frame_rate): + print(segment.attributes) + if str(segment.name)[1:-1] == "": + return None -def create_otio_timeline(): + # get clip frame duration + record_duration = str(segment.record_duration)[1:-1] + clip_duration = utils.timecode_to_frames( + record_duration, frame_rate) - def set_prev_item(itemindex, track_item): - # Add Gap if needed - if itemindex == 0: - # if it is first track item at track then add - # it to previouse item - return track_item + # populate shot source metadata + shot_description = "" + for attr in ["tape_name", "source_name", "head", + "tail", "file_path"]: + if not hasattr(segment, attr): + continue + _value = getattr(segment, attr) + _label = attr.replace("_", " ").capitalize() + row = "{}: {}\n".format(_label, _value) + shot_description += row + + # Add timeline segment to tree + clip_data = { + "clip_name": str(segment.name)[1:-1], + "clip_duration": str(clip_duration), + "clip_comment": str(segment.comment)[1:-1], + "shot_description": shot_description + } + print(clip_data) + +def create_otio_timeline(selection): + process_timeline = None + process_segments = [] + + if len(selection) == 1: + if isinstance(selection[0], flame.PySequence): + process_timeline = selection[0] + else: + for item in selection: + if not isinstance(item, flame.PySegment): + continue + process_segments.append(item) + + if process_timeline: + print("___________________timeline__________________") + frame_rate = float(str(process_timeline.frame_rate)[:-4]) + print(frame_rate) + for ver in process_timeline.versions: + for tracks in ver.tracks: + for segment in tracks.segments: + # process all segments + get_segment_attributes(segment, frame_rate) + + if process_segments: + print("___________________segments__________________") + # get segments sequence parent + track = process_segments[0].parent + version = track.parent + flame_timeline = version.parent + frame_rate = float(str(flame_timeline.frame_rate)[:-4]) + + for segment in process_segments: + get_segment_attributes(segment, frame_rate) - else: - # get previouse item - return track_item.parent().items()[itemindex - 1] # get current timeline - self.timeline = hiero.ui.activeSequence() - self.project_fps = self.timeline.framerate().toFloat() + # self.timeline = hiero.ui.activeSequence() + # self.project_fps = self.timeline.framerate().toFloat() - # convert timeline to otio - otio_timeline = _create_otio_timeline() + # # convert timeline to otio + # otio_timeline = _create_otio_timeline() - # loop all defined track types - for track in self.timeline.items(): - # skip if track is disabled - if not track.isEnabled(): - continue + # # loop all defined track types + # for track in self.timeline.items(): + # # skip if track is disabled + # if not track.isEnabled(): + # continue - # convert track to otio - otio_track = create_otio_track( - type(track), track.name()) + # # convert track to otio + # otio_track = create_otio_track( + # type(track), track.name()) - for itemindex, track_item in enumerate(track): - # Add Gap if needed - if itemindex == 0: - # if it is first track item at track then add - # it to previouse item - prev_item = track_item + # for itemindex, track_item in enumerate(track): + # # Add Gap if needed + # if itemindex == 0: + # # if it is first track item at track then add + # # it to previouse item + # prev_item = track_item - else: - # get previouse item - prev_item = track_item.parent().items()[itemindex - 1] + # else: + # # get previouse item + # prev_item = track_item.parent().items()[itemindex - 1] - # calculate clip frame range difference from each other - clip_diff = track_item.timelineIn() - prev_item.timelineOut() + # # calculate clip frame range difference from each other + # clip_diff = track_item.timelineIn() - prev_item.timelineOut() - # add gap if first track item is not starting - # at first timeline frame - if itemindex == 0 and track_item.timelineIn() > 0: - add_otio_gap(track_item, otio_track, 0) + # # add gap if first track item is not starting + # # at first timeline frame + # if itemindex == 0 and track_item.timelineIn() > 0: + # add_otio_gap(track_item, otio_track, 0) - # or add gap if following track items are having - # frame range differences from each other - elif itemindex and clip_diff != 1: - add_otio_gap(track_item, otio_track, prev_item.timelineOut()) + # # or add gap if following track items are having + # # frame range differences from each other + # elif itemindex and clip_diff != 1: + # add_otio_gap(track_item, otio_track, prev_item.timelineOut()) - # create otio clip and add it to track - otio_clip = create_otio_clip(track_item) - otio_track.append(otio_clip) + # # create otio clip and add it to track + # otio_clip = create_otio_clip(track_item) + # otio_track.append(otio_clip) - # Add tags as markers - if self.include_tags: - create_otio_markers(otio_track, track) + # # Add tags as markers + # if self.include_tags: + # create_otio_markers(otio_track, track) - # add track to otio timeline - otio_timeline.tracks.append(otio_track) + # # add track to otio timeline + # otio_timeline.tracks.append(otio_track) - return otio_timeline + # return otio_timeline def write_to_file(otio_timeline, path): From f1b158e7e55ee9e452c99c16a7e7e800ab80c2ec Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 14 Dec 2021 17:54:41 +0100 Subject: [PATCH 223/341] added new script and executable to be used as mid process for starting applications on linux --- linux_app_launcher.py | 43 +++++++++++++++++++++++++++++++++++++++++++ setup.py | 19 +++++++++++++++++-- 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 linux_app_launcher.py diff --git a/linux_app_launcher.py b/linux_app_launcher.py new file mode 100644 index 0000000000..274ef8b82b --- /dev/null +++ b/linux_app_launcher.py @@ -0,0 +1,43 @@ +"""Launch process that is not child process of python or OpenPype. + +This is written for linux distributions where process tree may affect what +is when closed or blocked to be closed. +""" + +import os +import sys +import subprocess +import json + + +def main(input_json_path): + """Read launch arguments from json file and launch the process. + + Expected that json contains "args" key with string or list of strings. + + Arguments are converted to string using `list2cmdline`. At the end is added + `&` which will cause that launched process is detached and running as + "background" process. + + ## Notes + @iLLiCiT: This should be possible to do with 'disown' or double forking but + I didn't find a way how to do it properly. Disown didn't work as + expected for me and double forking killed parent process which is + unexpected too. + """ + with open(input_json_path, "r") as stream: + data = json.load(stream) + + args = data["args"] + if isinstance(args, list): + args = subprocess.list2cmdline(args) + + # Run the command as background process + shell_cmd = args + " &" + os.system(shell_cmd) + sys.exit(0) + + +if __name__ == "__main__": + # Expect that last argument is path to a json with launch args information + main(sys.argv[-1]) diff --git a/setup.py b/setup.py index cd3ed4f82c..de4887ae3c 100644 --- a/setup.py +++ b/setup.py @@ -3,6 +3,7 @@ import os import sys import re +import platform from pathlib import Path from cx_Freeze import setup, Executable @@ -18,8 +19,13 @@ with open(openpype_root / "openpype" / "version.py") as fp: version_match = re.search(r"(\d+\.\d+.\d+).*", version["__version__"]) __version__ = version_match.group(1) +low_platform_name = platform.system().lower() +IS_WINDOWS = low_platform_name == "windows" +IS_LINUX = low_platform_name == "linux" +IS_MACOS = low_platform_name == "darwin" + base = None -if sys.platform == "win32": +if IS_WINDOWS: base = "Win32GUI" # ----------------------------------------------------------------------- @@ -71,7 +77,7 @@ include_files = [ "README.md" ] -if sys.platform == "win32": +if IS_WINDOWS: install_requires.extend([ # `pywin32` packages "win32ctypes", @@ -103,6 +109,15 @@ executables = [ Executable("start.py", base=None, target_name="openpype_console", icon=icon_path.as_posix()) ] +if IS_LINUX: + executables.append( + Executable( + "linux_app_launcher.py", + base=None, + target_name="linux_app_launcher", + icon=icon_path.as_posix() + ) + ) setup( name="OpenPype", From 3e096f41bedfff6e8cd39c482ce64aac55da1766 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 14 Dec 2021 18:00:07 +0100 Subject: [PATCH 224/341] added helper function to return linux app launcher arguments --- openpype/lib/__init__.py | 2 ++ openpype/lib/execute.py | 46 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/openpype/lib/__init__.py b/openpype/lib/__init__.py index efd2cddf7e..936ee9ea8d 100644 --- a/openpype/lib/__init__.py +++ b/openpype/lib/__init__.py @@ -25,6 +25,7 @@ from .env_tools import ( from .terminal import Terminal from .execute import ( get_pype_execute_args, + get_linux_launcher_args, execute, run_subprocess, path_to_subprocess_arg, @@ -174,6 +175,7 @@ terminal = Terminal __all__ = [ "get_pype_execute_args", + "get_linux_launcher_args", "execute", "run_subprocess", "path_to_subprocess_arg", diff --git a/openpype/lib/execute.py b/openpype/lib/execute.py index ad77b2f899..a36a1f0bf4 100644 --- a/openpype/lib/execute.py +++ b/openpype/lib/execute.py @@ -1,7 +1,6 @@ import os -import shlex import subprocess -import platform +import distutils.spawn from .log import PypeLogger as Logger @@ -175,3 +174,46 @@ def get_pype_execute_args(*args): pype_args.extend(args) return pype_args + + +def get_linux_launcher_args(*args): + """Path to application mid process executable. + + This function should be able as arguments are different when used + from code and build. + + It is possible that this function is used in OpenPype build which does + not have yet the new executable. In that case 'None' is returned. + + Args: + args (iterable): List of additional arguments added after executable + argument. + + Returns: + list: Executables with possible positional argument to script when + called from code. + """ + filename = "linux_app_launcher" + openpype_executable = os.environ["OPENPYPE_EXECUTABLE"] + + executable_filename = os.path.basename(openpype_executable) + if "python" in executable_filename.lower(): + script_path = os.path.join( + os.environ["OPENPYPE_ROOT"], + "{}.py".format(filename) + ) + launch_args = [openpype_executable, script_path] + else: + new_executable = os.path.join( + os.path.dirname(openpype_executable), + filename + ) + executable_path = distutils.spawn.find_executable(new_executable) + if executable_path is None: + return None + launch_args = [executable_path] + + if args: + launch_args.extend(args) + + return launch_args From 731a9f4dd961022fbb7633abc3a6437acda4b01c Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 14 Dec 2021 18:00:49 +0100 Subject: [PATCH 225/341] flame extract otio wip --- openpype/hosts/flame/otio/flame_export.py | 82 ++++++++++--------- openpype/hosts/flame/otio/utils.py | 2 +- .../plugins/publish/collect_test_selection.py | 5 +- 3 files changed, 47 insertions(+), 42 deletions(-) diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index 13199fe6c7..818cd4586f 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -5,10 +5,15 @@ import os import re import sys import ast - +import logging import opentimelineio as otio from . import utils import flame +from pprint import pformat + +reload(utils) + +log = logging.getLogger(__name__) self = sys.modules[__name__] # self.track_types = { @@ -375,70 +380,67 @@ def add_otio_metadata(otio_item, media_source, **kwargs): otio_item.metadata.update({key: value}) def get_segment_attributes(segment, frame_rate): - print(segment.attributes) + log.info(segment) + # log.info(dir(segment)) + # log.info(segment.attributes) + # track = segment.parent + # log.info("track: {}".format(track)) + # log.info(dir(track)) + # log.info(track.attributes) + # log.info(track.name) + if str(segment.name)[1:-1] == "": return None - # get clip frame duration - record_duration = str(segment.record_duration)[1:-1] - clip_duration = utils.timecode_to_frames( - record_duration, frame_rate) - - # populate shot source metadata - shot_description = "" - for attr in ["tape_name", "source_name", "head", - "tail", "file_path"]: - if not hasattr(segment, attr): - continue - _value = getattr(segment, attr) - _label = attr.replace("_", " ").capitalize() - row = "{}: {}\n".format(_label, _value) - shot_description += row - # Add timeline segment to tree clip_data = { "clip_name": str(segment.name)[1:-1], - "clip_duration": str(clip_duration), "clip_comment": str(segment.comment)[1:-1], - "shot_description": shot_description + "tape_name": str(segment.tape_name), + "source_name": str(segment.source_name), + "file_path": str(segment.file_path) } - print(clip_data) + + # populate shot source metadata + segment_attrs = [ + "record_duration", "record_in", "record_out", + "source_duration", "source_in", "source_out" + ] + segment_attrs_data = {} + for attr in segment_attrs: + if not hasattr(segment, attr): + continue + _value = getattr(segment, attr) + segment_attrs_data[attr] = _value + _value = str(_value)[1:-1] + clip_data[attr] = utils.timecode_to_frames( + _value, frame_rate) + + clip_data["segment_attrs"] = segment_attrs_data + + log.info(pformat(clip_data)) def create_otio_timeline(selection): process_timeline = None - process_segments = [] if len(selection) == 1: if isinstance(selection[0], flame.PySequence): process_timeline = selection[0] else: - for item in selection: - if not isinstance(item, flame.PySegment): - continue - process_segments.append(item) + track = selection[0].parent + version = track.parent + process_timeline = version.parent if process_timeline: - print("___________________timeline__________________") + log.info("___________________timeline__________________") frame_rate = float(str(process_timeline.frame_rate)[:-4]) - print(frame_rate) + log.info(frame_rate) for ver in process_timeline.versions: for tracks in ver.tracks: for segment in tracks.segments: # process all segments get_segment_attributes(segment, frame_rate) - if process_segments: - print("___________________segments__________________") - # get segments sequence parent - track = process_segments[0].parent - version = track.parent - flame_timeline = version.parent - frame_rate = float(str(flame_timeline.frame_rate)[:-4]) - - for segment in process_segments: - get_segment_attributes(segment, frame_rate) - - # get current timeline # self.timeline = hiero.ui.activeSequence() # self.project_fps = self.timeline.framerate().toFloat() diff --git a/openpype/hosts/flame/otio/utils.py b/openpype/hosts/flame/otio/utils.py index 4c5d46bd51..2d927957c9 100644 --- a/openpype/hosts/flame/otio/utils.py +++ b/openpype/hosts/flame/otio/utils.py @@ -3,7 +3,7 @@ import opentimelineio as otio def timecode_to_frames(timecode, framerate): - rt = otio.opentime.from_timecode(timecode, 24) + rt = otio.opentime.from_timecode(timecode, framerate) return int(otio.opentime.to_frames(rt)) diff --git a/openpype/hosts/flame/plugins/publish/collect_test_selection.py b/openpype/hosts/flame/plugins/publish/collect_test_selection.py index 6534894f2e..dbbbc2f0bd 100644 --- a/openpype/hosts/flame/plugins/publish/collect_test_selection.py +++ b/openpype/hosts/flame/plugins/publish/collect_test_selection.py @@ -1,6 +1,8 @@ import pyblish.api import openpype.hosts.flame as opflame +from openpype.hosts.flame.otio import flame_export as otio_export import flame +reload(otio_export) @pyblish.api.log class CollectTestSelection(pyblish.api.ContextPlugin): @@ -12,4 +14,5 @@ class CollectTestSelection(pyblish.api.ContextPlugin): hosts = ["flame"] def process(self, context): - self.log.info(opflame.selection) \ No newline at end of file + self.log.info(opflame.selection) + otio_export.create_otio_timeline(opflame.selection) \ No newline at end of file From 0b9f9450f6e4a9a63543c491e4a18443a4aebdc2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 14 Dec 2021 18:02:29 +0100 Subject: [PATCH 226/341] use new function on application launch --- openpype/lib/applications.py | 47 ++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/openpype/lib/applications.py b/openpype/lib/applications.py index 6eb44a9694..97cc213646 100644 --- a/openpype/lib/applications.py +++ b/openpype/lib/applications.py @@ -1,8 +1,8 @@ import os import sys -import re import copy import json +import tempfile import platform import collections import inspect @@ -37,6 +37,7 @@ from .python_module_tools import ( modules_from_path, classes_from_module ) +from .execute import get_linux_launcher_args _logger = None @@ -921,6 +922,46 @@ class ApplicationLaunchContext: def manager(self): return self.application.manager + def _run_process(self): + # Windows and MacOS have easier process start + low_platform = platform.system().lower() + if low_platform in ("windows", "darwin"): + return subprocess.Popen(self.launch_args, **self.kwargs) + + # Linux uses mid process + # - it is possible that the mid process executable is not + # available for this version of OpenPype in that case use standard + # launch + launch_args = get_linux_launcher_args() + if launch_args is None: + return subprocess.Popen(self.launch_args, **self.kwargs) + + # Prepare data that will be passed to midprocess + # - store arguments to a json and pass path to json as last argument + json_data = { + "args": self.launch_args + } + # Create temp file + json_temp = tempfile.NamedTemporaryFile( + mode="w", prefix="op_app_args", suffix=".json", delete=False + ) + json_temp.close() + json_temp_filpath = json_temp.name + with open(json_temp_filpath, "w") as stream: + json.dump(json_data, stream) + + launch_args.append(json_temp_filpath) + + # Create mid-process which will launch application + process = subprocess.Popen(launch_args, **self.kwargs) + # Wait until the process finishes + # - This is important! The process would stay in "open" state. + process.wait() + # Remove the temp file + os.remove(json_temp_filpath) + # Return process which is already terminated + return process + def launch(self): """Collect data for new process and then create it. @@ -957,8 +998,10 @@ class ApplicationLaunchContext: self.app_name, args_len_str, args ) ) + self.launch_args = args + # Run process - self.process = subprocess.Popen(args, **self.kwargs) + self.process = self._run_process() # Process post launch hooks for postlaunch_hook in self.postlaunch_hooks: From 512bf2e3f66c2523eedd52f2434ea2b84b5772be Mon Sep 17 00:00:00 2001 From: OpenPype Date: Wed, 15 Dec 2021 03:41:30 +0000 Subject: [PATCH 227/341] [Automated] Bump version --- CHANGELOG.md | 54 ++++++++++++++------------------------------- openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 18 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 860e26c59c..dde8138629 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,12 @@ # Changelog -## [3.7.0-nightly.7](https://github.com/pypeclub/OpenPype/tree/HEAD) +## [3.7.0-nightly.8](https://github.com/pypeclub/OpenPype/tree/HEAD) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...HEAD) -### 📖 Documentation +**Deprecated:** -- docs\[website\]: Add Ellipse Studio \(logo\) as an OpenPype contributor [\#2324](https://github.com/pypeclub/OpenPype/pull/2324) +- General: Default modules hierarchy n2 [\#2368](https://github.com/pypeclub/OpenPype/pull/2368) **🆕 New features** @@ -14,27 +14,31 @@ **🚀 Enhancements** +- Ftrack: Check existence of object type on recreation [\#2404](https://github.com/pypeclub/OpenPype/pull/2404) +- Flame: moving `utility\_scripts` to api folder also with `scripts` [\#2385](https://github.com/pypeclub/OpenPype/pull/2385) +- Centos 7 dependency compatibility [\#2384](https://github.com/pypeclub/OpenPype/pull/2384) +- Enhancement: Settings: Use project settings values from another project [\#2382](https://github.com/pypeclub/OpenPype/pull/2382) +- Blender 3: Support auto install for new blender version [\#2377](https://github.com/pypeclub/OpenPype/pull/2377) +- Maya add render image path to settings [\#2375](https://github.com/pypeclub/OpenPype/pull/2375) - Settings: Webpublisher in hosts enum [\#2367](https://github.com/pypeclub/OpenPype/pull/2367) - Hiero: python3 compatibility [\#2365](https://github.com/pypeclub/OpenPype/pull/2365) - Burnins: Be able recognize mxf OPAtom format [\#2361](https://github.com/pypeclub/OpenPype/pull/2361) +- Maya: Add is\_static\_image\_plane and is\_in\_all\_views option in imagePlaneLoader [\#2356](https://github.com/pypeclub/OpenPype/pull/2356) - Local settings: Copyable studio paths [\#2349](https://github.com/pypeclub/OpenPype/pull/2349) - Assets Widget: Clear model on project change [\#2345](https://github.com/pypeclub/OpenPype/pull/2345) - General: OpenPype default modules hierarchy [\#2338](https://github.com/pypeclub/OpenPype/pull/2338) - General: FFprobe error exception contain original error message [\#2328](https://github.com/pypeclub/OpenPype/pull/2328) - Resolve: Add experimental button to menu [\#2325](https://github.com/pypeclub/OpenPype/pull/2325) -- Hiero: Add experimental tools action [\#2323](https://github.com/pypeclub/OpenPype/pull/2323) - Input links: Cleanup and unification of differences [\#2322](https://github.com/pypeclub/OpenPype/pull/2322) - General: Don't validate vendor bin with executing them [\#2317](https://github.com/pypeclub/OpenPype/pull/2317) - General: Multilayer EXRs support [\#2315](https://github.com/pypeclub/OpenPype/pull/2315) -- General: Run process log stderr as info log level [\#2309](https://github.com/pypeclub/OpenPype/pull/2309) - General: Reduce vendor imports [\#2305](https://github.com/pypeclub/OpenPype/pull/2305) -- Tools: Cleanup of unused classes [\#2304](https://github.com/pypeclub/OpenPype/pull/2304) -- Project Manager: Added ability to delete project [\#2298](https://github.com/pypeclub/OpenPype/pull/2298) -- Ftrack: Synchronize input links [\#2287](https://github.com/pypeclub/OpenPype/pull/2287) -- Nuke: extract baked review videos presets [\#2248](https://github.com/pypeclub/OpenPype/pull/2248) **🐛 Bug fixes** +- General: Fix access to environments from default settings [\#2403](https://github.com/pypeclub/OpenPype/pull/2403) +- Fix: Placeholder Input color set fix [\#2399](https://github.com/pypeclub/OpenPype/pull/2399) +- Settings: Fix state change of wrapper label [\#2396](https://github.com/pypeclub/OpenPype/pull/2396) - Flame: fix ftrack publisher [\#2381](https://github.com/pypeclub/OpenPype/pull/2381) - hiero: solve custom ocio path [\#2379](https://github.com/pypeclub/OpenPype/pull/2379) - hiero: fix workio and flatten [\#2378](https://github.com/pypeclub/OpenPype/pull/2378) @@ -53,21 +57,16 @@ - Timers Manager: Disable auto stop timer on linux platform [\#2334](https://github.com/pypeclub/OpenPype/pull/2334) - nuke: bake preset single input exception [\#2331](https://github.com/pypeclub/OpenPype/pull/2331) - Hiero: fixing multiple templates at a hierarchy parent [\#2330](https://github.com/pypeclub/OpenPype/pull/2330) -- Fix - provider icons are pulled from a folder [\#2326](https://github.com/pypeclub/OpenPype/pull/2326) -- InputLinks: Typo in "inputLinks" key [\#2314](https://github.com/pypeclub/OpenPype/pull/2314) -- Deadline timeout and logging [\#2312](https://github.com/pypeclub/OpenPype/pull/2312) -- nuke: do not multiply representation on class method [\#2311](https://github.com/pypeclub/OpenPype/pull/2311) -- Workfiles tool: Fix task formatting [\#2306](https://github.com/pypeclub/OpenPype/pull/2306) -- Delivery: Fix delivery paths created on windows [\#2302](https://github.com/pypeclub/OpenPype/pull/2302) -- Maya: Deadline - fix limit groups [\#2295](https://github.com/pypeclub/OpenPype/pull/2295) - Royal Render: Fix plugin order and OpenPype auto-detection [\#2291](https://github.com/pypeclub/OpenPype/pull/2291) -- Alternate site for site sync doesnt work for sequences [\#2284](https://github.com/pypeclub/OpenPype/pull/2284) **Merged pull requests:** +- \[Fix\]\[MAYA\] Handle message type attribute within CollectLook [\#2394](https://github.com/pypeclub/OpenPype/pull/2394) +- Add validator to check correct version of extension for PS and AE [\#2387](https://github.com/pypeclub/OpenPype/pull/2387) - Linux : flip updating submodules logic [\#2357](https://github.com/pypeclub/OpenPype/pull/2357) - Update of avalon-core [\#2346](https://github.com/pypeclub/OpenPype/pull/2346) - Maya: configurable model top level validation [\#2321](https://github.com/pypeclub/OpenPype/pull/2321) +- Create test publish class for After Effects [\#2270](https://github.com/pypeclub/OpenPype/pull/2270) ## [3.6.4](https://github.com/pypeclub/OpenPype/tree/3.6.4) (2021-11-23) @@ -93,42 +92,21 @@ - Tools: Assets widget [\#2265](https://github.com/pypeclub/OpenPype/pull/2265) - SceneInventory: Choose loader in asset switcher [\#2262](https://github.com/pypeclub/OpenPype/pull/2262) -- Style: New fonts in OpenPype style [\#2256](https://github.com/pypeclub/OpenPype/pull/2256) -- Tools: Tasks widget [\#2251](https://github.com/pypeclub/OpenPype/pull/2251) -- Tools: Creator in OpenPype [\#2244](https://github.com/pypeclub/OpenPype/pull/2244) **🐛 Bug fixes** - Tools: Parenting of tools in Nuke and Hiero [\#2266](https://github.com/pypeclub/OpenPype/pull/2266) - limiting validator to specific editorial hosts [\#2264](https://github.com/pypeclub/OpenPype/pull/2264) - Tools: Select Context dialog attribute fix [\#2261](https://github.com/pypeclub/OpenPype/pull/2261) -- Maya: Render publishing fails on linux [\#2260](https://github.com/pypeclub/OpenPype/pull/2260) -- LookAssigner: Fix tool reopen [\#2259](https://github.com/pypeclub/OpenPype/pull/2259) -- Standalone: editorial not publishing thumbnails on all subsets [\#2258](https://github.com/pypeclub/OpenPype/pull/2258) -- Burnins: Support mxf metadata [\#2247](https://github.com/pypeclub/OpenPype/pull/2247) ## [3.6.1](https://github.com/pypeclub/OpenPype/tree/3.6.1) (2021-11-16) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/CI/3.6.1-nightly.1...3.6.1) -**🐛 Bug fixes** - -- Loader doesn't allow changing of version before loading [\#2254](https://github.com/pypeclub/OpenPype/pull/2254) - ## [3.6.0](https://github.com/pypeclub/OpenPype/tree/3.6.0) (2021-11-15) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/CI/3.6.0-nightly.6...3.6.0) -**🚀 Enhancements** - -- Tools: SceneInventory in OpenPype [\#2255](https://github.com/pypeclub/OpenPype/pull/2255) -- Tools: Subset manager in OpenPype [\#2243](https://github.com/pypeclub/OpenPype/pull/2243) - -**🐛 Bug fixes** - -- Ftrack: Sync project ftrack id cache issue [\#2250](https://github.com/pypeclub/OpenPype/pull/2250) -- Ftrack: Session creation and Prepare project [\#2245](https://github.com/pypeclub/OpenPype/pull/2245) - ## [3.5.0](https://github.com/pypeclub/OpenPype/tree/3.5.0) (2021-10-17) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/CI/3.5.0-nightly.8...3.5.0) diff --git a/openpype/version.py b/openpype/version.py index 95cd7a285f..06bc20ae43 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.7.0-nightly.7" +__version__ = "3.7.0-nightly.8" diff --git a/pyproject.toml b/pyproject.toml index d994569fa7..e5d552bb3b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.7.0-nightly.7" # OpenPype +version = "3.7.0-nightly.8" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From cab1f32a5ac4e1d5dac51f4e47f419b2381b33ae Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 15 Dec 2021 10:41:14 +0100 Subject: [PATCH 228/341] abstracting get timeline to lib --- openpype/hosts/flame/__init__.py | 4 +-- openpype/hosts/flame/api/lib.py | 26 +++++++++++++---- openpype/hosts/flame/otio/flame_export.py | 29 ++++++------------- .../plugins/publish/collect_test_selection.py | 8 +++-- 4 files changed, 38 insertions(+), 29 deletions(-) diff --git a/openpype/hosts/flame/__init__.py b/openpype/hosts/flame/__init__.py index f04b73baba..da28170679 100644 --- a/openpype/hosts/flame/__init__.py +++ b/openpype/hosts/flame/__init__.py @@ -19,7 +19,7 @@ from .api.lib import ( maintain_current_timeline, get_project_manager, get_current_project, - get_current_timeline, + get_current_sequence, create_bin, ) @@ -88,7 +88,7 @@ __all__ = [ "maintain_current_timeline", "get_project_manager", "get_current_project", - "get_current_timeline", + "get_current_sequence", "create_bin", # menu diff --git a/openpype/hosts/flame/api/lib.py b/openpype/hosts/flame/api/lib.py index 89e020b329..941f6b7d75 100644 --- a/openpype/hosts/flame/api/lib.py +++ b/openpype/hosts/flame/api/lib.py @@ -220,10 +220,10 @@ def maintain_current_timeline(to_timeline, from_timeline=None): timeline2 >>> with maintain_current_timeline(to_timeline): - ... print(get_current_timeline().GetName()) + ... print(get_current_sequence().GetName()) timeline2 - >>> print(get_current_timeline().GetName()) + >>> print(get_current_sequence().GetName()) timeline1 """ # todo: this is still Resolve's implementation @@ -256,9 +256,25 @@ def get_current_project(): return -def get_current_timeline(new=False): - # TODO: get_current_timeline - return +def get_current_sequence(selection): + import flame + + process_timeline = None + + if len(selection) == 1: + if isinstance(selection[0], flame.PySequence): + process_timeline = selection[0] + else: + process_segment = None + for segment in selection: + if isinstance(segment, flame.PySegment): + process_segment = segment + break + track = process_segment.parent + version = track.parent + process_timeline = version.parent + + return process_timeline def create_bin(name, root=None): diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index 818cd4586f..9fb219a545 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -8,6 +8,7 @@ import ast import logging import opentimelineio as otio from . import utils + import flame from pprint import pformat @@ -420,26 +421,14 @@ def get_segment_attributes(segment, frame_rate): log.info(pformat(clip_data)) -def create_otio_timeline(selection): - process_timeline = None - - if len(selection) == 1: - if isinstance(selection[0], flame.PySequence): - process_timeline = selection[0] - else: - track = selection[0].parent - version = track.parent - process_timeline = version.parent - - if process_timeline: - log.info("___________________timeline__________________") - frame_rate = float(str(process_timeline.frame_rate)[:-4]) - log.info(frame_rate) - for ver in process_timeline.versions: - for tracks in ver.tracks: - for segment in tracks.segments: - # process all segments - get_segment_attributes(segment, frame_rate) +def create_otio_timeline(sequence): + frame_rate = float(str(sequence.frame_rate)[:-4]) + log.info(frame_rate) + for ver in sequence.versions: + for tracks in ver.tracks: + for segment in tracks.segments: + # process all segments + get_segment_attributes(segment, frame_rate) # get current timeline # self.timeline = hiero.ui.activeSequence() diff --git a/openpype/hosts/flame/plugins/publish/collect_test_selection.py b/openpype/hosts/flame/plugins/publish/collect_test_selection.py index dbbbc2f0bd..cefd9ee7cf 100644 --- a/openpype/hosts/flame/plugins/publish/collect_test_selection.py +++ b/openpype/hosts/flame/plugins/publish/collect_test_selection.py @@ -1,7 +1,7 @@ import pyblish.api import openpype.hosts.flame as opflame from openpype.hosts.flame.otio import flame_export as otio_export -import flame +from pprint import pformat reload(otio_export) @pyblish.api.log @@ -15,4 +15,8 @@ class CollectTestSelection(pyblish.api.ContextPlugin): def process(self, context): self.log.info(opflame.selection) - otio_export.create_otio_timeline(opflame.selection) \ No newline at end of file + + sequence = opflame.get_current_sequence(opflame.selection) + otio_timeline = otio_export.create_otio_timeline(sequence) + + self.log.info(pformat(otio_timeline)) \ No newline at end of file From 1ffdf801cc51e7da1eae496cff1342ddb1f99def Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 15 Dec 2021 14:52:04 +0100 Subject: [PATCH 229/341] otio export modul wip --- openpype/hosts/flame/otio/flame_export.py | 122 ++++++++++++++-------- 1 file changed, 79 insertions(+), 43 deletions(-) diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index 9fb219a545..e7735be701 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -21,7 +21,7 @@ self = sys.modules[__name__] # hiero.core.VideoTrack: otio.schema.TrackKind.Video, # hiero.core.AudioTrack: otio.schema.TrackKind.Audio # } -self.project_fps = None +self.fps = None self.marker_color_map = { "magenta": otio.schema.MarkerColor.MAGENTA, "red": otio.schema.MarkerColor.RED, @@ -30,7 +30,6 @@ self.marker_color_map = { "cyan": otio.schema.MarkerColor.CYAN, "blue": otio.schema.MarkerColor.BLUE, } -self.timeline = None self.include_tags = True @@ -151,7 +150,7 @@ def create_otio_reference(clip): file_head = media_source.filenameHead() is_sequence = not media_source.singleFile() frame_duration = media_source.duration() - fps = utils.get_rate(clip) or self.project_fps + fps = utils.get_rate(clip) or self.fps extension = os.path.splitext(path)[-1] if is_sequence: @@ -231,7 +230,7 @@ def create_otio_markers(otio_item, item): # Hiero adds this tag to a lot of clips continue - frame_rate = utils.get_rate(item) or self.project_fps + frame_rate = utils.get_rate(item) or self.fps marked_range = otio.opentime.TimeRange( start_time=otio.opentime.RationalTime( @@ -278,7 +277,7 @@ def create_otio_clip(track_item): duration = int(track_item.duration()) - fps = utils.get_rate(track_item) or self.project_fps + fps = utils.get_rate(track_item) or self.fps name = track_item.name() media_reference = create_otio_reference(clip) @@ -317,28 +316,28 @@ def create_otio_gap(gap_start, clip_start, tl_start_frame, fps): ) -def _create_otio_timeline(): +def _create_otio_timeline(sequence): project = get_current_flame_project() - metadata = _get_metadata(self.timeline) + metadata = _get_metadata(sequence) metadata.update({ - "openpype.timeline.width": int(self.timeline.format().width()), - "openpype.timeline.height": int(self.timeline.format().height()), - "openpype.timeline.pixelAspect": int(self.timeline.format().pixelAspect()), # noqa - "openpype.project.useOCIOEnvironmentOverride": project.useOCIOEnvironmentOverride(), # noqa - "openpype.project.lutSetting16Bit": project.lutSetting16Bit(), - "openpype.project.lutSetting8Bit": project.lutSetting8Bit(), - "openpype.project.lutSettingFloat": project.lutSettingFloat(), - "openpype.project.lutSettingLog": project.lutSettingLog(), - "openpype.project.lutSettingViewer": project.lutSettingViewer(), - "openpype.project.lutSettingWorkingSpace": project.lutSettingWorkingSpace(), # noqa - "openpype.project.lutUseOCIOForExport": project.lutUseOCIOForExport(), - "openpype.project.ocioConfigName": project.ocioConfigName(), - "openpype.project.ocioConfigPath": project.ocioConfigPath() + "openpype.timeline.width": int(sequence.width), + "openpype.timeline.height": int(sequence.height), + "openpype.timeline.pixelAspect": 1, # noqa + # "openpype.project.useOCIOEnvironmentOverride": project.useOCIOEnvironmentOverride(), # noqa + # "openpype.project.lutSetting16Bit": project.lutSetting16Bit(), + # "openpype.project.lutSetting8Bit": project.lutSetting8Bit(), + # "openpype.project.lutSettingFloat": project.lutSettingFloat(), + # "openpype.project.lutSettingLog": project.lutSettingLog(), + # "openpype.project.lutSettingViewer": project.lutSettingViewer(), + # "openpype.project.lutSettingWorkingSpace": project.lutSettingWorkingSpace(), # noqa + # "openpype.project.lutUseOCIOForExport": project.lutUseOCIOForExport(), + # "openpype.project.ocioConfigName": project.ocioConfigName(), + # "openpype.project.ocioConfigPath": project.ocioConfigPath() }) start_time = create_otio_rational_time( - self.timeline.timecodeStart(), self.project_fps) + self.timeline.timecodeStart(), self.fps) return otio.schema.Timeline( name=self.timeline.name(), @@ -362,7 +361,7 @@ def add_otio_gap(track_item, otio_track, prev_out): gap = otio.opentime.TimeRange( duration=otio.opentime.RationalTime( gap_length, - self.project_fps + self.fps ) ) otio_gap = otio.schema.Gap(source_range=gap) @@ -382,24 +381,17 @@ def add_otio_metadata(otio_item, media_source, **kwargs): def get_segment_attributes(segment, frame_rate): log.info(segment) - # log.info(dir(segment)) - # log.info(segment.attributes) - # track = segment.parent - # log.info("track: {}".format(track)) - # log.info(dir(track)) - # log.info(track.attributes) - # log.info(track.name) if str(segment.name)[1:-1] == "": return None # Add timeline segment to tree clip_data = { - "clip_name": str(segment.name)[1:-1], - "clip_comment": str(segment.comment)[1:-1], + "name": str(segment.name)[1:-1], + "comment": str(segment.comment)[1:-1], "tape_name": str(segment.tape_name), "source_name": str(segment.source_name), - "file_path": str(segment.file_path) + "fpath": str(segment.file_path) } # populate shot source metadata @@ -417,25 +409,69 @@ def get_segment_attributes(segment, frame_rate): clip_data[attr] = utils.timecode_to_frames( _value, frame_rate) - clip_data["segment_attrs"] = segment_attrs_data + clip_data["segment_timecodes"] = segment_attrs_data log.info(pformat(clip_data)) + return clip_data + +def get_track_attributes(track, frame_rate): + log.info(track) + log.info(dir(track)) + log.info(track.attributes) + + if len(track.segments) == 0: + return None + + # Add timeline segment to tree + track_data = { + "name": str(track.name)[1:-1] + } + + # # populate shot source metadata + # segment_attrs = [ + # "record_duration", "record_in", "record_out", + # "source_duration", "source_in", "source_out" + # ] + # segment_attrs_data = {} + # for attr in segment_attrs: + # if not hasattr(segment, attr): + # continue + # _value = getattr(segment, attr) + # segment_attrs_data[attr] = _value + # _value = str(_value)[1:-1] + # clip_data[attr] = utils.timecode_to_frames( + # _value, frame_rate) + + # clip_data["segment_timecodes"] = segment_attrs_data + + log.info(pformat(track_data)) + return track_data def create_otio_timeline(sequence): - frame_rate = float(str(sequence.frame_rate)[:-4]) - log.info(frame_rate) - for ver in sequence.versions: - for tracks in ver.tracks: - for segment in tracks.segments: - # process all segments - get_segment_attributes(segment, frame_rate) + log.info(dir(sequence)) + log.info(sequence.attributes) # get current timeline - # self.timeline = hiero.ui.activeSequence() - # self.project_fps = self.timeline.framerate().toFloat() + self.fps = float(str(sequence.frame_rate)[:-4]) # # convert timeline to otio - # otio_timeline = _create_otio_timeline() + otio_timeline = _create_otio_timeline(sequence) + + # create otio tracks and clips + for ver in sequence.versions: + for track in ver.tracks: + track_data = get_track_attributes(track, self.fps) + if not track_data: + continue + for segment in track.segments: + # process all segments + clip_data = get_segment_attributes( + segment, self.fps) + # create otio clip + # create otio reference + # create otio marker + # create otio metadata + # # loop all defined track types # for track in self.timeline.items(): From bda4a3c934b6947bf3a15cc7adfd2f5c7cd7a783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20LORRAIN?= Date: Wed, 15 Dec 2021 15:47:33 +0100 Subject: [PATCH 230/341] Fix build regex and improve filter for create_zip cache cleaning --- tools/create_zip.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/create_zip.ps1 b/tools/create_zip.ps1 index c27857b480..99e4b39550 100644 --- a/tools/create_zip.ps1 +++ b/tools/create_zip.ps1 @@ -96,9 +96,9 @@ if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { Write-Host ">>> " -NoNewline -ForegroundColor green Write-Host "Cleaning cache files ... " -NoNewline -Get-ChildItem $openpype_root -Filter "*.pyc" -Force -Recurse | Where-Object { $_.FullName -inotmatch 'build' } | Remove-Item -Force -Get-ChildItem $openpype_root -Filter "*.pyo" -Force -Recurse | Where-Object { $_.FullName -inotmatch 'build' } | Remove-Item -Force -Get-ChildItem $openpype_root -Filter "__pycache__" -Force -Recurse| Where-Object { $_.FullName -inotmatch 'build' } | Remove-Item -Force -Recurse +Get-ChildItem $openpype_root -Filter "__pycache__" -Force -Recurse| Where-Object {( $_.FullName -inotmatch '\\build\\' ) -and ( $_.FullName -inotmatch '\\.venv' )} | Remove-Item -Force -Recurse +Get-ChildItem $openpype_root -Filter "*.pyc" -Force -Recurse | Where-Object {( $_.FullName -inotmatch '\\build\\' ) -and ( $_.FullName -inotmatch '\.venv' )} | Remove-Item -Force +Get-ChildItem $openpype_root -Filter "*.pyo" -Force -Recurse | Where-Object {( $_.FullName -inotmatch '\\build\\' ) -and ( $_.FullName -inotmatch '\.venv' )} | Remove-Item -Force Write-Host "OK" -ForegroundColor green Write-Host ">>> " -NoNewline -ForegroundColor green From 654aedbca1cdff4ac39a4c33e2cfbdc4f47753ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20LORRAIN?= Date: Wed, 15 Dec 2021 16:13:26 +0100 Subject: [PATCH 231/341] fix regex typo --- tools/create_zip.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/create_zip.ps1 b/tools/create_zip.ps1 index 99e4b39550..e33445d1fa 100644 --- a/tools/create_zip.ps1 +++ b/tools/create_zip.ps1 @@ -97,8 +97,8 @@ if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { Write-Host ">>> " -NoNewline -ForegroundColor green Write-Host "Cleaning cache files ... " -NoNewline Get-ChildItem $openpype_root -Filter "__pycache__" -Force -Recurse| Where-Object {( $_.FullName -inotmatch '\\build\\' ) -and ( $_.FullName -inotmatch '\\.venv' )} | Remove-Item -Force -Recurse -Get-ChildItem $openpype_root -Filter "*.pyc" -Force -Recurse | Where-Object {( $_.FullName -inotmatch '\\build\\' ) -and ( $_.FullName -inotmatch '\.venv' )} | Remove-Item -Force -Get-ChildItem $openpype_root -Filter "*.pyo" -Force -Recurse | Where-Object {( $_.FullName -inotmatch '\\build\\' ) -and ( $_.FullName -inotmatch '\.venv' )} | Remove-Item -Force +Get-ChildItem $openpype_root -Filter "*.pyc" -Force -Recurse | Where-Object {( $_.FullName -inotmatch '\\build\\' ) -and ( $_.FullName -inotmatch '\\.venv' )} | Remove-Item -Force +Get-ChildItem $openpype_root -Filter "*.pyo" -Force -Recurse | Where-Object {( $_.FullName -inotmatch '\\build\\' ) -and ( $_.FullName -inotmatch '\\.venv' )} | Remove-Item -Force Write-Host "OK" -ForegroundColor green Write-Host ">>> " -NoNewline -ForegroundColor green From 6909db9d7ca3c1ff057c8bf4ec6ff950ca2361fc Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 15 Dec 2021 23:04:51 +0100 Subject: [PATCH 232/341] otio export module wip --- openpype/hosts/flame/api/lib.py | 12 +- openpype/hosts/flame/otio/flame_export.py | 241 +++++++++------------- openpype/hosts/flame/otio/utils.py | 46 ++--- 3 files changed, 121 insertions(+), 178 deletions(-) diff --git a/openpype/hosts/flame/api/lib.py b/openpype/hosts/flame/api/lib.py index 941f6b7d75..fba2d8f5c8 100644 --- a/openpype/hosts/flame/api/lib.py +++ b/openpype/hosts/flame/api/lib.py @@ -258,21 +258,23 @@ def get_current_project(): def get_current_sequence(selection): import flame + def segment_to_sequence(_segment): + track = _segment.parent + version = track.parent + return version.parent process_timeline = None if len(selection) == 1: if isinstance(selection[0], flame.PySequence): process_timeline = selection[0] + if isinstance(selection[0], flame.PySegment): + process_timeline = segment_to_sequence(selection[0]) else: - process_segment = None for segment in selection: if isinstance(segment, flame.PySegment): - process_segment = segment + process_timeline = segment_to_sequence(segment) break - track = process_segment.parent - version = track.parent - process_timeline = version.parent return process_timeline diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index e7735be701..e55e72f55e 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -17,11 +17,13 @@ reload(utils) log = logging.getLogger(__name__) self = sys.modules[__name__] -# self.track_types = { -# hiero.core.VideoTrack: otio.schema.TrackKind.Video, -# hiero.core.AudioTrack: otio.schema.TrackKind.Audio -# } +self.track_types = { + "video": otio.schema.TrackKind.Video, + "audio": otio.schema.TrackKind.Audio +} self.fps = None +self.seq_frame_start = None + self.marker_color_map = { "magenta": otio.schema.MarkerColor.MAGENTA, "red": otio.schema.MarkerColor.RED, @@ -59,10 +61,12 @@ def create_otio_time_range(start_frame, frame_duration, fps): duration=create_otio_rational_time(frame_duration, fps) ) - def _get_metadata(item): if hasattr(item, 'metadata'): - return {key: value for key, value in dict(item.metadata()).items()} + log.debug(item.metadata) + if not item.metadata: + return {} + return {key: value for key, value in dict(item.metadata)} return {} @@ -136,22 +140,23 @@ def create_time_effects(otio_clip, track_item): otio_clip.effects.append(otio_effect) -def create_otio_reference(clip): - metadata = _get_metadata(clip) - media_source = clip.mediaSource() +def create_otio_reference(clip_data): + metadata = _get_metadata(clip_data) # get file info for path and start frame - file_info = media_source.fileinfos().pop() - frame_start = file_info.startFrame() - path = file_info.filename() + frame_start = 0 + path = clip_data["fpath"] + file_name = os.path.basename(path) + file_head, extension = os.path.splitext(file_name) # get padding and other file infos - padding = media_source.filenamePadding() - file_head = media_source.filenameHead() - is_sequence = not media_source.singleFile() - frame_duration = media_source.duration() - fps = utils.get_rate(clip) or self.fps - extension = os.path.splitext(path)[-1] + is_sequence = padding = utils.get_padding_from_path(path) + if is_sequence: + padding_pattern = re.compile(r"[._](\d+)[.]") + number = re.findall(padding_pattern, path).pop() + file_head = file_name.split(number)[:-1] + + frame_duration = clip_data["source_duration"] if is_sequence: metadata.update({ @@ -159,13 +164,6 @@ def create_otio_reference(clip): "padding": padding }) - # add resolution metadata - metadata.update({ - "openpype.source.colourtransform": clip.sourceMediaColourTransform(), - "openpype.source.width": int(media_source.width()), - "openpype.source.height": int(media_source.height()), - "openpype.source.pixelAspect": float(media_source.pixelAspect()) - }) otio_ex_ref_item = None @@ -180,11 +178,11 @@ def create_otio_reference(clip): name_suffix=extension, start_frame=frame_start, frame_zero_padding=padding, - rate=fps, + rate=self.fps, available_range=create_otio_time_range( frame_start, frame_duration, - fps + self.fps ) ) except AttributeError: @@ -198,12 +196,12 @@ def create_otio_reference(clip): available_range=create_otio_time_range( frame_start, frame_duration, - fps + self.fps ) ) # add metadata to otio item - add_otio_metadata(otio_ex_ref_item, media_source, **metadata) + # add_otio_metadata(otio_ex_ref_item, media_source, **metadata) return otio_ex_ref_item @@ -269,26 +267,17 @@ def create_otio_markers(otio_item, item): otio_item.markers.append(marker) -def create_otio_clip(track_item): - clip = track_item.source() - speed = track_item.playbackSpeed() - # flip if speed is in minus - source_in = track_item.sourceIn() if speed > 0 else track_item.sourceOut() +def create_otio_clip(clip_data): - duration = int(track_item.duration()) - - fps = utils.get_rate(track_item) or self.fps - name = track_item.name() - - media_reference = create_otio_reference(clip) + media_reference = create_otio_reference(clip_data) source_range = create_otio_time_range( - int(source_in), - int(duration), - fps + clip_data["source_in"], + clip_data["record_duration"], + self.fps ) otio_clip = otio.schema.Clip( - name=name, + name=clip_data["name"], source_range=source_range, media_reference=media_reference ) @@ -336,12 +325,12 @@ def _create_otio_timeline(sequence): # "openpype.project.ocioConfigPath": project.ocioConfigPath() }) - start_time = create_otio_rational_time( - self.timeline.timecodeStart(), self.fps) + rt_start_time = create_otio_rational_time( + self.seq_frame_start, self.fps) return otio.schema.Timeline( - name=self.timeline.name(), - global_start_time=start_time, + name=sequence.name, + global_start_time=rt_start_time, metadata=metadata ) @@ -353,8 +342,8 @@ def create_otio_track(track_type, track_name): ) -def add_otio_gap(track_item, otio_track, prev_out): - gap_length = track_item.timelineIn() - prev_out +def add_otio_gap(clip_data, otio_track, prev_out): + gap_length = clip_data["record_in"] - prev_out if prev_out != 0: gap_length -= 1 @@ -379,7 +368,7 @@ def add_otio_metadata(otio_item, media_source, **kwargs): for key, value in metadata.items(): otio_item.metadata.update({key: value}) -def get_segment_attributes(segment, frame_rate): +def get_segment_attributes(segment): log.info(segment) if str(segment.name)[1:-1] == "": @@ -391,7 +380,8 @@ def get_segment_attributes(segment, frame_rate): "comment": str(segment.comment)[1:-1], "tape_name": str(segment.tape_name), "source_name": str(segment.source_name), - "fpath": str(segment.file_path) + "fpath": str(segment.file_path), + "segment": segment } # populate shot source metadata @@ -406,119 +396,84 @@ def get_segment_attributes(segment, frame_rate): _value = getattr(segment, attr) segment_attrs_data[attr] = _value _value = str(_value)[1:-1] - clip_data[attr] = utils.timecode_to_frames( - _value, frame_rate) + + if attr in ["record_in", "record_out"]: + # exclude timeline start + frame = utils.timecode_to_frames( + _value, self.fps) + clip_data[attr] = frame - self.seq_frame_start + else: + clip_data[attr] = utils.timecode_to_frames( + _value, self.fps) clip_data["segment_timecodes"] = segment_attrs_data log.info(pformat(clip_data)) return clip_data -def get_track_attributes(track, frame_rate): - log.info(track) - log.info(dir(track)) - log.info(track.attributes) - - if len(track.segments) == 0: - return None - - # Add timeline segment to tree - track_data = { - "name": str(track.name)[1:-1] - } - - # # populate shot source metadata - # segment_attrs = [ - # "record_duration", "record_in", "record_out", - # "source_duration", "source_in", "source_out" - # ] - # segment_attrs_data = {} - # for attr in segment_attrs: - # if not hasattr(segment, attr): - # continue - # _value = getattr(segment, attr) - # segment_attrs_data[attr] = _value - # _value = str(_value)[1:-1] - # clip_data[attr] = utils.timecode_to_frames( - # _value, frame_rate) - - # clip_data["segment_timecodes"] = segment_attrs_data - - log.info(pformat(track_data)) - return track_data - def create_otio_timeline(sequence): log.info(dir(sequence)) log.info(sequence.attributes) # get current timeline self.fps = float(str(sequence.frame_rate)[:-4]) - + self.seq_frame_start = utils.timecode_to_frames( + str(sequence.start_time), self.fps) # # convert timeline to otio otio_timeline = _create_otio_timeline(sequence) # create otio tracks and clips for ver in sequence.versions: for track in ver.tracks: - track_data = get_track_attributes(track, self.fps) - if not track_data: - continue - for segment in track.segments: - # process all segments - clip_data = get_segment_attributes( - segment, self.fps) - # create otio clip - # create otio reference + if len(track.segments) == 0 and track.hidden: + return None + + # convert track to otio + otio_track = create_otio_track( + "video", str(track.name)[1:-1]) + + segments_ordered = { + itemindex: get_segment_attributes(segment) + for itemindex, segment in enumerate( + track.segments) + } + + for itemindex, segment_data in segments_ordered.items(): + # Add Gap if needed + if itemindex == 0: + # if it is first track item at track then add + # it to previouse item + prev_item = segment_data + + else: + # get previouse item + prev_item = segments_ordered[itemindex - 1] + + # calculate clip frame range difference from each other + clip_diff = segment_data["record_in"] - prev_item["record_out"] + + # add gap if first track item is not starting + # at first timeline frame + if itemindex == 0 and segment_data["record_in"] > 0: + add_otio_gap(segment_data, otio_track, 0) + + # or add gap if following track items are having + # frame range differences from each other + elif itemindex and clip_diff != 1: + add_otio_gap( + segment_data, otio_track, prev_item["record_out"]) + + # create otio clip and add it to track + otio_clip = create_otio_clip(segment_data) + otio_track.append(otio_clip) + # create otio marker # create otio metadata + # add track to otio timeline + otio_timeline.tracks.append(otio_track) - # # loop all defined track types - # for track in self.timeline.items(): - # # skip if track is disabled - # if not track.isEnabled(): - # continue - - # # convert track to otio - # otio_track = create_otio_track( - # type(track), track.name()) - - # for itemindex, track_item in enumerate(track): - # # Add Gap if needed - # if itemindex == 0: - # # if it is first track item at track then add - # # it to previouse item - # prev_item = track_item - - # else: - # # get previouse item - # prev_item = track_item.parent().items()[itemindex - 1] - - # # calculate clip frame range difference from each other - # clip_diff = track_item.timelineIn() - prev_item.timelineOut() - - # # add gap if first track item is not starting - # # at first timeline frame - # if itemindex == 0 and track_item.timelineIn() > 0: - # add_otio_gap(track_item, otio_track, 0) - - # # or add gap if following track items are having - # # frame range differences from each other - # elif itemindex and clip_diff != 1: - # add_otio_gap(track_item, otio_track, prev_item.timelineOut()) - - # # create otio clip and add it to track - # otio_clip = create_otio_clip(track_item) - # otio_track.append(otio_clip) - - # # Add tags as markers - # if self.include_tags: - # create_otio_markers(otio_track, track) - - # # add track to otio timeline - # otio_timeline.tracks.append(otio_track) - - # return otio_timeline + return otio_timeline def write_to_file(otio_timeline, path): diff --git a/openpype/hosts/flame/otio/utils.py b/openpype/hosts/flame/otio/utils.py index 2d927957c9..57c8e4fecd 100644 --- a/openpype/hosts/flame/otio/utils.py +++ b/openpype/hosts/flame/otio/utils.py @@ -28,17 +28,17 @@ def get_reformated_path(path, padded=True): type: string with reformated path Example: - get_reformated_path("plate.[0001-1008].exr") > plate.%04d.exr + get_reformated_path("plate.1001.exr") > plate.%04d.exr """ - if "%" in path: - padding_pattern = r"(\d+)" - padding = int(re.findall(padding_pattern, path).pop()) - num_pattern = r"(%\d+d)" - if padded: - path = re.sub(num_pattern, "%0{}d".format(padding), path) - else: - path = re.sub(num_pattern, "%d", path) + num_pattern = re.compile(r"[._](\d+)[.]") + padding = get_padding_from_path(path) + + if padded: + path = re.sub(num_pattern, "%0{}d".format(padding), path) + else: + path = re.sub(num_pattern, "%d", path) + return path @@ -53,28 +53,14 @@ def get_padding_from_path(path): int: padding number Example: - get_padding_from_path("plate.[0001-1008].exr") > 4 + get_padding_from_path("plate.0001.exr") > 4 """ - padding_pattern = "(\\d+)(?=-)" - if "[" in path: - return len(re.findall(padding_pattern, path).pop()) + padding_pattern = re.compile(r"[._](\d+)[.]") - return None + found = re.findall(padding_pattern, path).pop() - -def get_rate(item): - if not hasattr(item, 'framerate'): - return None - - num, den = item.framerate().toRational() - - try: - rate = float(num) / float(den) - except ZeroDivisionError: - return None - - if rate.is_integer(): - return rate - - return round(rate, 4) + if found: + return len(found) + else: + return None \ No newline at end of file From 8b2edb368bf38c7465a648e868bf331767efb4f4 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 12:23:36 +0100 Subject: [PATCH 233/341] added 2022 variant to aftereffects settings schemas --- .../system_schema/host_settings/schema_aftereffects.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openpype/settings/entities/schemas/system_schema/host_settings/schema_aftereffects.json b/openpype/settings/entities/schemas/system_schema/host_settings/schema_aftereffects.json index 6c36a9bb8a..334c9aa235 100644 --- a/openpype/settings/entities/schemas/system_schema/host_settings/schema_aftereffects.json +++ b/openpype/settings/entities/schemas/system_schema/host_settings/schema_aftereffects.json @@ -36,6 +36,11 @@ "app_variant_label": "2021", "app_variant": "2021", "variant_skip_paths": ["use_python_2"] + }, + { + "app_variant_label": "2022", + "app_variant": "2022", + "variant_skip_paths": ["use_python_2"] } ] } From 5989af258a6733ab9dcfdf5da8338a416a9671e8 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 16 Dec 2021 12:38:38 +0100 Subject: [PATCH 234/341] export otio modul wip --- openpype/hosts/flame/otio/flame_export.py | 192 ++++++++++-------- openpype/hosts/flame/otio/utils.py | 44 +++- .../plugins/publish/collect_test_selection.py | 5 +- 3 files changed, 147 insertions(+), 94 deletions(-) diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index e55e72f55e..f01c600637 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -63,7 +63,6 @@ def create_otio_time_range(start_frame, frame_duration, fps): def _get_metadata(item): if hasattr(item, 'metadata'): - log.debug(item.metadata) if not item.metadata: return {} return {key: value for key, value in dict(item.metadata)} @@ -140,72 +139,6 @@ def create_time_effects(otio_clip, track_item): otio_clip.effects.append(otio_effect) -def create_otio_reference(clip_data): - metadata = _get_metadata(clip_data) - - # get file info for path and start frame - frame_start = 0 - path = clip_data["fpath"] - file_name = os.path.basename(path) - file_head, extension = os.path.splitext(file_name) - - # get padding and other file infos - is_sequence = padding = utils.get_padding_from_path(path) - if is_sequence: - padding_pattern = re.compile(r"[._](\d+)[.]") - number = re.findall(padding_pattern, path).pop() - file_head = file_name.split(number)[:-1] - - frame_duration = clip_data["source_duration"] - - if is_sequence: - metadata.update({ - "isSequence": True, - "padding": padding - }) - - - otio_ex_ref_item = None - - if is_sequence: - # if it is file sequence try to create `ImageSequenceReference` - # the OTIO might not be compatible so return nothing and do it old way - try: - dirname = os.path.dirname(path) - otio_ex_ref_item = otio.schema.ImageSequenceReference( - target_url_base=dirname + os.sep, - name_prefix=file_head, - name_suffix=extension, - start_frame=frame_start, - frame_zero_padding=padding, - rate=self.fps, - available_range=create_otio_time_range( - frame_start, - frame_duration, - self.fps - ) - ) - except AttributeError: - pass - - if not otio_ex_ref_item: - reformat_path = utils.get_reformated_path(path, padded=False) - # in case old OTIO or video file create `ExternalReference` - otio_ex_ref_item = otio.schema.ExternalReference( - target_url=reformat_path, - available_range=create_otio_time_range( - frame_start, - frame_duration, - self.fps - ) - ) - - # add metadata to otio item - # add_otio_metadata(otio_ex_ref_item, media_source, **metadata) - - return otio_ex_ref_item - - def get_marker_color(tag): icon = tag.icon() pat = r'icons:Tag(?P\w+)\.\w+' @@ -267,11 +200,82 @@ def create_otio_markers(otio_item, item): otio_item.markers.append(marker) +def create_otio_reference(clip_data): + metadata = _get_metadata(clip_data) + + # get file info for path and start frame + frame_start = 0 + path = clip_data["fpath"] + file_name = os.path.basename(path) + file_head, extension = os.path.splitext(file_name) + + # get padding and other file infos + log.debug("_ path: {}".format(path)) + + is_sequence = padding = utils.get_frame_from_path(path) + if is_sequence: + number = utils.get_frame_from_path(path) + file_head = file_name.split(number)[:-1] + frame_start = int(number) + + frame_duration = clip_data["source_duration"] + + if is_sequence: + metadata.update({ + "isSequence": True, + "padding": padding + }) + + + otio_ex_ref_item = None + + if is_sequence: + # if it is file sequence try to create `ImageSequenceReference` + # the OTIO might not be compatible so return nothing and do it old way + try: + dirname = os.path.dirname(path) + otio_ex_ref_item = otio.schema.ImageSequenceReference( + target_url_base=dirname + os.sep, + name_prefix=file_head, + name_suffix=extension, + start_frame=frame_start, + frame_zero_padding=padding, + rate=self.fps, + available_range=create_otio_time_range( + frame_start, + frame_duration, + self.fps + ) + ) + except AttributeError: + pass + + if not otio_ex_ref_item: + reformat_path = utils.get_reformated_path(path, padded=False) + # in case old OTIO or video file create `ExternalReference` + otio_ex_ref_item = otio.schema.ExternalReference( + target_url=reformat_path, + available_range=create_otio_time_range( + frame_start, + frame_duration, + self.fps + ) + ) + + # add metadata to otio item + # add_otio_metadata(otio_ex_ref_item, media_source, **metadata) + + return otio_ex_ref_item + + def create_otio_clip(clip_data): media_reference = create_otio_reference(clip_data) + # calculate source in + first_frame = utils.get_frame_from_path(clip_data["fpath"]) or 0 + source_in = int(clip_data["source_in"]) - int(first_frame) source_range = create_otio_time_range( - clip_data["source_in"], + source_in, clip_data["record_duration"], self.fps ) @@ -282,15 +286,15 @@ def create_otio_clip(clip_data): media_reference=media_reference ) - # Add tags as markers - if self.include_tags: - create_otio_markers(otio_clip, track_item) - create_otio_markers(otio_clip, track_item.source()) + # # Add tags as markers + # if self.include_tags: + # create_otio_markers(otio_clip, track_item) + # create_otio_markers(otio_clip, track_item.source()) - # only if video - if not clip.mediaSource().hasAudio(): - # Add effects to clips - create_time_effects(otio_clip, track_item) + # # only if video + # if not clip.mediaSource().hasAudio(): + # # Add effects to clips + # create_time_effects(otio_clip, track_item) return otio_clip @@ -329,7 +333,7 @@ def _create_otio_timeline(sequence): self.seq_frame_start, self.fps) return otio.schema.Timeline( - name=sequence.name, + name=str(sequence.name)[1:-1], global_start_time=rt_start_time, metadata=metadata ) @@ -369,8 +373,6 @@ def add_otio_metadata(otio_item, media_source, **kwargs): otio_item.metadata.update({key: value}) def get_segment_attributes(segment): - log.info(segment) - if str(segment.name)[1:-1] == "": return None @@ -401,14 +403,13 @@ def get_segment_attributes(segment): # exclude timeline start frame = utils.timecode_to_frames( _value, self.fps) - clip_data[attr] = frame - self.seq_frame_start + clip_data[attr] = (frame - self.seq_frame_start) + 1 else: clip_data[attr] = utils.timecode_to_frames( _value, self.fps) clip_data["segment_timecodes"] = segment_attrs_data - log.info(pformat(clip_data)) return clip_data def create_otio_timeline(sequence): @@ -419,8 +420,10 @@ def create_otio_timeline(sequence): self.fps = float(str(sequence.frame_rate)[:-4]) self.seq_frame_start = utils.timecode_to_frames( str(sequence.start_time), self.fps) - # # convert timeline to otio + + # convert timeline to otio otio_timeline = _create_otio_timeline(sequence) + log.debug("_ otio_timeline: {}".format(otio_timeline)) # create otio tracks and clips for ver in sequence.versions: @@ -432,13 +435,27 @@ def create_otio_timeline(sequence): otio_track = create_otio_track( "video", str(track.name)[1:-1]) + all_segments = [] + for segment in track.segments: + clip_data = get_segment_attributes(segment) + if not clip_data: + continue + all_segments.append(clip_data) + segments_ordered = { - itemindex: get_segment_attributes(segment) - for itemindex, segment in enumerate( - track.segments) + itemindex: clip_data + for itemindex, clip_data in enumerate( + all_segments) } + log.debug("_ segments_ordered: {}".format( + pformat(segments_ordered) + )) + if not segments_ordered: + continue for itemindex, segment_data in segments_ordered.items(): + log.debug("_ itemindex: {}".format(itemindex)) + # Add Gap if needed if itemindex == 0: # if it is first track item at track then add @@ -449,6 +466,9 @@ def create_otio_timeline(sequence): # get previouse item prev_item = segments_ordered[itemindex - 1] + log.debug("_ segment_data: {}".format(segment_data)) + log.debug("_ prev_item: {}".format(prev_item)) + # calculate clip frame range difference from each other clip_diff = segment_data["record_in"] - prev_item["record_out"] @@ -467,6 +487,8 @@ def create_otio_timeline(sequence): otio_clip = create_otio_clip(segment_data) otio_track.append(otio_clip) + log.debug("_ otio_clip: {}".format(otio_clip)) + # create otio marker # create otio metadata diff --git a/openpype/hosts/flame/otio/utils.py b/openpype/hosts/flame/otio/utils.py index 57c8e4fecd..640a4fabfb 100644 --- a/openpype/hosts/flame/otio/utils.py +++ b/openpype/hosts/flame/otio/utils.py @@ -1,6 +1,7 @@ import re import opentimelineio as otio - +import logging +log = logging.getLogger(__name__) def timecode_to_frames(timecode, framerate): rt = otio.opentime.from_timecode(timecode, framerate) @@ -31,20 +32,25 @@ def get_reformated_path(path, padded=True): get_reformated_path("plate.1001.exr") > plate.%04d.exr """ - num_pattern = re.compile(r"[._](\d+)[.]") padding = get_padding_from_path(path) + found = get_frame_from_path(path) + + if not found: + log.info("Path is not sequence: {}".format(path)) + return path if padded: - path = re.sub(num_pattern, "%0{}d".format(padding), path) + path = path.replace(found, "%0{}d".format(padding)) else: - path = re.sub(num_pattern, "%d", path) + path = path.replace(found, "%d") + return path def get_padding_from_path(path): """ - Return padding number from DaVinci Resolve sequence path style + Return padding number from Flame path style Args: path (str): path url or simple file name @@ -56,11 +62,33 @@ def get_padding_from_path(path): get_padding_from_path("plate.0001.exr") > 4 """ - padding_pattern = re.compile(r"[._](\d+)[.]") - - found = re.findall(padding_pattern, path).pop() + found = get_frame_from_path(path) if found: return len(found) + else: + return None + +def get_frame_from_path(path): + """ + Return sequence number from Flame path style + + Args: + path (str): path url or simple file name + + Returns: + int: sequence frame number + + Example: + def get_frame_from_path(path): + ("plate.0001.exr") > 0001 + + """ + frame_pattern = re.compile(r"[._](\d+)[.]") + + found = re.findall(frame_pattern, path) + + if found: + return found.pop() else: return None \ No newline at end of file diff --git a/openpype/hosts/flame/plugins/publish/collect_test_selection.py b/openpype/hosts/flame/plugins/publish/collect_test_selection.py index cefd9ee7cf..4bb99c107b 100644 --- a/openpype/hosts/flame/plugins/publish/collect_test_selection.py +++ b/openpype/hosts/flame/plugins/publish/collect_test_selection.py @@ -1,7 +1,9 @@ import pyblish.api import openpype.hosts.flame as opflame from openpype.hosts.flame.otio import flame_export as otio_export +from openpype.hosts.flame.api import lib from pprint import pformat +reload(lib) reload(otio_export) @pyblish.api.log @@ -16,7 +18,8 @@ class CollectTestSelection(pyblish.api.ContextPlugin): def process(self, context): self.log.info(opflame.selection) - sequence = opflame.get_current_sequence(opflame.selection) + sequence = lib.get_current_sequence(opflame.selection) + otio_timeline = otio_export.create_otio_timeline(sequence) self.log.info(pformat(otio_timeline)) \ No newline at end of file From 8f622281cf7300ea3bc92912ea133cbcfbef51e2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 13:45:31 +0100 Subject: [PATCH 235/341] change override state on calling pop --- openpype/settings/entities/dict_mutable_keys_entity.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openpype/settings/entities/dict_mutable_keys_entity.py b/openpype/settings/entities/dict_mutable_keys_entity.py index cff346e9ea..be78018ebb 100644 --- a/openpype/settings/entities/dict_mutable_keys_entity.py +++ b/openpype/settings/entities/dict_mutable_keys_entity.py @@ -60,6 +60,12 @@ class DictMutableKeysEntity(EndpointEntity): def pop(self, key, *args, **kwargs): if key in self.required_keys: raise RequiredKeyModified(self.path, key) + + if self._override_state is OverrideState.STUDIO: + self._has_studio_override = True + elif self._override_state is OverrideState.PROJECT: + self._has_project_override = True + result = self.children_by_key.pop(key, *args, **kwargs) self.on_change() return result From 5fc7307be6e74df213fad40941cd86e22f1ccec6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 14:56:00 +0100 Subject: [PATCH 236/341] added ability to pass environment variables --- linux_app_launcher.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/linux_app_launcher.py b/linux_app_launcher.py index 274ef8b82b..6dc1518370 100644 --- a/linux_app_launcher.py +++ b/linux_app_launcher.py @@ -28,6 +28,12 @@ def main(input_json_path): with open(input_json_path, "r") as stream: data = json.load(stream) + # Change environment variables + env = data.get("env") or {} + for key, value in env.items(): + os.environ[key] = value + + # Prepare launch arguments args = data["args"] if isinstance(args, list): args = subprocess.list2cmdline(args) From dd99682df3284e4a5e2ada02adc4da9414603cb5 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 14:57:02 +0100 Subject: [PATCH 237/341] pass environments to set into the json instead of changing them for the subprocess --- openpype/lib/applications.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openpype/lib/applications.py b/openpype/lib/applications.py index 97cc213646..2101303771 100644 --- a/openpype/lib/applications.py +++ b/openpype/lib/applications.py @@ -938,8 +938,10 @@ class ApplicationLaunchContext: # Prepare data that will be passed to midprocess # - store arguments to a json and pass path to json as last argument + # - pass environments to set json_data = { - "args": self.launch_args + "args": self.launch_args, + "env": self.kwargs.pop("env", {}) } # Create temp file json_temp = tempfile.NamedTemporaryFile( From 16ae2913863602b003c548eb7e126c2e741a3ac8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 15:46:45 +0100 Subject: [PATCH 238/341] adde abstract method to be able know if entity has children by a path key --- openpype/settings/entities/base_entity.py | 5 +++++ .../settings/entities/dict_conditional.py | 3 +++ .../entities/dict_immutable_keys_entity.py | 3 +++ .../entities/dict_mutable_keys_entity.py | 3 +++ openpype/settings/entities/input_entities.py | 3 +++ openpype/settings/entities/item_entities.py | 21 +++++++++++++++++++ openpype/settings/entities/list_entity.py | 16 ++++++++++++++ openpype/settings/entities/root_entities.py | 3 +++ 8 files changed, 57 insertions(+) diff --git a/openpype/settings/entities/base_entity.py b/openpype/settings/entities/base_entity.py index 341968bd75..cbc042d29d 100644 --- a/openpype/settings/entities/base_entity.py +++ b/openpype/settings/entities/base_entity.py @@ -235,6 +235,11 @@ class BaseItemEntity(BaseEntity): """Return system settings entity.""" pass + @abstractmethod + def has_child_with_key(self, key): + """Entity contains key as children.""" + pass + def schema_validations(self): """Validate schema of entity and it's hierachy. diff --git a/openpype/settings/entities/dict_conditional.py b/openpype/settings/entities/dict_conditional.py index 5f1c172f31..92512a6668 100644 --- a/openpype/settings/entities/dict_conditional.py +++ b/openpype/settings/entities/dict_conditional.py @@ -107,6 +107,9 @@ class DictConditionalEntity(ItemEntity): for _key, _value in new_value.items(): self.non_gui_children[self.current_enum][_key].set(_value) + def has_child_with_key(self, key): + return key in self.keys() + def _item_initialization(self): self._default_metadata = NOT_SET self._studio_override_metadata = NOT_SET diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index 6131fa2ac7..c477a0eb0f 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -205,6 +205,9 @@ class DictImmutableKeysEntity(ItemEntity): ) self.show_borders = self.schema_data.get("show_borders", True) + def has_child_with_key(self, key): + return key in self.non_gui_children + def collect_static_entities_by_path(self): output = {} if self.is_dynamic_item or self.is_in_dynamic_item: diff --git a/openpype/settings/entities/dict_mutable_keys_entity.py b/openpype/settings/entities/dict_mutable_keys_entity.py index cff346e9ea..97af9e5c81 100644 --- a/openpype/settings/entities/dict_mutable_keys_entity.py +++ b/openpype/settings/entities/dict_mutable_keys_entity.py @@ -191,6 +191,9 @@ class DictMutableKeysEntity(EndpointEntity): child_entity = self.children_by_key[key] self.set_child_label(child_entity, label) + def has_child_with_key(self, key): + return key in self.children_by_key + def _item_initialization(self): self._default_metadata = {} self._studio_override_metadata = {} diff --git a/openpype/settings/entities/input_entities.py b/openpype/settings/entities/input_entities.py index a0598d405e..16893747a6 100644 --- a/openpype/settings/entities/input_entities.py +++ b/openpype/settings/entities/input_entities.py @@ -118,6 +118,9 @@ class InputEntity(EndpointEntity): return self.value == other.value return self.value == other + def has_child_with_key(self, key): + return False + def get_child_path(self, child_obj): raise TypeError("{} can't have children".format( self.__class__.__name__ diff --git a/openpype/settings/entities/item_entities.py b/openpype/settings/entities/item_entities.py index ff0a982900..9c6f428b97 100644 --- a/openpype/settings/entities/item_entities.py +++ b/openpype/settings/entities/item_entities.py @@ -1,3 +1,7 @@ +import re + +import six + from .lib import ( NOT_SET, STRING_TYPE, @@ -48,6 +52,9 @@ class PathEntity(ItemEntity): raise AttributeError(self.attribute_error_msg.format("items")) return self.child_obj.items() + def has_child_with_key(self, key): + return self.child_obj.has_child_with_key(key) + def _item_initialization(self): if self.group_item is None and not self.is_group: self.is_group = True @@ -197,6 +204,7 @@ class PathEntity(ItemEntity): class ListStrictEntity(ItemEntity): schema_types = ["list-strict"] + _key_regex = re.compile(r"[0-9]+") def __getitem__(self, idx): if not isinstance(idx, int): @@ -216,6 +224,19 @@ class ListStrictEntity(ItemEntity): return self.children[idx] return default + def has_child_with_key(self, key): + if ( + key + and isinstance(key, six.string_types) + and self._key_regex.match(key) + ): + key = int(key) + + if not isinstance(key, int): + return False + + return 0 <= key < len(self.children) + def _item_initialization(self): self.valid_value_types = (list, ) self.require_key = True diff --git a/openpype/settings/entities/list_entity.py b/openpype/settings/entities/list_entity.py index 5d89a81351..0268c208bb 100644 --- a/openpype/settings/entities/list_entity.py +++ b/openpype/settings/entities/list_entity.py @@ -1,4 +1,6 @@ import copy +import six +import re from . import ( BaseEntity, EndpointEntity @@ -21,6 +23,7 @@ class ListEntity(EndpointEntity): "collapsible": True, "collapsed": False } + _key_regex = re.compile(r"[0-9]+") def __iter__(self): for item in self.children: @@ -144,6 +147,19 @@ class ListEntity(EndpointEntity): ) self.on_change() + def has_child_with_key(self, key): + if ( + key + and isinstance(key, six.string_types) + and self._key_regex.match(key) + ): + key = int(key) + + if not isinstance(key, int): + return False + + return 0 <= key < len(self.children) + def _convert_to_valid_type(self, value): if isinstance(value, (set, tuple)): return list(value) diff --git a/openpype/settings/entities/root_entities.py b/openpype/settings/entities/root_entities.py index b8baed8a93..687784a359 100644 --- a/openpype/settings/entities/root_entities.py +++ b/openpype/settings/entities/root_entities.py @@ -127,6 +127,9 @@ class RootEntity(BaseItemEntity): for _key, _value in new_value.items(): self.non_gui_children[_key].set(_value) + def has_child_with_key(self, key): + return key in self.non_gui_children + def keys(self): return self.non_gui_children.keys() From 06fed885ad5e9a5626baa50dd981856ea98eb183 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 15:47:29 +0100 Subject: [PATCH 239/341] breadcrumbs are not brute focing access to child entities by accessing with __getitem__ but checking if 'has_child_with_key' --- .../settings/settings/breadcrumbs_widget.py | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/openpype/tools/settings/settings/breadcrumbs_widget.py b/openpype/tools/settings/settings/breadcrumbs_widget.py index d25cbdc8cb..7524bc61f0 100644 --- a/openpype/tools/settings/settings/breadcrumbs_widget.py +++ b/openpype/tools/settings/settings/breadcrumbs_widget.py @@ -71,17 +71,35 @@ class SettingsBreadcrumbs(BreadcrumbsModel): return True return False + def get_valid_path(self, path): + if not path: + return "" + + path_items = path.split("/") + new_path_items = [] + entity = self.entity + for item in path_items: + if not entity.has_child_with_key(item): + break + + new_path_items.append(item) + entity = entity[item] + + return "/".join(new_path_items) + def is_valid_path(self, path): if not path: return True path_items = path.split("/") - try: - entity = self.entity - for item in path_items: - entity = entity[item] - except Exception: - return False + + entity = self.entity + for item in path_items: + if not entity.has_child_with_key(item): + return False + + entity = entity[item] + return True @@ -436,6 +454,7 @@ class BreadcrumbsAddressBar(QtWidgets.QFrame): self.change_path(path) def change_path(self, path): + path = self._model.get_valid_path(path) if self._model and not self._model.is_valid_path(path): self._show_address_field() else: From d392885b35de566faaecab0e8e0a1a3a029eeac2 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 16 Dec 2021 15:58:16 +0100 Subject: [PATCH 240/341] OP-2038 - introduced settings for invalid characters to use in ValidateNaming plugin --- .../plugins/publish/validate_naming.py | 44 ++++++++++++++----- .../defaults/project_settings/photoshop.json | 14 +++--- .../schema_project_photoshop.json | 42 +++++++++++++----- 3 files changed, 75 insertions(+), 25 deletions(-) diff --git a/openpype/hosts/photoshop/plugins/publish/validate_naming.py b/openpype/hosts/photoshop/plugins/publish/validate_naming.py index 0fd6794313..077f7cf132 100644 --- a/openpype/hosts/photoshop/plugins/publish/validate_naming.py +++ b/openpype/hosts/photoshop/plugins/publish/validate_naming.py @@ -1,3 +1,5 @@ +import re + import pyblish.api import openpype.api from avalon import photoshop @@ -19,20 +21,32 @@ class ValidateNamingRepair(pyblish.api.Action): and result["instance"] not in failed): failed.append(result["instance"]) + invalid_chars, replace_char = plugin.get_replace_chars() + # Apply pyblish.logic to get the instances for the plug-in instances = pyblish.api.instances_by_plugin(failed, plugin) stub = photoshop.stub() for instance in instances: self.log.info("validate_naming instance {}".format(instance)) - name = instance.data["name"].replace(" ", "_") - name = name.replace(instance.data["family"], '') - instance[0].Name = name - data = stub.read(instance[0]) - data["subset"] = "image" + name - stub.imprint(instance[0], data) + metadata = stub.read(instance[0]) + self.log.info("metadata instance {}".format(metadata)) + layer_name = None + if metadata.get("uuid"): + layer_data = stub.get_layer(metadata["uuid"]) + self.log.info("layer_data {}".format(layer_data)) + if layer_data: + layer_name = re.sub(invalid_chars, + replace_char, + layer_name) - name = stub.PUBLISH_ICON + name - stub.rename_layer(instance.data["uuid"], name) + stub.rename_layer(instance.data["uuid"], layer_name) + + subset_name = re.sub(invalid_chars, replace_char, + instance.data["name"]) + + instance[0].Name = layer_name or subset_name + metadata["subset"] = subset_name + stub.imprint(instance[0], metadata) return True @@ -49,12 +63,22 @@ class ValidateNaming(pyblish.api.InstancePlugin): families = ["image"] actions = [ValidateNamingRepair] + # configured by Settings + invalid_chars = '' + replace_char = '' + def process(self, instance): help_msg = ' Use Repair action (A) in Pyblish to fix it.' msg = "Name \"{}\" is not allowed.{}".format(instance.data["name"], help_msg) - assert " " not in instance.data["name"], msg + assert not re.search(self.invalid_chars, instance.data["name"]), msg msg = "Subset \"{}\" is not allowed.{}".format(instance.data["subset"], help_msg) - assert " " not in instance.data["subset"], msg + assert not re.search(self.invalid_chars, instance.data["subset"]), msg + + + @classmethod + def get_replace_chars(cls): + """Pass values configured in Settings for Repair.""" + return cls.invalid_chars, cls.replace_char \ No newline at end of file diff --git a/openpype/settings/defaults/project_settings/photoshop.json b/openpype/settings/defaults/project_settings/photoshop.json index 0c24c943ec..db9bf87268 100644 --- a/openpype/settings/defaults/project_settings/photoshop.json +++ b/openpype/settings/defaults/project_settings/photoshop.json @@ -7,11 +7,6 @@ } }, "publish": { - "ValidateContainers": { - "enabled": true, - "optional": true, - "active": true - }, "CollectRemoteInstances": { "color_code_mapping": [ { @@ -22,6 +17,15 @@ } ] }, + "ValidateContainers": { + "enabled": true, + "optional": true, + "active": true + }, + "ValidateNaming": { + "invalid_chars": "[ \\\\/+\\*\\?\\(\\)\\[\\]\\{\\}:,]", + "replace_char": "_" + }, "ExtractImage": { "formats": [ "png", diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_photoshop.json b/openpype/settings/entities/schemas/projects_schema/schema_project_photoshop.json index ca388de60c..51ea5b3fe7 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_photoshop.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_photoshop.json @@ -33,16 +33,6 @@ "key": "publish", "label": "Publish plugins", "children": [ - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateContainers", - "label": "ValidateContainers" - } - ] - }, { "type": "dict", "collapsible": true, @@ -108,6 +98,38 @@ } ] }, + { + "type": "schema_template", + "name": "template_publish_plugin", + "template_data": [ + { + "key": "ValidateContainers", + "label": "ValidateContainers" + } + ] + }, + { + "type": "dict", + "collapsible": true, + "key": "ValidateNaming", + "label": "Validate naming of subsets and layers", + "children": [ + { + "type": "label", + "label": "Subset cannot contain invalid characters or extract to file would fail" + }, + { + "type": "text", + "key": "invalid_chars", + "label": "Regex pattern of invalid characters" + }, + { + "type": "text", + "key": "replace_char", + "label": "Replacement character" + } + ] + }, { "type": "dict", "collapsible": true, From 9ec197acdaf7d064842214bd4540e8dec261ddc0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 16:53:35 +0100 Subject: [PATCH 241/341] added method get_timer_data_for_context to be able get timers related data for passed context --- .../timers_manager/timers_manager.py | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/openpype/modules/default_modules/timers_manager/timers_manager.py b/openpype/modules/default_modules/timers_manager/timers_manager.py index 0f165ff0ac..6541a9197c 100644 --- a/openpype/modules/default_modules/timers_manager/timers_manager.py +++ b/openpype/modules/default_modules/timers_manager/timers_manager.py @@ -151,6 +151,44 @@ class TimersManager(OpenPypeModule, ITrayService): self._idle_manager.stop() self._idle_manager.wait() + def get_timer_data_for_context(self, project_name, asset_name, task_name): + """Prepare data for timer related callbacks.""" + dbconn = AvalonMongoDB() + dbconn.install() + dbconn.Session["AVALON_PROJECT"] = project_name + + asset_doc = dbconn.find_one( + { + "type": "asset", + "name": asset_name + }, + { + "data.tasks": True, + "data.parents": True + } + ) + if not asset_doc: + raise ValueError("Uknown asset {}".format(asset_name)) + + asset_data = asset_doc.get("data") or {} + task_type = "" + try: + task_type = asset_data["tasks"][task_name]["type"] + except KeyError: + self.log.warning( + "Couldn't find task_type for {}".format(task_name) + ) + + hierarchy_items = asset_data.get("parents") or [] + hierarchy_items.append(asset_name) + + return { + "project_name": project_name, + "task_name": task_name, + "task_type": task_type, + "hierarchy": hierarchy_items + } + def start_timer(self, project_name, asset_name, task_name, hierarchy): """ Start timer for 'project_name', 'asset_name' and 'task_name' From 246bf8f1403cb9bc40cab5498eddb85f771cabe6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 16:54:16 +0100 Subject: [PATCH 242/341] use get_timer_data_for_context in start_timer and don't expect hierarchy --- .../timers_manager/rest_api.py | 15 +++--- .../timers_manager/timers_manager.py | 47 ++++--------------- 2 files changed, 18 insertions(+), 44 deletions(-) diff --git a/openpype/modules/default_modules/timers_manager/rest_api.py b/openpype/modules/default_modules/timers_manager/rest_api.py index 19b72d688b..4296610c23 100644 --- a/openpype/modules/default_modules/timers_manager/rest_api.py +++ b/openpype/modules/default_modules/timers_manager/rest_api.py @@ -39,17 +39,18 @@ class TimersManagerModuleRestApi: async def start_timer(self, request): data = await request.json() try: - project_name = data['project_name'] - asset_name = data['asset_name'] - task_name = data['task_name'] - hierarchy = data['hierarchy'] + project_name = data["project_name"] + asset_name = data["asset_name"] + task_name = data["task_name"] except KeyError: - log.error("Payload must contain fields 'project_name, " + - "'asset_name', 'task_name', 'hierarchy'") + log.error(( + "Payload must contain fields 'project_name," + " 'asset_name' and 'task_name'" + )) return Response(status=400) self.module.stop_timers() - self.module.start_timer(project_name, asset_name, task_name, hierarchy) + self.module.start_timer(project_name, asset_name, task_name) return Response(status=200) async def stop_timer(self, request): diff --git a/openpype/modules/default_modules/timers_manager/timers_manager.py b/openpype/modules/default_modules/timers_manager/timers_manager.py index 6541a9197c..fc9897b022 100644 --- a/openpype/modules/default_modules/timers_manager/timers_manager.py +++ b/openpype/modules/default_modules/timers_manager/timers_manager.py @@ -189,44 +189,17 @@ class TimersManager(OpenPypeModule, ITrayService): "hierarchy": hierarchy_items } - def start_timer(self, project_name, asset_name, task_name, hierarchy): + def start_timer(self, project_name, asset_name, task_name): + """Start timer for passed context. + + Args: + project_name (str): Project name + asset_name (str): Asset name + task_name (str): Task name """ - Start timer for 'project_name', 'asset_name' and 'task_name' - - Called from REST api by hosts. - - Args: - project_name (string) - asset_name (string) - task_name (string) - hierarchy (string) - """ - dbconn = AvalonMongoDB() - dbconn.install() - dbconn.Session["AVALON_PROJECT"] = project_name - - asset_doc = dbconn.find_one({ - "type": "asset", "name": asset_name - }) - if not asset_doc: - raise ValueError("Uknown asset {}".format(asset_name)) - - task_type = '' - try: - task_type = asset_doc["data"]["tasks"][task_name]["type"] - except KeyError: - self.log.warning("Couldn't find task_type for {}". - format(task_name)) - - hierarchy = hierarchy.split("\\") - hierarchy.append(asset_name) - - data = { - "project_name": project_name, - "task_name": task_name, - "task_type": task_type, - "hierarchy": hierarchy - } + data = self.get_timer_data_for_context( + project_name, asset_name, task_name + ) self.timer_started(None, data) def get_task_time(self, project_name, asset_name, task_name): From 83887b918a507d7a7ffce528c39f6c0ac7227415 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 16:55:05 +0100 Subject: [PATCH 243/341] changed 'change_timer_from_host' to static method 'start_timer_with_webserver' --- .../timers_manager/timers_manager.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/openpype/modules/default_modules/timers_manager/timers_manager.py b/openpype/modules/default_modules/timers_manager/timers_manager.py index fc9897b022..8aa8e18902 100644 --- a/openpype/modules/default_modules/timers_manager/timers_manager.py +++ b/openpype/modules/default_modules/timers_manager/timers_manager.py @@ -306,18 +306,29 @@ class TimersManager(OpenPypeModule, ITrayService): self, server_manager ) - def change_timer_from_host(self, project_name, asset_name, task_name): + @staticmethod + def start_timer_with_webserver( + project_name, asset_name, task_name, logger=None + ): """Prepared method for calling change timers on REST api""" webserver_url = os.environ.get("OPENPYPE_WEBSERVER_URL") if not webserver_url: - self.log.warning("Couldn't find webserver url") + msg = "Couldn't find webserver url" + if logger is not None: + logger.warning(msg) + else: + print(msg) return rest_api_url = "{}/timers_manager/start_timer".format(webserver_url) try: import requests except Exception: - self.log.warning("Couldn't start timer") + msg = "Couldn't start timer ('requests' is not available)" + if logger is not None: + logger.warning(msg) + else: + print(msg) return data = { "project_name": project_name, From fb096d0f68b3dc3171b6f9f0802d51d542b89bb2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 16:56:09 +0100 Subject: [PATCH 244/341] don't pass hierarchy in lib function --- openpype/lib/avalon_context.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index e3bceff275..cb5bca133d 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -1433,7 +1433,11 @@ def get_creator_by_name(creator_name, case_sensitive=False): @with_avalon def change_timer_to_current_context(): - """Called after context change to change timers""" + """Called after context change to change timers. + + TODO: + - use TimersManager's static method instead of reimplementing it here + """ webserver_url = os.environ.get("OPENPYPE_WEBSERVER_URL") if not webserver_url: log.warning("Couldn't find webserver url") @@ -1448,8 +1452,7 @@ def change_timer_to_current_context(): data = { "project_name": avalon.io.Session["AVALON_PROJECT"], "asset_name": avalon.io.Session["AVALON_ASSET"], - "task_name": avalon.io.Session["AVALON_TASK"], - "hierarchy": get_hierarchy() + "task_name": avalon.io.Session["AVALON_TASK"] } requests.post(rest_api_url, json=data) From c777bc8afcfebac4009ee2d9ab77e9558c8f3483 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 16:56:31 +0100 Subject: [PATCH 245/341] application launch context nad launch hooks have access to modules manager --- openpype/lib/applications.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/openpype/lib/applications.py b/openpype/lib/applications.py index 6eb44a9694..184a57ea89 100644 --- a/openpype/lib/applications.py +++ b/openpype/lib/applications.py @@ -640,6 +640,10 @@ class LaunchHook: def app_name(self): return getattr(self.application, "full_name", None) + @property + def modules_manager(self): + return getattr(self.launch_context, "modules_manager", None) + def validate(self): """Optional validation of launch hook on initialization. @@ -702,9 +706,13 @@ class ApplicationLaunchContext: """ def __init__(self, application, executable, **data): + from openpype.modules import ModulesManager + # Application object self.application = application + self.modules_manager = ModulesManager() + # Logger logger_name = "{}-{}".format(self.__class__.__name__, self.app_name) self.log = PypeLogger.get_logger(logger_name) @@ -812,10 +820,7 @@ class ApplicationLaunchContext: paths.append(path) # Load modules paths - from openpype.modules import ModulesManager - - manager = ModulesManager() - paths.extend(manager.collect_launch_hook_paths()) + paths.extend(self.modules_manager.collect_launch_hook_paths()) return paths From 272f4fcc67f5f6ea9d3dffb4eb97b57848389bd5 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 16:56:59 +0100 Subject: [PATCH 246/341] added new post launch hook that will trigger start timer using timers manager --- openpype/hooks/post_start_timer.py | 48 ++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 openpype/hooks/post_start_timer.py diff --git a/openpype/hooks/post_start_timer.py b/openpype/hooks/post_start_timer.py new file mode 100644 index 0000000000..be2cec82b7 --- /dev/null +++ b/openpype/hooks/post_start_timer.py @@ -0,0 +1,48 @@ +import os + +from openpype.api import get_project_settings +from openpype.lib import PostLaunchHook + + +class PostStartTimerHook(PostLaunchHook): + """Start timer with TimersManager module. + + This module requires enabled TimerManager module. + """ + order = None + + def execute(self): + project_name = self.data.get("project_name") + asset_name = self.data.get("asset_name") + task_name = self.data.get("task_name") + + missing_context_keys = set() + if not project_name: + missing_context_keys.add("project_name") + if not asset_name: + missing_context_keys.add("asset_name") + if not task_name: + missing_context_keys.add("task_name") + + if missing_context_keys: + missing_keys_str = ", ".join([ + "\"{}\"".format(key) for key in missing_context_keys + ]) + self.log.debug("Hook {} skipped. Missing data keys: {}".format( + self.__class__.__name__, missing_keys_str + )) + return + + timers_manager = self.modules_manager.modules_by_name.get( + "timers_manager" + ) + if not timers_manager or not timers_manager.enabled: + self.log.info(( + "Skipping starting timer because" + " TimersManager is not available." + )) + return + + timers_manager.start_timer_with_webserver( + project_name, asset_name, task_name, logger=self.log + ) From def385836b88a3626e09fb338121ed5223695572 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 16:57:13 +0100 Subject: [PATCH 247/341] removed start timer in ftrack's post launch hook --- .../launch_hooks/post_ftrack_changes.py | 25 +------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/launch_hooks/post_ftrack_changes.py b/openpype/modules/default_modules/ftrack/launch_hooks/post_ftrack_changes.py index df16cde2b8..d5a95fad91 100644 --- a/openpype/modules/default_modules/ftrack/launch_hooks/post_ftrack_changes.py +++ b/openpype/modules/default_modules/ftrack/launch_hooks/post_ftrack_changes.py @@ -52,7 +52,7 @@ class PostFtrackHook(PostLaunchHook): ) if entity: self.ftrack_status_change(session, entity, project_name) - self.start_timer(session, entity, ftrack_api) + except Exception: self.log.warning( "Couldn't finish Ftrack procedure.", exc_info=True @@ -160,26 +160,3 @@ class PostFtrackHook(PostLaunchHook): " on Ftrack entity type \"{}\"" ).format(next_status_name, entity.entity_type) self.log.warning(msg) - - def start_timer(self, session, entity, _ftrack_api): - """Start Ftrack timer on task from context.""" - self.log.debug("Triggering timer start.") - - user_entity = session.query("User where username is \"{}\"".format( - os.environ["FTRACK_API_USER"] - )).first() - if not user_entity: - self.log.warning( - "Couldn't find user with username \"{}\" in Ftrack".format( - os.environ["FTRACK_API_USER"] - ) - ) - return - - try: - user_entity.start_timer(entity, force=True) - session.commit() - self.log.debug("Timer start triggered successfully.") - - except Exception: - self.log.warning("Couldn't trigger Ftrack timer.", exc_info=True) From 5528f064130663dda83bce12cc60a906f9c54733 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 17:05:19 +0100 Subject: [PATCH 248/341] added few docstrings --- .../timers_manager/timers_manager.py | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/openpype/modules/default_modules/timers_manager/timers_manager.py b/openpype/modules/default_modules/timers_manager/timers_manager.py index 8aa8e18902..5fffb24a5e 100644 --- a/openpype/modules/default_modules/timers_manager/timers_manager.py +++ b/openpype/modules/default_modules/timers_manager/timers_manager.py @@ -152,7 +152,11 @@ class TimersManager(OpenPypeModule, ITrayService): self._idle_manager.wait() def get_timer_data_for_context(self, project_name, asset_name, task_name): - """Prepare data for timer related callbacks.""" + """Prepare data for timer related callbacks. + + TODO: + - return predefined object that has access to asset document etc. + """ dbconn = AvalonMongoDB() dbconn.install() dbconn.Session["AVALON_PROJECT"] = project_name @@ -203,6 +207,11 @@ class TimersManager(OpenPypeModule, ITrayService): self.timer_started(None, data) def get_task_time(self, project_name, asset_name, task_name): + """Get total time for passed context. + + TODO: + - convert context to timer data + """ times = {} for module_id, connector in self._connectors_by_module_id.items(): if hasattr(connector, "get_task_time"): @@ -213,6 +222,10 @@ class TimersManager(OpenPypeModule, ITrayService): return times def timer_started(self, source_id, data): + """Connector triggered that timer has started. + + New timer has started for context in data. + """ for module_id, connector in self._connectors_by_module_id.items(): if module_id == source_id: continue @@ -230,6 +243,14 @@ class TimersManager(OpenPypeModule, ITrayService): self.is_running = True def timer_stopped(self, source_id): + """Connector triggered that hist timer has stopped. + + Should stop all other timers. + + TODO: + - pass context for which timer has stopped to validate if timers are + same and valid + """ for module_id, connector in self._connectors_by_module_id.items(): if module_id == source_id: continue @@ -248,6 +269,7 @@ class TimersManager(OpenPypeModule, ITrayService): self.timer_started(None, self.last_task) def stop_timers(self): + """Stop all timers.""" if self.is_running is False: return From 1984f9d8b484f1f37beb4ae9abf1b62448d36df8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 17:05:42 +0100 Subject: [PATCH 249/341] added helper method for future use --- .../timers_manager/timers_manager.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/openpype/modules/default_modules/timers_manager/timers_manager.py b/openpype/modules/default_modules/timers_manager/timers_manager.py index 5fffb24a5e..7c8ad25529 100644 --- a/openpype/modules/default_modules/timers_manager/timers_manager.py +++ b/openpype/modules/default_modules/timers_manager/timers_manager.py @@ -151,6 +151,22 @@ class TimersManager(OpenPypeModule, ITrayService): self._idle_manager.stop() self._idle_manager.wait() + def get_timer_data_for_path(self, task_path): + """Convert string path to a timer data. + + It is expected that first item is project name, last item is task name + and parent asset name is before task name. + """ + path_items = task_path.split("/") + if len(path_items) < 3: + raise ValueError("Invalid path") + task_name = path_items.pop(-1) + asset_name = path_items.pop(-1) + project_name = path_items.pop(0) + return self.get_timer_data_for_context( + project_name, asset_name, task_name + ) + def get_timer_data_for_context(self, project_name, asset_name, task_name): """Prepare data for timer related callbacks. From f4aa2d17b25b748ba9523c246e2fe86989af77bd Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 17:12:04 +0100 Subject: [PATCH 250/341] added few lines of docstring --- .../timers_manager/timers_manager.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/openpype/modules/default_modules/timers_manager/timers_manager.py b/openpype/modules/default_modules/timers_manager/timers_manager.py index 7c8ad25529..0ae0af4cdb 100644 --- a/openpype/modules/default_modules/timers_manager/timers_manager.py +++ b/openpype/modules/default_modules/timers_manager/timers_manager.py @@ -348,7 +348,18 @@ class TimersManager(OpenPypeModule, ITrayService): def start_timer_with_webserver( project_name, asset_name, task_name, logger=None ): - """Prepared method for calling change timers on REST api""" + """Prepared method for calling change timers on REST api. + + Webserver must be active. At the moment is Webserver running only when + OpenPype Tray is used. + + Args: + project_name (str): Project name. + asset_name (str): Asset name. + task_name (str): Task name. + logger (logging.Logger): Logger object. Using 'print' if not + passed. + """ webserver_url = os.environ.get("OPENPYPE_WEBSERVER_URL") if not webserver_url: msg = "Couldn't find webserver url" From 63b7b56547cd395fa5336a7a8abe36ea9888edb2 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 16 Dec 2021 17:12:12 +0100 Subject: [PATCH 251/341] OP-2038 - fix use correct value --- openpype/hosts/photoshop/plugins/publish/validate_naming.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/photoshop/plugins/publish/validate_naming.py b/openpype/hosts/photoshop/plugins/publish/validate_naming.py index 077f7cf132..7c9ad1e923 100644 --- a/openpype/hosts/photoshop/plugins/publish/validate_naming.py +++ b/openpype/hosts/photoshop/plugins/publish/validate_naming.py @@ -22,6 +22,7 @@ class ValidateNamingRepair(pyblish.api.Action): failed.append(result["instance"]) invalid_chars, replace_char = plugin.get_replace_chars() + self.log.info("{} --- {}".format(invalid_chars, replace_char)) # Apply pyblish.logic to get the instances for the plug-in instances = pyblish.api.instances_by_plugin(failed, plugin) @@ -37,7 +38,7 @@ class ValidateNamingRepair(pyblish.api.Action): if layer_data: layer_name = re.sub(invalid_chars, replace_char, - layer_name) + layer_data.name) stub.rename_layer(instance.data["uuid"], layer_name) From 27dc4552eb2adb3dbdbab72d2b06558cec94fbb2 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 16 Dec 2021 17:14:34 +0100 Subject: [PATCH 252/341] OP-2038 - Hound --- openpype/hosts/photoshop/plugins/publish/validate_naming.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openpype/hosts/photoshop/plugins/publish/validate_naming.py b/openpype/hosts/photoshop/plugins/publish/validate_naming.py index 7c9ad1e923..1635096f4b 100644 --- a/openpype/hosts/photoshop/plugins/publish/validate_naming.py +++ b/openpype/hosts/photoshop/plugins/publish/validate_naming.py @@ -78,8 +78,7 @@ class ValidateNaming(pyblish.api.InstancePlugin): help_msg) assert not re.search(self.invalid_chars, instance.data["subset"]), msg - @classmethod def get_replace_chars(cls): """Pass values configured in Settings for Repair.""" - return cls.invalid_chars, cls.replace_char \ No newline at end of file + return cls.invalid_chars, cls.replace_char From d4112eb3fafbaf2c817d7771c12e40b36701f2a0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 17:15:27 +0100 Subject: [PATCH 253/341] moved the launch hook into timers manager --- .../launch_hooks}/post_start_timer.py | 3 --- .../timers_manager/timers_manager.py | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) rename openpype/{hooks => modules/default_modules/timers_manager/launch_hooks}/post_start_timer.py (96%) diff --git a/openpype/hooks/post_start_timer.py b/openpype/modules/default_modules/timers_manager/launch_hooks/post_start_timer.py similarity index 96% rename from openpype/hooks/post_start_timer.py rename to openpype/modules/default_modules/timers_manager/launch_hooks/post_start_timer.py index be2cec82b7..d6ae013403 100644 --- a/openpype/hooks/post_start_timer.py +++ b/openpype/modules/default_modules/timers_manager/launch_hooks/post_start_timer.py @@ -1,6 +1,3 @@ -import os - -from openpype.api import get_project_settings from openpype.lib import PostLaunchHook diff --git a/openpype/modules/default_modules/timers_manager/timers_manager.py b/openpype/modules/default_modules/timers_manager/timers_manager.py index 0ae0af4cdb..964e6d9a58 100644 --- a/openpype/modules/default_modules/timers_manager/timers_manager.py +++ b/openpype/modules/default_modules/timers_manager/timers_manager.py @@ -1,7 +1,10 @@ import os import platform from openpype.modules import OpenPypeModule -from openpype_interfaces import ITrayService +from openpype_interfaces import ( + ITrayService, + ILaunchHookPaths +) from avalon.api import AvalonMongoDB @@ -64,7 +67,7 @@ class ExampleTimersManagerConnector: self._timers_manager_module.timer_stopped(self._module.id) -class TimersManager(OpenPypeModule, ITrayService): +class TimersManager(OpenPypeModule, ITrayService, ILaunchHookPaths): """ Handles about Timers. Should be able to start/stop all timers at once. @@ -167,6 +170,13 @@ class TimersManager(OpenPypeModule, ITrayService): project_name, asset_name, task_name ) + def get_launch_hook_paths(self): + """Implementation of `ILaunchHookPaths`.""" + return os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "launch_hooks" + ) + def get_timer_data_for_context(self, project_name, asset_name, task_name): """Prepare data for timer related callbacks. From f1b21fedf17aa95aeea56c80f20579a8d517c9c8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 17:21:36 +0100 Subject: [PATCH 254/341] moved job queue module one hierarchy higher from default_modules --- openpype/modules/{default_modules => }/job_queue/__init__.py | 0 .../{default_modules => }/job_queue/job_server/__init__.py | 0 .../{default_modules => }/job_queue/job_server/job_queue_route.py | 0 .../modules/{default_modules => }/job_queue/job_server/jobs.py | 0 .../modules/{default_modules => }/job_queue/job_server/server.py | 0 .../modules/{default_modules => }/job_queue/job_server/utils.py | 0 .../modules/{default_modules => }/job_queue/job_server/workers.py | 0 .../job_queue/job_server/workers_rpc_route.py | 0 .../{default_modules => }/job_queue/job_workers/__init__.py | 0 .../{default_modules => }/job_queue/job_workers/base_worker.py | 0 openpype/modules/{default_modules => }/job_queue/module.py | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename openpype/modules/{default_modules => }/job_queue/__init__.py (100%) rename openpype/modules/{default_modules => }/job_queue/job_server/__init__.py (100%) rename openpype/modules/{default_modules => }/job_queue/job_server/job_queue_route.py (100%) rename openpype/modules/{default_modules => }/job_queue/job_server/jobs.py (100%) rename openpype/modules/{default_modules => }/job_queue/job_server/server.py (100%) rename openpype/modules/{default_modules => }/job_queue/job_server/utils.py (100%) rename openpype/modules/{default_modules => }/job_queue/job_server/workers.py (100%) rename openpype/modules/{default_modules => }/job_queue/job_server/workers_rpc_route.py (100%) rename openpype/modules/{default_modules => }/job_queue/job_workers/__init__.py (100%) rename openpype/modules/{default_modules => }/job_queue/job_workers/base_worker.py (100%) rename openpype/modules/{default_modules => }/job_queue/module.py (100%) diff --git a/openpype/modules/default_modules/job_queue/__init__.py b/openpype/modules/job_queue/__init__.py similarity index 100% rename from openpype/modules/default_modules/job_queue/__init__.py rename to openpype/modules/job_queue/__init__.py diff --git a/openpype/modules/default_modules/job_queue/job_server/__init__.py b/openpype/modules/job_queue/job_server/__init__.py similarity index 100% rename from openpype/modules/default_modules/job_queue/job_server/__init__.py rename to openpype/modules/job_queue/job_server/__init__.py diff --git a/openpype/modules/default_modules/job_queue/job_server/job_queue_route.py b/openpype/modules/job_queue/job_server/job_queue_route.py similarity index 100% rename from openpype/modules/default_modules/job_queue/job_server/job_queue_route.py rename to openpype/modules/job_queue/job_server/job_queue_route.py diff --git a/openpype/modules/default_modules/job_queue/job_server/jobs.py b/openpype/modules/job_queue/job_server/jobs.py similarity index 100% rename from openpype/modules/default_modules/job_queue/job_server/jobs.py rename to openpype/modules/job_queue/job_server/jobs.py diff --git a/openpype/modules/default_modules/job_queue/job_server/server.py b/openpype/modules/job_queue/job_server/server.py similarity index 100% rename from openpype/modules/default_modules/job_queue/job_server/server.py rename to openpype/modules/job_queue/job_server/server.py diff --git a/openpype/modules/default_modules/job_queue/job_server/utils.py b/openpype/modules/job_queue/job_server/utils.py similarity index 100% rename from openpype/modules/default_modules/job_queue/job_server/utils.py rename to openpype/modules/job_queue/job_server/utils.py diff --git a/openpype/modules/default_modules/job_queue/job_server/workers.py b/openpype/modules/job_queue/job_server/workers.py similarity index 100% rename from openpype/modules/default_modules/job_queue/job_server/workers.py rename to openpype/modules/job_queue/job_server/workers.py diff --git a/openpype/modules/default_modules/job_queue/job_server/workers_rpc_route.py b/openpype/modules/job_queue/job_server/workers_rpc_route.py similarity index 100% rename from openpype/modules/default_modules/job_queue/job_server/workers_rpc_route.py rename to openpype/modules/job_queue/job_server/workers_rpc_route.py diff --git a/openpype/modules/default_modules/job_queue/job_workers/__init__.py b/openpype/modules/job_queue/job_workers/__init__.py similarity index 100% rename from openpype/modules/default_modules/job_queue/job_workers/__init__.py rename to openpype/modules/job_queue/job_workers/__init__.py diff --git a/openpype/modules/default_modules/job_queue/job_workers/base_worker.py b/openpype/modules/job_queue/job_workers/base_worker.py similarity index 100% rename from openpype/modules/default_modules/job_queue/job_workers/base_worker.py rename to openpype/modules/job_queue/job_workers/base_worker.py diff --git a/openpype/modules/default_modules/job_queue/module.py b/openpype/modules/job_queue/module.py similarity index 100% rename from openpype/modules/default_modules/job_queue/module.py rename to openpype/modules/job_queue/module.py From fd7ed342337aa4272e499a38ee2dbde58491b626 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 17:21:49 +0100 Subject: [PATCH 255/341] added 'job_queue' module to default modules list --- openpype/modules/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openpype/modules/base.py b/openpype/modules/base.py index a1df3cfd14..b5c491a1c0 100644 --- a/openpype/modules/base.py +++ b/openpype/modules/base.py @@ -41,6 +41,7 @@ DEFAULT_OPENPYPE_MODULES = ( "project_manager_action", "settings_action", "standalonepublish_action", + "job_queue", ) From 449487031c37b8e881d30d8e642b4f4f0ed5a71d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 17 Dec 2021 11:37:54 +0100 Subject: [PATCH 256/341] type label can contain links that can lead to settings or open standard urls --- openpype/tools/settings/settings/base.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/openpype/tools/settings/settings/base.py b/openpype/tools/settings/settings/base.py index b10c958880..8a420c2447 100644 --- a/openpype/tools/settings/settings/base.py +++ b/openpype/tools/settings/settings/base.py @@ -554,7 +554,9 @@ class GUIWidget(BaseWidget): def _create_label_ui(self): label = self.entity["label"] label_widget = QtWidgets.QLabel(label, self) + label_widget.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction) label_widget.setObjectName("SettingsLabel") + label_widget.linkActivated.connect(self._on_link_activate) layout = QtWidgets.QHBoxLayout(self) layout.setContentsMargins(0, 5, 0, 5) @@ -570,6 +572,14 @@ class GUIWidget(BaseWidget): layout.setContentsMargins(5, 5, 5, 5) layout.addWidget(splitter_item) + def _on_link_activate(self, url): + if not url.startswith("settings://"): + QtGui.QDesktopServices.openUrl(url) + return + + path = url.replace("settings://", "") + self.category_widget.go_to_fullpath(path) + def set_entity_value(self): pass From c647649de0ee578217b1afde4141fac2789ef145 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 17 Dec 2021 11:38:18 +0100 Subject: [PATCH 257/341] category widget can trigger change of full path --- openpype/tools/settings/settings/categories.py | 1 + openpype/tools/settings/settings/window.py | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/openpype/tools/settings/settings/categories.py b/openpype/tools/settings/settings/categories.py index 029619849e..724399c443 100644 --- a/openpype/tools/settings/settings/categories.py +++ b/openpype/tools/settings/settings/categories.py @@ -82,6 +82,7 @@ class SettingsCategoryWidget(QtWidgets.QWidget): state_changed = QtCore.Signal() saved = QtCore.Signal(QtWidgets.QWidget) restart_required_trigger = QtCore.Signal() + full_path_requested = QtCore.Signal(str, str) def __init__(self, user_role, parent=None): super(SettingsCategoryWidget, self).__init__(parent) diff --git a/openpype/tools/settings/settings/window.py b/openpype/tools/settings/settings/window.py index fd0cd1d7cd..c376e5e91e 100644 --- a/openpype/tools/settings/settings/window.py +++ b/openpype/tools/settings/settings/window.py @@ -63,7 +63,9 @@ class MainWidget(QtWidgets.QWidget): tab_widget.restart_required_trigger.connect( self._on_restart_required ) + tab_widget.full_path_requested.connect(self._on_full_path_request) + self._header_tab_widget = header_tab_widget self.tab_widgets = tab_widgets def _on_tab_save(self, source_widget): @@ -90,6 +92,14 @@ class MainWidget(QtWidgets.QWidget): if app: app.processEvents() + def _on_full_path_request(self, category, path): + for tab_widget in self.tab_widgets: + if tab_widget.contain_category_key(category): + idx = self._header_tab_widget.indexOf(tab_widget) + self._header_tab_widget.setCurrentIndex(idx) + tab_widget.set_category_path(category, path) + break + def showEvent(self, event): super(MainWidget, self).showEvent(event) if self._reset_on_show: From a5082df4634f35010ed3194b8fc3147ef36aab5a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 17 Dec 2021 11:41:19 +0100 Subject: [PATCH 258/341] added new methods for category widget that can change full path (lead to different category) --- .../tools/settings/settings/categories.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/openpype/tools/settings/settings/categories.py b/openpype/tools/settings/settings/categories.py index 724399c443..d7650b8663 100644 --- a/openpype/tools/settings/settings/categories.py +++ b/openpype/tools/settings/settings/categories.py @@ -269,6 +269,37 @@ class SettingsCategoryWidget(QtWidgets.QWidget): # Scroll to widget self.scroll_widget.ensureWidgetVisible(widget) + def go_to_fullpath(self, full_path): + """Full path of settings entity which can lead to different category. + + Args: + full_path (str): Full path to settings entity. It is expected that + path starts with category name ("system_setting" etc.). + """ + if not full_path: + return + items = full_path.split("/") + category = items[0] + path = "" + if len(items) > 1: + path = "/".join(items[1:]) + self.full_path_requested.emit(category, path) + + def contain_category_key(self, category): + """Parent widget ask if category of full path lead to this widget. + + Args: + category (str): The category name. + + Returns: + bool: Passed category lead to this widget. + """ + return False + + def set_category_path(self, category, path): + """Change path of widget based on category full path.""" + pass + def set_path(self, path): self.breadcrumbs_widget.set_path(path) From 61dff2c51cb0b6253affa27604c81af9cabac7ee Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 17 Dec 2021 11:41:38 +0100 Subject: [PATCH 259/341] override required methods for both current categories --- .../tools/settings/settings/categories.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/openpype/tools/settings/settings/categories.py b/openpype/tools/settings/settings/categories.py index d7650b8663..b046085975 100644 --- a/openpype/tools/settings/settings/categories.py +++ b/openpype/tools/settings/settings/categories.py @@ -587,6 +587,14 @@ class SettingsCategoryWidget(QtWidgets.QWidget): class SystemWidget(SettingsCategoryWidget): + def contain_category_key(self, category): + if category == "system_settings": + return True + return False + + def set_category_path(self, category, path): + self.breadcrumbs_widget.change_path(path) + def _create_root_entity(self): self.entity = SystemSettings(set_studio_state=False) self.entity.on_change_callbacks.append(self._on_entity_change) @@ -623,6 +631,21 @@ class SystemWidget(SettingsCategoryWidget): class ProjectWidget(SettingsCategoryWidget): + def contain_category_key(self, category): + if category in ("project_settings", "project_anatomy"): + return True + return False + + def set_category_path(self, category, path): + if path: + path_items = path.split("/") + if path_items[0] not in ("project_settings", "project_anatomy"): + path = "/".join([category, path]) + else: + path = category + + self.breadcrumbs_widget.change_path(path) + def initialize_attributes(self): self.project_name = None From b79b5369fb3b297016b89242dc69b059f15139e7 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 17 Dec 2021 12:03:53 +0100 Subject: [PATCH 260/341] Merge current avalon-core main --- repos/avalon-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/avalon-core b/repos/avalon-core index 85c656fcf9..4f10fb1255 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit 85c656fcf9beb06ab92d3d6ce47f6472cf88df54 +Subproject commit 4f10fb1255beb156f23afa1bb8362dfc53d0c6f8 From 3f4510a9c902b7f8d299ee5f73b2ebac8a9a232d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 17 Dec 2021 13:11:21 +0100 Subject: [PATCH 261/341] renamed 'get_build_version' to 'get_installed_version' in openpype --- openpype/lib/openpype_version.py | 6 +++--- openpype/settings/entities/op_version_entity.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openpype/lib/openpype_version.py b/openpype/lib/openpype_version.py index 9a92454eca..e3a4e1fa3e 100644 --- a/openpype/lib/openpype_version.py +++ b/openpype/lib/openpype_version.py @@ -4,7 +4,7 @@ Access to logic from igniter is available only for OpenPype processes. Is meant to be able check OpenPype versions for studio. The logic is dependent on igniter's inner logic of versions. -Keep in mind that all functions except 'get_build_version' does not return +Keep in mind that all functions except 'get_installed_version' does not return OpenPype version located in build but versions available in remote versions repository or locally available. """ @@ -24,13 +24,13 @@ def op_version_control_available(): return True -def get_build_version(): +def get_installed_version(): """Get OpenPype version inside build. This version is not returned by any other functions here. """ if op_version_control_available(): - return get_OpenPypeVersion().get_build_version() + return get_OpenPypeVersion().get_installed_version() return None diff --git a/openpype/settings/entities/op_version_entity.py b/openpype/settings/entities/op_version_entity.py index 62c5bf4ff9..6f6243cfee 100644 --- a/openpype/settings/entities/op_version_entity.py +++ b/openpype/settings/entities/op_version_entity.py @@ -1,7 +1,7 @@ from openpype.lib.openpype_version import ( get_remote_versions, get_OpenPypeVersion, - get_build_version + get_installed_version ) from .input_entities import TextEntity from .lib import ( @@ -72,7 +72,7 @@ class ProductionVersionsInputEntity(OpenPypeVersionInput): def _get_openpype_versions(self): versions = get_remote_versions(staging=False, production=True) - versions.append(get_build_version()) + versions.append(get_installed_version()) return sorted(versions) From f8e84de363bd3c24cb8970a1bb2f5eacab7197b2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 17 Dec 2021 14:22:15 +0100 Subject: [PATCH 262/341] implemented tool buttons widgets for unreal --- openpype/hosts/unreal/api/tools_ui.py | 158 ++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 openpype/hosts/unreal/api/tools_ui.py diff --git a/openpype/hosts/unreal/api/tools_ui.py b/openpype/hosts/unreal/api/tools_ui.py new file mode 100644 index 0000000000..bcf8dd2c50 --- /dev/null +++ b/openpype/hosts/unreal/api/tools_ui.py @@ -0,0 +1,158 @@ +import sys +from Qt import QtWidgets, QtCore, QtGui + +from openpype import ( + resources, + style +) +from openpype.tools.utils import host_tools +from openpype.tools.utils.lib import qt_app_context + + +class ToolsBtnsWidget(QtWidgets.QWidget): + """Widget containing buttons which are clickable.""" + tool_required = QtCore.Signal(str) + + def __init__(self, parent=None): + super(ToolsBtnsWidget, self).__init__(parent) + + create_btn = QtWidgets.QPushButton("Create...", self) + load_btn = QtWidgets.QPushButton("Load...", self) + publish_btn = QtWidgets.QPushButton("Publish...", self) + manage_btn = QtWidgets.QPushButton("Manage...", self) + experimental_tools_btn = QtWidgets.QPushButton( + "Experimental tools...", self + ) + + layout = QtWidgets.QVBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + layout.addWidget(create_btn, 0) + layout.addWidget(load_btn, 0) + layout.addWidget(publish_btn, 0) + layout.addWidget(manage_btn, 0) + layout.addWidget(experimental_tools_btn, 0) + layout.addStretch(1) + + create_btn.clicked.connect(self._on_create) + load_btn.clicked.connect(self._on_load) + publish_btn.clicked.connect(self._on_publish) + manage_btn.clicked.connect(self._on_manage) + experimental_tools_btn.clicked.connect(self._on_experimental) + + def _on_create(self): + self.tool_required.emit("creator") + + def _on_load(self): + self.tool_required.emit("loader") + + def _on_publish(self): + self.tool_required.emit("publish") + + def _on_manage(self): + self.tool_required.emit("sceneinventory") + + def _on_experimental(self): + self.tool_required.emit("experimental_tools") + + +class ToolsDialog(QtWidgets.QDialog): + """Dialog with tool buttons that will stay opened until user close it.""" + def __init__(self, *args, **kwargs): + super(ToolsDialog, self).__init__(*args, **kwargs) + + self.setWindowTitle("OpenPype tools") + icon = QtGui.QIcon(resources.get_openpype_icon_filepath()) + self.setWindowIcon(icon) + + self.setWindowFlags( + QtCore.Qt.Window + | QtCore.Qt.WindowStaysOnTopHint + ) + self.setFocusPolicy(QtCore.Qt.StrongFocus) + + tools_widget = ToolsBtnsWidget(self) + + layout = QtWidgets.QVBoxLayout(self) + layout.addWidget(tools_widget) + + tools_widget.tool_required.connect(self._on_tool_require) + self._tools_widget = tools_widget + + self._first_show = True + + def sizeHint(self): + result = super(ToolsDialog, self).sizeHint() + result.setWidth(result.width() * 2) + return result + + def showEvent(self, event): + super(ToolsDialog, self).showEvent(event) + if self._first_show: + self.setStyleSheet(style.load_stylesheet()) + self._first_show = False + + def _on_tool_require(self, tool_name): + host_tools.show_tool_by_name(tool_name, parent=self) + + +class ToolsPopup(ToolsDialog): + """Popup with tool buttons that will close when loose focus.""" + def __init__(self, *args, **kwargs): + super(ToolsPopup, self).__init__(*args, **kwargs) + + self.setWindowFlags( + QtCore.Qt.FramelessWindowHint + | QtCore.Qt.Popup + ) + + def showEvent(self, event): + super(ToolsPopup, self).showEvent(event) + app = QtWidgets.QApplication.instance() + app.processEvents() + pos = QtGui.QCursor.pos() + self.move(pos) + + +class WindowCache: + """Cached objects and methods to be used in global scope.""" + _dialog = None + _popup = None + _first_show = True + + @classmethod + def _before_show(cls): + """Create QApplication if does not exists yet."""" + if not cls._first_show: + return + + cls._first_show = False + if not QtWidgets.QApplication.instance(): + QtWidgets.QApplication(sys.argv) + + @classmethod + def show_popup(cls): + cls._before_show() + with qt_app_context(): + if cls._popup is None: + cls._popup = ToolsPopup() + + cls._popup.show() + + @classmethod + def show_dialog(cls): + cls._before_show() + with qt_app_context(): + if cls._dialog is None: + cls._dialog = ToolsDialog() + + cls._dialog.show() + cls._dialog.raise_() + cls._dialog.activateWindow() + + +def show_tools_popup(): + WindowCache.show_popup() + + +def show_tools_dialog(): + WindowCache.show_dialog() From 96c88cec25db6feb01aa7a9894582f5f93156fc6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 17 Dec 2021 14:30:30 +0100 Subject: [PATCH 263/341] fix comment --- openpype/hosts/unreal/api/tools_ui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/unreal/api/tools_ui.py b/openpype/hosts/unreal/api/tools_ui.py index bcf8dd2c50..93361c3574 100644 --- a/openpype/hosts/unreal/api/tools_ui.py +++ b/openpype/hosts/unreal/api/tools_ui.py @@ -121,7 +121,7 @@ class WindowCache: @classmethod def _before_show(cls): - """Create QApplication if does not exists yet."""" + """Create QApplication if does not exists yet.""" if not cls._first_show: return From 8de80ce7737ab53af516f3b0296f3e27d6e4cd42 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 17 Dec 2021 14:35:42 +0100 Subject: [PATCH 264/341] otio export modul wip --- openpype/hosts/flame/otio/flame_export.py | 157 ++++++++++++++++++---- 1 file changed, 130 insertions(+), 27 deletions(-) diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index f01c600637..7cadd390b5 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -23,7 +23,8 @@ self.track_types = { } self.fps = None self.seq_frame_start = None - +self.project = None +self.clips = None self.marker_color_map = { "magenta": otio.schema.MarkerColor.MAGENTA, "red": otio.schema.MarkerColor.RED, @@ -45,7 +46,8 @@ def flatten(_list): def get_current_flame_project(): - return flame.project.current_project + project = flame.project.current_project + return project def create_otio_rational_time(frame, fps): @@ -205,7 +207,19 @@ def create_otio_reference(clip_data): # get file info for path and start frame frame_start = 0 + fps = self.fps + path = clip_data["fpath"] + + reel_clip = None + match_reel_clip = [ + clip for clip in self.clips + if clip["fpath"] == path + ] + if match_reel_clip: + reel_clip = match_reel_clip.pop() + fps = reel_clip["fps"] + file_name = os.path.basename(path) file_head, extension = os.path.splitext(file_name) @@ -240,11 +254,11 @@ def create_otio_reference(clip_data): name_suffix=extension, start_frame=frame_start, frame_zero_padding=padding, - rate=self.fps, + rate=fps, available_range=create_otio_time_range( frame_start, frame_duration, - self.fps + fps ) ) except AttributeError: @@ -258,12 +272,12 @@ def create_otio_reference(clip_data): available_range=create_otio_time_range( frame_start, frame_duration, - self.fps + fps ) ) # add metadata to otio item - # add_otio_metadata(otio_ex_ref_item, media_source, **metadata) + add_otio_metadata(otio_ex_ref_item, clip_data, **metadata) return otio_ex_ref_item @@ -281,7 +295,7 @@ def create_otio_clip(clip_data): ) otio_clip = otio.schema.Clip( - name=clip_data["name"], + name=clip_data["segment_name"], source_range=source_range, media_reference=media_reference ) @@ -308,9 +322,39 @@ def create_otio_gap(gap_start, clip_start, tl_start_frame, fps): ) ) +def get_clips_in_reels(project): + output_clips = [] + project_desktop = project.current_workspace.desktop + + for reel_group in project_desktop.reel_groups: + for reel in reel_group.reels: + for clip in reel.clips: + clip_data = { + "PyClip": clip, + "fps": float(str(clip.frame_rate)[:-4]) + } + + attrs = [ + "name", "width", "height", + "ratio", "sample_rate", "bit_depth" + ] + + for attr in attrs: + val = getattr(clip, attr) + clip_data[attr] = val + + version = clip.versions[-1] + track = version.tracks[-1] + for segment in track.segments: + segment_data = get_segment_attributes(segment) + clip_data.update(segment_data) + + output_clips.append(clip_data) + + return output_clips def _create_otio_timeline(sequence): - project = get_current_flame_project() + metadata = _get_metadata(sequence) metadata.update({ @@ -361,8 +405,8 @@ def add_otio_gap(clip_data, otio_track, prev_out): otio_track.append(otio_gap) -def add_otio_metadata(otio_item, media_source, **kwargs): - metadata = _get_metadata(media_source) +def add_otio_metadata(otio_item, item, **kwargs): + metadata = _get_metadata(item) # add additional metadata from kwargs if kwargs: @@ -372,20 +416,78 @@ def add_otio_metadata(otio_item, media_source, **kwargs): for key, value in metadata.items(): otio_item.metadata.update({key: value}) +def get_markers(item, segment=True): + output_markers = [] + + if segment: + segment_tl_in = item.record_in.relative_frame + + for marker in item.markers: + log.debug(marker) + start_frame = marker.location.get_value().relative_frame + + if segment: + start_frame = (start_frame - segment_tl_in) + 1 + + marker_data = { + "name": marker.name.get_value(), + "duration": marker.duration.get_value().relative_frame, + "comment": marker.comment.get_value(), + "start_frame": start_frame, + "colour": marker.colour.get_value() + } + + output_markers.append(marker_data) + + return output_markers + +def get_shot_tokens_values(clip, tokens): + old_value = None + output = {} + + shot_name = getattr(clip, "shot_name") + + if not shot_name: + return output + + old_value = shot_name.get_value() + + for token in tokens: + shot_name.set_value(token) + _key = re.sub("[ <>]", "", token) + try: + output[_key] = int(shot_name.get_value()) + except: + output[_key] = shot_name.get_value() + + shot_name.set_value(old_value) + + return output + def get_segment_attributes(segment): + # log.debug(dir(segment)) + + markers = get_markers(segment) + if str(segment.name)[1:-1] == "": return None # Add timeline segment to tree clip_data = { - "name": str(segment.name)[1:-1], - "comment": str(segment.comment)[1:-1], - "tape_name": str(segment.tape_name), - "source_name": str(segment.source_name), - "fpath": str(segment.file_path), - "segment": segment + "segment_name": segment.name.get_value(), + "segment_comment": segment.comment.get_value(), + "tape_name": segment.tape_name, + "source_name": segment.source_name, + "fpath": segment.file_path, + "PySegment": segment } + # add all available shot tokens + shot_tokens = get_shot_tokens_values(segment, [ + "", "", "", "", + ]) + clip_data.update(shot_tokens) + # populate shot source metadata segment_attrs = [ "record_duration", "record_in", "record_out", @@ -396,17 +498,12 @@ def get_segment_attributes(segment): if not hasattr(segment, attr): continue _value = getattr(segment, attr) - segment_attrs_data[attr] = _value - _value = str(_value)[1:-1] + segment_attrs_data[attr] = str(_value).replace("+", ":") if attr in ["record_in", "record_out"]: - # exclude timeline start - frame = utils.timecode_to_frames( - _value, self.fps) - clip_data[attr] = (frame - self.seq_frame_start) + 1 + clip_data[attr] = _value.relative_frame else: - clip_data[attr] = utils.timecode_to_frames( - _value, self.fps) + clip_data[attr] = _value.frame clip_data["segment_timecodes"] = segment_attrs_data @@ -416,14 +513,21 @@ def create_otio_timeline(sequence): log.info(dir(sequence)) log.info(sequence.attributes) + self.project = get_current_flame_project() + self.clips = get_clips_in_reels(self.project) + + log.debug(pformat( + self.clips + )) + # get current timeline self.fps = float(str(sequence.frame_rate)[:-4]) self.seq_frame_start = utils.timecode_to_frames( - str(sequence.start_time), self.fps) + str(sequence.start_time).replace("+", ":"), + self.fps) # convert timeline to otio otio_timeline = _create_otio_timeline(sequence) - log.debug("_ otio_timeline: {}".format(otio_timeline)) # create otio tracks and clips for ver in sequence.versions: @@ -467,7 +571,6 @@ def create_otio_timeline(sequence): prev_item = segments_ordered[itemindex - 1] log.debug("_ segment_data: {}".format(segment_data)) - log.debug("_ prev_item: {}".format(prev_item)) # calculate clip frame range difference from each other clip_diff = segment_data["record_in"] - prev_item["record_out"] From de5a4ca0a184115efcbccbef5f5d3b64a4b964c1 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 17 Dec 2021 17:48:25 +0100 Subject: [PATCH 265/341] added functin to parse environment data based on passed information --- openpype/lib/applications.py | 94 ++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/openpype/lib/applications.py b/openpype/lib/applications.py index 6eb44a9694..bbbd335a73 100644 --- a/openpype/lib/applications.py +++ b/openpype/lib/applications.py @@ -41,6 +41,100 @@ from .python_module_tools import ( _logger = None +PLATFORM_NAMES = {"windows", "linux", "darwin"} +DEFAULT_ENV_SUBGROUP = "standard" + + +def parse_environments(env_data, env_group=None, platform_name=None): + """Parse environment values from settings byt group and platfrom. + + Data may contain up to 2 hierarchical levels of dictionaries. At the end + of the last level must be string or list. List is joined using platform + specific joiner (';' for windows and ':' for linux and mac). + + Hierarchical levels can contain keys for subgroups and platform name. + Platform specific values must be always last level of dictionary. Platform + names are "windows" (MS Windows), "linux" (any linux distribution) and + "darwin" (any MacOS distribution). + + Subgroups are helpers added mainly for standard and on farm usage. Farm + may require different environments for e.g. licence related values or + plugins. Default subgroup is "standard". + + Examples: + ``` + { + # Unchanged value + "ENV_KEY1": "value", + # Empty values are kept (unset environment variable) + "ENV_KEY2": "", + + # Join list values with ':' or ';' + "ENV_KEY3": ["value1", "value2"], + + # Environment groups + "ENV_KEY4": { + "standard": "DEMO_SERVER_URL", + "farm": "LICENCE_SERVER_URL" + }, + + # Platform specific (and only for windows and mac) + "ENV_KEY5": { + "windows": "windows value", + "darwin": ["value 1", "value 2"] + }, + + # Environment groups and platform combination + "ENV_KEY6": { + "farm": "FARM_VALUE", + "standard": { + "windows": ["value1", "value2"], + "linux": "value1", + "darwin": "" + } + } + } + ``` + + Args: + + """ + output = {} + if not env_data: + return output + + if not env_group: + env_group = DEFAULT_ENV_SUBGROUP + + if not platform_name: + platform_name = platform.system().lower() + + for key, value in env_data.items(): + if isinstance(value, dict): + # Look if any key is platform key + # - expect that represents environment group if does not contain + # platform keys + if not PLATFORM_NAMES.intersection(set(value.keys())): + # Skip the key if group is not available + if env_group not in value: + continue + value = value[env_group] + + # Check again if value is dictionary + # - this time there should be only platform keys + if isinstance(value, dict): + value = value.get(platform_name) + + # Check if value is list and join it's values + # QUESTION Should empty values be skipped? + if isinstance(value, (list, tuple)): + value = os.pathsep.join(value) + + # Set key to output if value is string + if isinstance(value, six.string_types): + output[key] = value + return output + def get_logger(): """Global lib.applications logger getter.""" From e3532074c50e9cf1e6f1342fa896f8201dff568a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 17 Dec 2021 17:49:51 +0100 Subject: [PATCH 266/341] environment group is part of all environment related functions and application launch context --- openpype/hooks/pre_global_host_data.py | 2 +- openpype/lib/applications.py | 28 +++++++++++++++++--------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/openpype/hooks/pre_global_host_data.py b/openpype/hooks/pre_global_host_data.py index b32fb5e44a..6b08cdb444 100644 --- a/openpype/hooks/pre_global_host_data.py +++ b/openpype/hooks/pre_global_host_data.py @@ -48,7 +48,7 @@ class GlobalHostDataHook(PreLaunchHook): "log": self.log }) - prepare_host_environments(temp_data) + prepare_host_environments(temp_data, self.launch_context.env_group) prepare_context_environments(temp_data) temp_data.pop("log") diff --git a/openpype/lib/applications.py b/openpype/lib/applications.py index bbbd335a73..2e301adf03 100644 --- a/openpype/lib/applications.py +++ b/openpype/lib/applications.py @@ -795,7 +795,7 @@ class ApplicationLaunchContext: preparation to store objects usable in multiple places. """ - def __init__(self, application, executable, **data): + def __init__(self, application, executable, env_group=None, **data): # Application object self.application = application @@ -805,6 +805,11 @@ class ApplicationLaunchContext: self.executable = executable + if env_group is None: + env_group = DEFAULT_ENV_SUBGROUP + + self.env_group = env_group + self.data = dict(data) # subprocess.Popen launch arguments (first argument in constructor) @@ -1141,7 +1146,7 @@ class EnvironmentPrepData(dict): def get_app_environments_for_context( - project_name, asset_name, task_name, app_name, env=None + project_name, asset_name, task_name, app_name, env_group=None, env=None ): """Prepare environment variables by context. Args: @@ -1193,8 +1198,8 @@ def get_app_environments_for_context( "env": env }) - prepare_host_environments(data) - prepare_context_environments(data) + prepare_host_environments(data, env_group) + prepare_context_environments(data, env_group) # Discard avalon connection dbcon.uninstall() @@ -1214,7 +1219,7 @@ def _merge_env(env, current_env): return result -def prepare_host_environments(data, implementation_envs=True): +def prepare_host_environments(data, env_group=None, implementation_envs=True): """Modify launch environments based on launched app and context. Args: @@ -1268,7 +1273,7 @@ def prepare_host_environments(data, implementation_envs=True): continue # Choose right platform - tool_env = acre.parse(_env_values) + tool_env = parse_environments(_env_values, env_group) # Merge dictionaries env_values = _merge_env(tool_env, env_values) @@ -1300,7 +1305,9 @@ def prepare_host_environments(data, implementation_envs=True): data["env"].pop(key, None) -def apply_project_environments_value(project_name, env, project_settings=None): +def apply_project_environments_value( + project_name, env, project_settings=None, env_group=None +): """Apply project specific environments on passed environments. The enviornments are applied on passed `env` argument value so it is not @@ -1328,14 +1335,15 @@ def apply_project_environments_value(project_name, env, project_settings=None): env_value = project_settings["global"]["project_environments"] if env_value: + parsed_value = parse_environments(env_value, env_group) env.update(acre.compute( - _merge_env(acre.parse(env_value), env), + _merge_env(parsed_value, env), cleanup=False )) return env -def prepare_context_environments(data): +def prepare_context_environments(data, env_group=None): """Modify launch environemnts with context data for launched host. Args: @@ -1365,7 +1373,7 @@ def prepare_context_environments(data): data["project_settings"] = project_settings # Apply project specific environments on current env value apply_project_environments_value( - project_name, data["env"], project_settings + project_name, data["env"], project_settings, env_group ) app = data["app"] From 4de80689ed7666cfd87866d591872e2052accf1e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 17 Dec 2021 17:54:02 +0100 Subject: [PATCH 267/341] added environment group to extractenvironments command line argument --- openpype/cli.py | 7 +++++-- openpype/lib/applications.py | 3 --- openpype/pype_commands.py | 9 ++++++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/openpype/cli.py b/openpype/cli.py index 6b20fb5203..6e9c237b0e 100644 --- a/openpype/cli.py +++ b/openpype/cli.py @@ -138,7 +138,10 @@ def webpublisherwebserver(debug, executable, upload_dir, host=None, port=None): @click.option("--asset", help="Asset name", default=None) @click.option("--task", help="Task name", default=None) @click.option("--app", help="Application name", default=None) -def extractenvironments(output_json_path, project, asset, task, app): +@click.option( + "--envgroup", help="Environment group (e.g. \"farm\")", default=None +) +def extractenvironments(output_json_path, project, asset, task, app, envgroup): """Extract environment variables for entered context to a json file. Entered output filepath will be created if does not exists. @@ -149,7 +152,7 @@ def extractenvironments(output_json_path, project, asset, task, app): Context options are "project", "asset", "task", "app" """ PypeCommands.extractenvironments( - output_json_path, project, asset, task, app + output_json_path, project, asset, task, app, envgroup ) diff --git a/openpype/lib/applications.py b/openpype/lib/applications.py index 2e301adf03..bf52daba7c 100644 --- a/openpype/lib/applications.py +++ b/openpype/lib/applications.py @@ -95,9 +95,6 @@ def parse_environments(env_data, env_group=None, platform_name=None): } } ``` - - Args: - """ output = {} if not env_data: diff --git a/openpype/pype_commands.py b/openpype/pype_commands.py index a6330bae1f..e25b56744e 100644 --- a/openpype/pype_commands.py +++ b/openpype/pype_commands.py @@ -305,13 +305,16 @@ class PypeCommands: log.info("Publish finished.") @staticmethod - def extractenvironments(output_json_path, project, asset, task, app): - env = os.environ.copy() + def extractenvironments( + output_json_path, project, asset, task, app, env_group + ): if all((project, asset, task, app)): from openpype.api import get_app_environments_for_context env = get_app_environments_for_context( - project, asset, task, app, env + project, asset, task, app, env_group ) + else: + env = os.environ.copy() output_dir = os.path.dirname(output_json_path) if not os.path.exists(output_dir): From eb465b4d266c444193dcfe83f09693ba7e817abf Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 17 Dec 2021 17:55:39 +0100 Subject: [PATCH 268/341] deadline global plugin is using new argument "envgroup" --- vendor/deadline/custom/plugins/GlobalJobPreLoad.py | 1 + 1 file changed, 1 insertion(+) diff --git a/vendor/deadline/custom/plugins/GlobalJobPreLoad.py b/vendor/deadline/custom/plugins/GlobalJobPreLoad.py index 0aa5adaa20..ba1e5f6c6a 100644 --- a/vendor/deadline/custom/plugins/GlobalJobPreLoad.py +++ b/vendor/deadline/custom/plugins/GlobalJobPreLoad.py @@ -48,6 +48,7 @@ def inject_openpype_environment(deadlinePlugin): add_args['asset'] = job.GetJobEnvironmentKeyValue('AVALON_ASSET') add_args['task'] = job.GetJobEnvironmentKeyValue('AVALON_TASK') add_args['app'] = job.GetJobEnvironmentKeyValue('AVALON_APP_NAME') + add_args["envgroup"] = "farm" if all(add_args.values()): for key, value in add_args.items(): From 4653de69428b4c658d6cbab99c2c676e4f1b1c22 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 17 Dec 2021 18:19:01 +0100 Subject: [PATCH 269/341] wiretap handle for metadata --- openpype/hosts/flame/api/lib.py | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/openpype/hosts/flame/api/lib.py b/openpype/hosts/flame/api/lib.py index fba2d8f5c8..b7b815b373 100644 --- a/openpype/hosts/flame/api/lib.py +++ b/openpype/hosts/flame/api/lib.py @@ -290,3 +290,48 @@ def rescan_hooks(): flame.execute_shortcut('Rescan Python Hooks') except Exception: pass + + + +def get_metadata(project_name, _log=None): + import flame + + from adsk.libwiretapPythonClientAPI import ( + WireTapClient, + WireTapServerHandle, + WireTapNodeHandle, + WireTapStr, + WireTapInt + ) + + class GetProjectColorPolicy(object): + def __init__(self, host_name=None, _log=None): + # Create a connection to the Backburner manager using the Wiretap + # python API. + # + self.log = _log or log + self.host_name = host_name or "localhost" + self._wiretap_client = WireTapClient() + if not self._wiretap_client.init(): + raise Exception("Could not initialize Wiretap Client") + self._server = WireTapServerHandle( + "{}:IFFFS".format(self.host_name)) + + def process(self, project_name): + policy_node_handle = WireTapNodeHandle( + self._server, "/projects/{}/syncolor/policy".format(project_name)) + self.log.info(policy_node_handle) + + policy = WireTapStr() + if not policy_node_handle.getNodeTypeStr(policy): + self.log.warning( + "Could not retrieve policy of '%s': %s" % ( + policy_node_handle.getNodeId().id(), + policy_node_handle.lastError() + ) + ) + + return policy.c_str() + + policy_wiretap = GetProjectColorPolicy(_log=_log) + return policy_wiretap.process(project_name) \ No newline at end of file From f73b9b3822dc3769e4f20c4685b39ea8d07044ac Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 17 Dec 2021 18:25:09 +0100 Subject: [PATCH 270/341] getting projects color policy to otio timeline metadata --- openpype/hosts/flame/otio/flame_export.py | 36 +++++++++++++------ .../plugins/publish/collect_test_selection.py | 3 +- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index 7cadd390b5..e6ceafb3a6 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -353,24 +353,38 @@ def get_clips_in_reels(project): return output_clips +def _get_colourspace_policy(): + + output = {} + # get policies project path + policy_dir = "/opt/Autodesk/project/{}/synColor/policy".format( + self.project.name + ) + log.debug(policy_dir) + policy_fp = os.path.join(policy_dir, "policy.cfg") + + if not os.path.exists(policy_fp): + return output + + with open(policy_fp) as file: + dict_conf = dict(line.strip().split(' = ', 1) for line in file) + output.update( + {"openpype.flame.{}".format(k): v for k, v in dict_conf.items()} + ) + return output + def _create_otio_timeline(sequence): metadata = _get_metadata(sequence) + # find colour policy files and add them to metadata + colorspace_policy = _get_colourspace_policy() + metadata.update(colorspace_policy) + metadata.update({ "openpype.timeline.width": int(sequence.width), "openpype.timeline.height": int(sequence.height), - "openpype.timeline.pixelAspect": 1, # noqa - # "openpype.project.useOCIOEnvironmentOverride": project.useOCIOEnvironmentOverride(), # noqa - # "openpype.project.lutSetting16Bit": project.lutSetting16Bit(), - # "openpype.project.lutSetting8Bit": project.lutSetting8Bit(), - # "openpype.project.lutSettingFloat": project.lutSettingFloat(), - # "openpype.project.lutSettingLog": project.lutSettingLog(), - # "openpype.project.lutSettingViewer": project.lutSettingViewer(), - # "openpype.project.lutSettingWorkingSpace": project.lutSettingWorkingSpace(), # noqa - # "openpype.project.lutUseOCIOForExport": project.lutUseOCIOForExport(), - # "openpype.project.ocioConfigName": project.ocioConfigName(), - # "openpype.project.ocioConfigPath": project.ocioConfigPath() + "openpype.timeline.pixelAspect": 1 }) rt_start_time = create_otio_rational_time( diff --git a/openpype/hosts/flame/plugins/publish/collect_test_selection.py b/openpype/hosts/flame/plugins/publish/collect_test_selection.py index 4bb99c107b..41847ad9b6 100644 --- a/openpype/hosts/flame/plugins/publish/collect_test_selection.py +++ b/openpype/hosts/flame/plugins/publish/collect_test_selection.py @@ -6,6 +6,7 @@ from pprint import pformat reload(lib) reload(otio_export) + @pyblish.api.log class CollectTestSelection(pyblish.api.ContextPlugin): """testing selection sharing @@ -22,4 +23,4 @@ class CollectTestSelection(pyblish.api.ContextPlugin): otio_timeline = otio_export.create_otio_timeline(sequence) - self.log.info(pformat(otio_timeline)) \ No newline at end of file + self.log.info(pformat(otio_timeline)) From db4dc04d8f5f8052c9e98c2c4212748ad52b4aed Mon Sep 17 00:00:00 2001 From: OpenPype Date: Sat, 18 Dec 2021 03:42:07 +0000 Subject: [PATCH 271/341] [Automated] Bump version --- CHANGELOG.md | 26 ++++++++------------------ openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dde8138629..1eb8455a09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [3.7.0-nightly.8](https://github.com/pypeclub/OpenPype/tree/HEAD) +## [3.7.0-nightly.9](https://github.com/pypeclub/OpenPype/tree/HEAD) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...HEAD) @@ -14,6 +14,8 @@ **🚀 Enhancements** +- Settings UI: Hyperlinks to settings [\#2420](https://github.com/pypeclub/OpenPype/pull/2420) +- Modules: JobQueue module moved one hierarchy level higher [\#2419](https://github.com/pypeclub/OpenPype/pull/2419) - Ftrack: Check existence of object type on recreation [\#2404](https://github.com/pypeclub/OpenPype/pull/2404) - Flame: moving `utility\_scripts` to api folder also with `scripts` [\#2385](https://github.com/pypeclub/OpenPype/pull/2385) - Centos 7 dependency compatibility [\#2384](https://github.com/pypeclub/OpenPype/pull/2384) @@ -29,13 +31,14 @@ - General: OpenPype default modules hierarchy [\#2338](https://github.com/pypeclub/OpenPype/pull/2338) - General: FFprobe error exception contain original error message [\#2328](https://github.com/pypeclub/OpenPype/pull/2328) - Resolve: Add experimental button to menu [\#2325](https://github.com/pypeclub/OpenPype/pull/2325) -- Input links: Cleanup and unification of differences [\#2322](https://github.com/pypeclub/OpenPype/pull/2322) -- General: Don't validate vendor bin with executing them [\#2317](https://github.com/pypeclub/OpenPype/pull/2317) -- General: Multilayer EXRs support [\#2315](https://github.com/pypeclub/OpenPype/pull/2315) - General: Reduce vendor imports [\#2305](https://github.com/pypeclub/OpenPype/pull/2305) +- Ftrack: Synchronize input links [\#2287](https://github.com/pypeclub/OpenPype/pull/2287) **🐛 Bug fixes** +- PS: Introduced settings for invalid characters to use in ValidateNaming plugin [\#2417](https://github.com/pypeclub/OpenPype/pull/2417) +- Settings UI: Breadcrumbs path does not create new entities [\#2416](https://github.com/pypeclub/OpenPype/pull/2416) +- AfterEffects: Variant 2022 is in defaults but missing in schemas [\#2412](https://github.com/pypeclub/OpenPype/pull/2412) - General: Fix access to environments from default settings [\#2403](https://github.com/pypeclub/OpenPype/pull/2403) - Fix: Placeholder Input color set fix [\#2399](https://github.com/pypeclub/OpenPype/pull/2399) - Settings: Fix state change of wrapper label [\#2396](https://github.com/pypeclub/OpenPype/pull/2396) @@ -55,8 +58,7 @@ - Tools: Use Qt context on tools show [\#2340](https://github.com/pypeclub/OpenPype/pull/2340) - Flame: Fix default argument value in custom dictionary [\#2339](https://github.com/pypeclub/OpenPype/pull/2339) - Timers Manager: Disable auto stop timer on linux platform [\#2334](https://github.com/pypeclub/OpenPype/pull/2334) -- nuke: bake preset single input exception [\#2331](https://github.com/pypeclub/OpenPype/pull/2331) -- Hiero: fixing multiple templates at a hierarchy parent [\#2330](https://github.com/pypeclub/OpenPype/pull/2330) +- Fix - provider icons are pulled from a folder [\#2326](https://github.com/pypeclub/OpenPype/pull/2326) - Royal Render: Fix plugin order and OpenPype auto-detection [\#2291](https://github.com/pypeclub/OpenPype/pull/2291) **Merged pull requests:** @@ -66,7 +68,6 @@ - Linux : flip updating submodules logic [\#2357](https://github.com/pypeclub/OpenPype/pull/2357) - Update of avalon-core [\#2346](https://github.com/pypeclub/OpenPype/pull/2346) - Maya: configurable model top level validation [\#2321](https://github.com/pypeclub/OpenPype/pull/2321) -- Create test publish class for After Effects [\#2270](https://github.com/pypeclub/OpenPype/pull/2270) ## [3.6.4](https://github.com/pypeclub/OpenPype/tree/3.6.4) (2021-11-23) @@ -88,17 +89,6 @@ [Full Changelog](https://github.com/pypeclub/OpenPype/compare/CI/3.6.2-nightly.2...3.6.2) -**🚀 Enhancements** - -- Tools: Assets widget [\#2265](https://github.com/pypeclub/OpenPype/pull/2265) -- SceneInventory: Choose loader in asset switcher [\#2262](https://github.com/pypeclub/OpenPype/pull/2262) - -**🐛 Bug fixes** - -- Tools: Parenting of tools in Nuke and Hiero [\#2266](https://github.com/pypeclub/OpenPype/pull/2266) -- limiting validator to specific editorial hosts [\#2264](https://github.com/pypeclub/OpenPype/pull/2264) -- Tools: Select Context dialog attribute fix [\#2261](https://github.com/pypeclub/OpenPype/pull/2261) - ## [3.6.1](https://github.com/pypeclub/OpenPype/tree/3.6.1) (2021-11-16) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/CI/3.6.1-nightly.1...3.6.1) diff --git a/openpype/version.py b/openpype/version.py index 06bc20ae43..544160d41c 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.7.0-nightly.8" +__version__ = "3.7.0-nightly.9" diff --git a/pyproject.toml b/pyproject.toml index e5d552bb3b..07a9ac8e43 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.7.0-nightly.8" # OpenPype +version = "3.7.0-nightly.9" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From 5a194263fde0b9821d29479a26d92c0d5c3fe510 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 20 Dec 2021 13:10:17 +0100 Subject: [PATCH 272/341] get_timer_data_for_context is static method --- .../timers_manager/timers_manager.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/openpype/modules/default_modules/timers_manager/timers_manager.py b/openpype/modules/default_modules/timers_manager/timers_manager.py index 964e6d9a58..11e1821912 100644 --- a/openpype/modules/default_modules/timers_manager/timers_manager.py +++ b/openpype/modules/default_modules/timers_manager/timers_manager.py @@ -167,7 +167,7 @@ class TimersManager(OpenPypeModule, ITrayService, ILaunchHookPaths): asset_name = path_items.pop(-1) project_name = path_items.pop(0) return self.get_timer_data_for_context( - project_name, asset_name, task_name + project_name, asset_name, task_name, self.log ) def get_launch_hook_paths(self): @@ -177,7 +177,10 @@ class TimersManager(OpenPypeModule, ITrayService, ILaunchHookPaths): "launch_hooks" ) - def get_timer_data_for_context(self, project_name, asset_name, task_name): + @staticmethod + def get_timer_data_for_context( + project_name, asset_name, task_name, logger=None + ): """Prepare data for timer related callbacks. TODO: @@ -205,9 +208,11 @@ class TimersManager(OpenPypeModule, ITrayService, ILaunchHookPaths): try: task_type = asset_data["tasks"][task_name]["type"] except KeyError: - self.log.warning( - "Couldn't find task_type for {}".format(task_name) - ) + msg = "Couldn't find task_type for {}".format(task_name) + if logger is not None: + logger.warning(msg) + else: + print(msg) hierarchy_items = asset_data.get("parents") or [] hierarchy_items.append(asset_name) @@ -228,7 +233,7 @@ class TimersManager(OpenPypeModule, ITrayService, ILaunchHookPaths): task_name (str): Task name """ data = self.get_timer_data_for_context( - project_name, asset_name, task_name + project_name, asset_name, task_name, self.log ) self.timer_started(None, data) From 03ba413b282e1ce8b4c2d63a2371617d16c0592a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 20 Dec 2021 13:13:10 +0100 Subject: [PATCH 273/341] adde new exception --- openpype/modules/default_modules/timers_manager/exceptions.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 openpype/modules/default_modules/timers_manager/exceptions.py diff --git a/openpype/modules/default_modules/timers_manager/exceptions.py b/openpype/modules/default_modules/timers_manager/exceptions.py new file mode 100644 index 0000000000..5a9e00765d --- /dev/null +++ b/openpype/modules/default_modules/timers_manager/exceptions.py @@ -0,0 +1,3 @@ +class InvalidContextError(ValueError): + """Context for which the timer should be started is invalid.""" + pass From 3bb3211d4a63d6a93666e6c854f3f2d068fbe5e2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 20 Dec 2021 13:13:42 +0100 Subject: [PATCH 274/341] raise InvalidContextError if context is not valid --- .../timers_manager/timers_manager.py | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/openpype/modules/default_modules/timers_manager/timers_manager.py b/openpype/modules/default_modules/timers_manager/timers_manager.py index 11e1821912..051b2d7c80 100644 --- a/openpype/modules/default_modules/timers_manager/timers_manager.py +++ b/openpype/modules/default_modules/timers_manager/timers_manager.py @@ -1,11 +1,14 @@ import os import platform + +from avalon.api import AvalonMongoDB + from openpype.modules import OpenPypeModule from openpype_interfaces import ( ITrayService, ILaunchHookPaths ) -from avalon.api import AvalonMongoDB +from .exceptions import InvalidContextError class ExampleTimersManagerConnector: @@ -162,7 +165,7 @@ class TimersManager(OpenPypeModule, ITrayService, ILaunchHookPaths): """ path_items = task_path.split("/") if len(path_items) < 3: - raise ValueError("Invalid path") + raise InvalidContextError("Invalid path \"{}\"".format(task_path)) task_name = path_items.pop(-1) asset_name = path_items.pop(-1) project_name = path_items.pop(0) @@ -186,6 +189,12 @@ class TimersManager(OpenPypeModule, ITrayService, ILaunchHookPaths): TODO: - return predefined object that has access to asset document etc. """ + if not project_name or not asset_name or not task_name: + raise InvalidContextError(( + "Missing context information got" + " Project: \"{}\" Asset: \"{}\" Task: \"{}\"" + ).format(str(project_name), str(asset_name), str(task_name))) + dbconn = AvalonMongoDB() dbconn.install() dbconn.Session["AVALON_PROJECT"] = project_name @@ -201,12 +210,22 @@ class TimersManager(OpenPypeModule, ITrayService, ILaunchHookPaths): } ) if not asset_doc: - raise ValueError("Uknown asset {}".format(asset_name)) + dbconn.uninstall() + raise InvalidContextError(( + "Asset \"{}\" not found in project \"{}\"" + ).format(asset_name, project_name)) asset_data = asset_doc.get("data") or {} + asset_tasks = asset_data.get("tasks") or {} + if task_name not in asset_tasks: + dbconn.uninstall() + raise InvalidContextError(( + "Task \"{}\" not found on asset \"{}\" in project \"{}\"" + ).format(task_name, asset_name, project_name)) + task_type = "" try: - task_type = asset_data["tasks"][task_name]["type"] + task_type = asset_tasks[task_name]["type"] except KeyError: msg = "Couldn't find task_type for {}".format(task_name) if logger is not None: @@ -217,6 +236,7 @@ class TimersManager(OpenPypeModule, ITrayService, ILaunchHookPaths): hierarchy_items = asset_data.get("parents") or [] hierarchy_items.append(asset_name) + dbconn.uninstall() return { "project_name": project_name, "task_name": task_name, From ddcdff611e55ed6dadfccf598ca882a70c56cdf2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 20 Dec 2021 13:14:18 +0100 Subject: [PATCH 275/341] return error message in response --- .../default_modules/timers_manager/rest_api.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/openpype/modules/default_modules/timers_manager/rest_api.py b/openpype/modules/default_modules/timers_manager/rest_api.py index 4296610c23..f16cb316c3 100644 --- a/openpype/modules/default_modules/timers_manager/rest_api.py +++ b/openpype/modules/default_modules/timers_manager/rest_api.py @@ -43,14 +43,19 @@ class TimersManagerModuleRestApi: asset_name = data["asset_name"] task_name = data["task_name"] except KeyError: - log.error(( + msg = ( "Payload must contain fields 'project_name," " 'asset_name' and 'task_name'" - )) - return Response(status=400) + ) + log.error(msg) + return Response(status=400, message=msg) self.module.stop_timers() - self.module.start_timer(project_name, asset_name, task_name) + try: + self.module.start_timer(project_name, asset_name, task_name) + except Exception as exc: + return Response(status=404, message=str(exc)) + return Response(status=200) async def stop_timer(self, request): From 9605abfb13f64356aa382ef3e4ec0182345a1cae Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 20 Dec 2021 13:14:54 +0100 Subject: [PATCH 276/341] return response from posted request --- .../modules/default_modules/timers_manager/timers_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/modules/default_modules/timers_manager/timers_manager.py b/openpype/modules/default_modules/timers_manager/timers_manager.py index 051b2d7c80..47d020104b 100644 --- a/openpype/modules/default_modules/timers_manager/timers_manager.py +++ b/openpype/modules/default_modules/timers_manager/timers_manager.py @@ -420,4 +420,4 @@ class TimersManager(OpenPypeModule, ITrayService, ILaunchHookPaths): "task_name": task_name } - requests.post(rest_api_url, json=data) + return requests.post(rest_api_url, json=data) From e7760a6508c21074420ca08d39204afd57ec62b3 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 20 Dec 2021 15:08:29 +0100 Subject: [PATCH 277/341] flame otio export module update --- openpype/hosts/flame/otio/flame_export.py | 296 +++++++++++----------- 1 file changed, 149 insertions(+), 147 deletions(-) diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index e6ceafb3a6..7a2e5744e8 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -4,7 +4,7 @@ import os import re import sys -import ast +import json import logging import opentimelineio as otio from . import utils @@ -12,7 +12,7 @@ from . import utils import flame from pprint import pformat -reload(utils) +reload(utils) # noqa log = logging.getLogger(__name__) @@ -31,9 +31,14 @@ self.marker_color_map = { "yellow": otio.schema.MarkerColor.YELLOW, "green": otio.schema.MarkerColor.GREEN, "cyan": otio.schema.MarkerColor.CYAN, + "white": otio.schema.MarkerColor.WHITE, + "orange": otio.schema.MarkerColor.ORANGE, "blue": otio.schema.MarkerColor.BLUE, + "purple": otio.schema.MarkerColor.PURPLE, + "pink": otio.schema.MarkerColor.PINK, + "black": otio.schema.MarkerColor.BLACK, } -self.include_tags = True +self.include_markers = True def flatten(_list): @@ -63,6 +68,7 @@ def create_otio_time_range(start_frame, frame_duration, fps): duration=create_otio_rational_time(frame_duration, fps) ) + def _get_metadata(item): if hasattr(item, 'metadata'): if not item.metadata: @@ -71,130 +77,150 @@ def _get_metadata(item): return {} -def create_time_effects(otio_clip, track_item): +def create_time_effects(otio_clip, item): + # todo #2426: add retiming effects to export + pass # get all subtrack items - subTrackItems = flatten(track_item.parent().subTrackItems()) - speed = track_item.playbackSpeed() + # subTrackItems = flatten(track_item.parent().subTrackItems()) + # speed = track_item.playbackSpeed() - otio_effect = None - # retime on track item - if speed != 1.: - # make effect - otio_effect = otio.schema.LinearTimeWarp() - otio_effect.name = "Speed" - otio_effect.time_scalar = speed - otio_effect.metadata = {} + # otio_effect = None + # # retime on track item + # if speed != 1.: + # # make effect + # otio_effect = otio.schema.LinearTimeWarp() + # otio_effect.name = "Speed" + # otio_effect.time_scalar = speed + # otio_effect.metadata = {} - # freeze frame effect - if speed == 0.: - otio_effect = otio.schema.FreezeFrame() - otio_effect.name = "FreezeFrame" - otio_effect.metadata = {} + # # freeze frame effect + # if speed == 0.: + # otio_effect = otio.schema.FreezeFrame() + # otio_effect.name = "FreezeFrame" + # otio_effect.metadata = {} - if otio_effect: - # add otio effect to clip effects - otio_clip.effects.append(otio_effect) + # if otio_effect: + # # add otio effect to clip effects + # otio_clip.effects.append(otio_effect) - # loop trought and get all Timewarps - for effect in subTrackItems: - if ((track_item not in effect.linkedItems()) - and (len(effect.linkedItems()) > 0)): - continue - # avoid all effect which are not TimeWarp and disabled - if "TimeWarp" not in effect.name(): - continue + # # loop trought and get all Timewarps + # for effect in subTrackItems: + # if ((track_item not in effect.linkedItems()) + # and (len(effect.linkedItems()) > 0)): + # continue + # # avoid all effect which are not TimeWarp and disabled + # if "TimeWarp" not in effect.name(): + # continue - if not effect.isEnabled(): - continue + # if not effect.isEnabled(): + # continue - node = effect.node() - name = node["name"].value() + # node = effect.node() + # name = node["name"].value() - # solve effect class as effect name - _name = effect.name() - if "_" in _name: - effect_name = re.sub(r"(?:_)[_0-9]+", "", _name) # more numbers - else: - effect_name = re.sub(r"\d+", "", _name) # one number + # # solve effect class as effect name + # _name = effect.name() + # if "_" in _name: + # effect_name = re.sub(r"(?:_)[_0-9]+", "", _name) # more numbers + # else: + # effect_name = re.sub(r"\d+", "", _name) # one number - metadata = {} - # add knob to metadata - for knob in ["lookup", "length"]: - value = node[knob].value() - animated = node[knob].isAnimated() - if animated: - value = [ - ((node[knob].getValueAt(i)) - i) - for i in range( - track_item.timelineIn(), track_item.timelineOut() + 1) - ] + # metadata = {} + # # add knob to metadata + # for knob in ["lookup", "length"]: + # value = node[knob].value() + # animated = node[knob].isAnimated() + # if animated: + # value = [ + # ((node[knob].getValueAt(i)) - i) + # for i in range( + # track_item.timelineIn(), track_item.timelineOut() + 1) + # ] - metadata[knob] = value + # metadata[knob] = value - # make effect - otio_effect = otio.schema.TimeEffect() - otio_effect.name = name - otio_effect.effect_name = effect_name - otio_effect.metadata = metadata + # # make effect + # otio_effect = otio.schema.TimeEffect() + # otio_effect.name = name + # otio_effect.effect_name = effect_name + # otio_effect.metadata = metadata - # add otio effect to clip effects - otio_clip.effects.append(otio_effect) + # # add otio effect to clip effects + # otio_clip.effects.append(otio_effect) -def get_marker_color(tag): - icon = tag.icon() - pat = r'icons:Tag(?P\w+)\.\w+' - - res = re.search(pat, icon) - if res: - color = res.groupdict().get('color') - if color.lower() in self.marker_color_map: - return self.marker_color_map[color.lower()] +def _get_marker_color(flame_colour): + if flame_colour in self.marker_color_map: + return self.marker_color_map[flame_colour] return otio.schema.MarkerColor.RED +def _get_flame_markers(item): + output_markers = [] + + time_in = item.record_in.relative_frame + + for marker in item.markers: + log.debug(marker) + start_frame = marker.location.get_value().relative_frame + + start_frame = (start_frame - time_in) + 1 + + marker_data = { + "name": marker.name.get_value(), + "duration": marker.duration.get_value().relative_frame, + "comment": marker.comment.get_value(), + "start_frame": start_frame, + "colour": marker.colour.get_value() + } + + output_markers.append(marker_data) + + return output_markers + + def create_otio_markers(otio_item, item): - for tag in item.tags(): - if not tag.visible(): - continue - - if tag.name() == 'Copy': - # Hiero adds this tag to a lot of clips - continue - - frame_rate = utils.get_rate(item) or self.fps + markers = _get_flame_markers(item) + for marker in markers: + frame_rate = self.fps marked_range = otio.opentime.TimeRange( start_time=otio.opentime.RationalTime( - tag.inTime(), + marker["start_frame"], frame_rate ), duration=otio.opentime.RationalTime( - int(tag.metadata().dict().get('tag.length', '0')), + marker["duration"], frame_rate ) ) - # add tag metadata but remove "tag." string + + # testing the comment if it is not containing json string + check_if_json = re.findall( + re.compile(r"[{:}]"), + marker["comment"] + ) + + # to identify this as json, at least 3 items in the list should + # be present ["{", ":", "}"] metadata = {} - - for key, value in tag.metadata().dict().items(): - _key = key.replace("tag.", "") - + if len(check_if_json) >= 3: + # this is json string try: # capture exceptions which are related to strings only - _value = ast.literal_eval(value) - except (ValueError, SyntaxError): - _value = value - - metadata.update({_key: _value}) - - # Store the source item for future import assignment - metadata['hiero_source_type'] = item.__class__.__name__ + metadata.update( + json.loads(marker["comment"]) + ) + except ValueError as msg: + log.error("Marker json conversion: {}".format(msg)) + else: + metadata["comment"] = marker["comment"] marker = otio.schema.Marker( - name=tag.name(), - color=get_marker_color(tag), + name=marker["name"], + color=_get_marker_color( + marker["colour"]), marked_range=marked_range, metadata=metadata ) @@ -240,7 +266,6 @@ def create_otio_reference(clip_data): "padding": padding }) - otio_ex_ref_item = None if is_sequence: @@ -283,11 +308,16 @@ def create_otio_reference(clip_data): def create_otio_clip(clip_data): + segment = clip_data["PySegment"] + # create media reference media_reference = create_otio_reference(clip_data) + # calculate source in first_frame = utils.get_frame_from_path(clip_data["fpath"]) or 0 source_in = int(clip_data["source_in"]) - int(first_frame) + + # creatae source range source_range = create_otio_time_range( source_in, clip_data["record_duration"], @@ -300,15 +330,9 @@ def create_otio_clip(clip_data): media_reference=media_reference ) - # # Add tags as markers - # if self.include_tags: - # create_otio_markers(otio_clip, track_item) - # create_otio_markers(otio_clip, track_item.source()) - - # # only if video - # if not clip.mediaSource().hasAudio(): - # # Add effects to clips - # create_time_effects(otio_clip, track_item) + # Add markers + if self.include_markers: + create_otio_markers(otio_clip, segment) return otio_clip @@ -322,6 +346,7 @@ def create_otio_gap(gap_start, clip_start, tl_start_frame, fps): ) ) + def get_clips_in_reels(project): output_clips = [] project_desktop = project.current_workspace.desktop @@ -346,13 +371,14 @@ def get_clips_in_reels(project): version = clip.versions[-1] track = version.tracks[-1] for segment in track.segments: - segment_data = get_segment_attributes(segment) + segment_data = _get_segment_attributes(segment) clip_data.update(segment_data) output_clips.append(clip_data) return output_clips + def _get_colourspace_policy(): output = {} @@ -373,6 +399,7 @@ def _get_colourspace_policy(): ) return output + def _create_otio_timeline(sequence): metadata = _get_metadata(sequence) @@ -430,58 +457,32 @@ def add_otio_metadata(otio_item, item, **kwargs): for key, value in metadata.items(): otio_item.metadata.update({key: value}) -def get_markers(item, segment=True): - output_markers = [] - if segment: - segment_tl_in = item.record_in.relative_frame - - for marker in item.markers: - log.debug(marker) - start_frame = marker.location.get_value().relative_frame - - if segment: - start_frame = (start_frame - segment_tl_in) + 1 - - marker_data = { - "name": marker.name.get_value(), - "duration": marker.duration.get_value().relative_frame, - "comment": marker.comment.get_value(), - "start_frame": start_frame, - "colour": marker.colour.get_value() - } - - output_markers.append(marker_data) - - return output_markers - -def get_shot_tokens_values(clip, tokens): +def _get_shot_tokens_values(clip, tokens): old_value = None output = {} - shot_name = getattr(clip, "shot_name") - - if not shot_name: + if not clip.shot_name: return output - old_value = shot_name.get_value() + old_value = clip.shot_name.get_value() for token in tokens: - shot_name.set_value(token) + clip.shot_name.set_value(token) _key = re.sub("[ <>]", "", token) - try: - output[_key] = int(shot_name.get_value()) - except: - output[_key] = shot_name.get_value() - shot_name.set_value(old_value) + try: + output[_key] = int(clip.shot_name.get_value()) + except TypeError: + output[_key] = clip.shot_name.get_value() + + clip.shot_name.set_value(old_value) return output -def get_segment_attributes(segment): - # log.debug(dir(segment)) - markers = get_markers(segment) +def _get_segment_attributes(segment): + # log.debug(dir(segment)) if str(segment.name)[1:-1] == "": return None @@ -497,7 +498,7 @@ def get_segment_attributes(segment): } # add all available shot tokens - shot_tokens = get_shot_tokens_values(segment, [ + shot_tokens = _get_shot_tokens_values(segment, [ "", "", "", "", ]) clip_data.update(shot_tokens) @@ -523,6 +524,7 @@ def get_segment_attributes(segment): return clip_data + def create_otio_timeline(sequence): log.info(dir(sequence)) log.info(sequence.attributes) @@ -537,8 +539,8 @@ def create_otio_timeline(sequence): # get current timeline self.fps = float(str(sequence.frame_rate)[:-4]) self.seq_frame_start = utils.timecode_to_frames( - str(sequence.start_time).replace("+", ":"), - self.fps) + str(sequence.start_time).replace("+", ":"), + self.fps) # convert timeline to otio otio_timeline = _create_otio_timeline(sequence) @@ -555,7 +557,7 @@ def create_otio_timeline(sequence): all_segments = [] for segment in track.segments: - clip_data = get_segment_attributes(segment) + clip_data = _get_segment_attributes(segment) if not clip_data: continue all_segments.append(clip_data) From 54b5dd8d61c18e88391e07d30b0cfa41d7a56214 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 20 Dec 2021 15:35:08 +0100 Subject: [PATCH 278/341] pep8 comply --- openpype/hosts/flame/api/lib.py | 11 +++++------ openpype/hosts/flame/api/menu.py | 2 ++ openpype/hosts/flame/otio/flame_export.py | 3 ++- openpype/hosts/flame/otio/utils.py | 5 +++-- .../flame/plugins/publish/collect_test_selection.py | 4 ++-- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/openpype/hosts/flame/api/lib.py b/openpype/hosts/flame/api/lib.py index b7b815b373..80185579d6 100644 --- a/openpype/hosts/flame/api/lib.py +++ b/openpype/hosts/flame/api/lib.py @@ -258,6 +258,7 @@ def get_current_project(): def get_current_sequence(selection): import flame + def segment_to_sequence(_segment): track = _segment.parent version = track.parent @@ -291,11 +292,7 @@ def rescan_hooks(): except Exception: pass - - def get_metadata(project_name, _log=None): - import flame - from adsk.libwiretapPythonClientAPI import ( WireTapClient, WireTapServerHandle, @@ -319,7 +316,9 @@ def get_metadata(project_name, _log=None): def process(self, project_name): policy_node_handle = WireTapNodeHandle( - self._server, "/projects/{}/syncolor/policy".format(project_name)) + self._server, + "/projects/{}/syncolor/policy".format(project_name) + ) self.log.info(policy_node_handle) policy = WireTapStr() @@ -334,4 +333,4 @@ def get_metadata(project_name, _log=None): return policy.c_str() policy_wiretap = GetProjectColorPolicy(_log=_log) - return policy_wiretap.process(project_name) \ No newline at end of file + return policy_wiretap.process(project_name) diff --git a/openpype/hosts/flame/api/menu.py b/openpype/hosts/flame/api/menu.py index f216428e18..893c7a21d0 100644 --- a/openpype/hosts/flame/api/menu.py +++ b/openpype/hosts/flame/api/menu.py @@ -24,12 +24,14 @@ default_flame_export_presets = { } } + def send_selection(selection): import openpype.hosts.flame as opflame opflame.selection = selection print(opflame.selection) return True + class _FlameMenuApp(object): def __init__(self, framework): self.name = self.__class__.__name__ diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index 7a2e5744e8..a9be495bb5 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -134,7 +134,8 @@ def create_time_effects(otio_clip, item): # value = [ # ((node[knob].getValueAt(i)) - i) # for i in range( - # track_item.timelineIn(), track_item.timelineOut() + 1) + # track_item.timelineIn(), + # track_item.timelineOut() + 1) # ] # metadata[knob] = value diff --git a/openpype/hosts/flame/otio/utils.py b/openpype/hosts/flame/otio/utils.py index 640a4fabfb..74963bdd73 100644 --- a/openpype/hosts/flame/otio/utils.py +++ b/openpype/hosts/flame/otio/utils.py @@ -3,6 +3,7 @@ import opentimelineio as otio import logging log = logging.getLogger(__name__) + def timecode_to_frames(timecode, framerate): rt = otio.opentime.from_timecode(timecode, framerate) return int(otio.opentime.to_frames(rt)) @@ -44,7 +45,6 @@ def get_reformated_path(path, padded=True): else: path = path.replace(found, "%d") - return path @@ -69,6 +69,7 @@ def get_padding_from_path(path): else: return None + def get_frame_from_path(path): """ Return sequence number from Flame path style @@ -91,4 +92,4 @@ def get_frame_from_path(path): if found: return found.pop() else: - return None \ No newline at end of file + return None diff --git a/openpype/hosts/flame/plugins/publish/collect_test_selection.py b/openpype/hosts/flame/plugins/publish/collect_test_selection.py index 41847ad9b6..9a80a92414 100644 --- a/openpype/hosts/flame/plugins/publish/collect_test_selection.py +++ b/openpype/hosts/flame/plugins/publish/collect_test_selection.py @@ -3,8 +3,8 @@ import openpype.hosts.flame as opflame from openpype.hosts.flame.otio import flame_export as otio_export from openpype.hosts.flame.api import lib from pprint import pformat -reload(lib) -reload(otio_export) +reload(lib) # noqa +reload(otio_export) # noqa @pyblish.api.log From ab4bc22616aa6a552086b5ef597e1a398bbf24b1 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 20 Dec 2021 15:38:15 +0100 Subject: [PATCH 279/341] pep8 comply --- openpype/hosts/flame/api/lib.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/flame/api/lib.py b/openpype/hosts/flame/api/lib.py index 80185579d6..96bffab774 100644 --- a/openpype/hosts/flame/api/lib.py +++ b/openpype/hosts/flame/api/lib.py @@ -292,13 +292,13 @@ def rescan_hooks(): except Exception: pass + def get_metadata(project_name, _log=None): from adsk.libwiretapPythonClientAPI import ( WireTapClient, WireTapServerHandle, WireTapNodeHandle, - WireTapStr, - WireTapInt + WireTapStr ) class GetProjectColorPolicy(object): From 5fed85f647c430161ba99f93684a8039ee4ee5a2 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 20 Dec 2021 16:04:49 +0100 Subject: [PATCH 280/341] typo --- openpype/hosts/flame/otio/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/flame/otio/utils.py b/openpype/hosts/flame/otio/utils.py index 74963bdd73..229946343b 100644 --- a/openpype/hosts/flame/otio/utils.py +++ b/openpype/hosts/flame/otio/utils.py @@ -14,7 +14,7 @@ def frames_to_timecode(frames, framerate): return otio.opentime.to_timecode(rt) -def frames_to_secons(frames, framerate): +def frames_to_seconds(frames, framerate): rt = otio.opentime.from_frames(frames, framerate) return otio.opentime.to_seconds(rt) From 9802d01b0b2798e95e3ec947128edb85682e37af Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 20 Dec 2021 17:30:44 +0100 Subject: [PATCH 281/341] removing self from module and replacing with context class --- openpype/hosts/flame/otio/flame_export.py | 80 ++++++++++++++++------- 1 file changed, 55 insertions(+), 25 deletions(-) diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index a9be495bb5..c149d12d70 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -16,16 +16,12 @@ reload(utils) # noqa log = logging.getLogger(__name__) -self = sys.modules[__name__] -self.track_types = { + +TRACK_TYPES = { "video": otio.schema.TrackKind.Video, "audio": otio.schema.TrackKind.Audio } -self.fps = None -self.seq_frame_start = None -self.project = None -self.clips = None -self.marker_color_map = { +MARKERS_COLOR_MAP = { "magenta": otio.schema.MarkerColor.MAGENTA, "red": otio.schema.MarkerColor.RED, "yellow": otio.schema.MarkerColor.YELLOW, @@ -38,7 +34,37 @@ self.marker_color_map = { "pink": otio.schema.MarkerColor.PINK, "black": otio.schema.MarkerColor.BLACK, } -self.include_markers = True +MARKERS_INCLUDE = True + + +class CTX: + _fps = None + _tl_start_frame = None + project = None + clips = None + + @classmethod + def set_fps(cls, new_fps): + if not isinstance(new_fps, float): + raise TypeError("Invalid fps type {}".format(type(new_fps))) + if cls._fps != new_fps: + cls._fps = new_fps + + @classmethod + def get_fps(cls): + return cls._fps + + @classmethod + def set_tl_start_frame(cls, number): + if not isinstance(number, int): + raise TypeError("Invalid timeline start frame type {}".format( + type(number))) + if cls._tl_start_frame != number: + cls._tl_start_frame = number + + @classmethod + def get_tl_start_frame(cls): + return cls._tl_start_frame def flatten(_list): @@ -151,8 +177,8 @@ def create_time_effects(otio_clip, item): def _get_marker_color(flame_colour): - if flame_colour in self.marker_color_map: - return self.marker_color_map[flame_colour] + if flame_colour in MARKERS_COLOR_MAP: + return MARKERS_COLOR_MAP[flame_colour] return otio.schema.MarkerColor.RED @@ -184,7 +210,7 @@ def _get_flame_markers(item): def create_otio_markers(otio_item, item): markers = _get_flame_markers(item) for marker in markers: - frame_rate = self.fps + frame_rate = CTX.get_fps() marked_range = otio.opentime.TimeRange( start_time=otio.opentime.RationalTime( @@ -234,13 +260,13 @@ def create_otio_reference(clip_data): # get file info for path and start frame frame_start = 0 - fps = self.fps + fps = CTX.get_fps() path = clip_data["fpath"] reel_clip = None match_reel_clip = [ - clip for clip in self.clips + clip for clip in CTX.clips if clip["fpath"] == path ] if match_reel_clip: @@ -322,7 +348,7 @@ def create_otio_clip(clip_data): source_range = create_otio_time_range( source_in, clip_data["record_duration"], - self.fps + CTX.get_fps() ) otio_clip = otio.schema.Clip( @@ -332,7 +358,7 @@ def create_otio_clip(clip_data): ) # Add markers - if self.include_markers: + if MARKERS_INCLUDE: create_otio_markers(otio_clip, segment) return otio_clip @@ -385,7 +411,7 @@ def _get_colourspace_policy(): output = {} # get policies project path policy_dir = "/opt/Autodesk/project/{}/synColor/policy".format( - self.project.name + CTX.project.name ) log.debug(policy_dir) policy_fp = os.path.join(policy_dir, "policy.cfg") @@ -416,7 +442,7 @@ def _create_otio_timeline(sequence): }) rt_start_time = create_otio_rational_time( - self.seq_frame_start, self.fps) + CTX.get_tl_start_frame(), CTX.get_fps()) return otio.schema.Timeline( name=str(sequence.name)[1:-1], @@ -428,7 +454,7 @@ def _create_otio_timeline(sequence): def create_otio_track(track_type, track_name): return otio.schema.Track( name=track_name, - kind=self.track_types[track_type] + kind=TRACK_TYPES[track_type] ) @@ -440,7 +466,7 @@ def add_otio_gap(clip_data, otio_track, prev_out): gap = otio.opentime.TimeRange( duration=otio.opentime.RationalTime( gap_length, - self.fps + CTX.get_fps() ) ) otio_gap = otio.schema.Gap(source_range=gap) @@ -530,18 +556,22 @@ def create_otio_timeline(sequence): log.info(dir(sequence)) log.info(sequence.attributes) - self.project = get_current_flame_project() - self.clips = get_clips_in_reels(self.project) + CTX.project = get_current_flame_project() + CTX.clips = get_clips_in_reels(CTX.project) log.debug(pformat( - self.clips + CTX.clips )) # get current timeline - self.fps = float(str(sequence.frame_rate)[:-4]) - self.seq_frame_start = utils.timecode_to_frames( + CTX.set_fps( + float(str(sequence.frame_rate)[:-4])) + + tl_start_frame = utils.timecode_to_frames( str(sequence.start_time).replace("+", ":"), - self.fps) + CTX.get_fps() + ) + CTX.set_tl_start_frame(tl_start_frame) # convert timeline to otio otio_timeline = _create_otio_timeline(sequence) From 25c6ce08e4965e60da35b7359d73fce4bf011477 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 20 Dec 2021 18:06:42 +0100 Subject: [PATCH 282/341] fix markers creation and token conversion --- openpype/hosts/flame/otio/flame_export.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index c149d12d70..6897c4d818 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -244,7 +244,7 @@ def create_otio_markers(otio_item, item): else: metadata["comment"] = marker["comment"] - marker = otio.schema.Marker( + otio_marker = otio.schema.Marker( name=marker["name"], color=_get_marker_color( marker["colour"]), @@ -252,7 +252,7 @@ def create_otio_markers(otio_item, item): metadata=metadata ) - otio_item.markers.append(marker) + otio_item.markers.append(otio_marker) def create_otio_reference(clip_data): @@ -500,7 +500,7 @@ def _get_shot_tokens_values(clip, tokens): try: output[_key] = int(clip.shot_name.get_value()) - except TypeError: + except ValueError: output[_key] = clip.shot_name.get_value() clip.shot_name.set_value(old_value) From 897cc0946fbd5719f77d98c46eac7c2eb77622f6 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 21 Dec 2021 10:41:52 +0100 Subject: [PATCH 283/341] color schemas --- openpype/hosts/flame/otio/flame_export.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index 6897c4d818..356cf1b49e 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -22,17 +22,17 @@ TRACK_TYPES = { "audio": otio.schema.TrackKind.Audio } MARKERS_COLOR_MAP = { - "magenta": otio.schema.MarkerColor.MAGENTA, - "red": otio.schema.MarkerColor.RED, - "yellow": otio.schema.MarkerColor.YELLOW, - "green": otio.schema.MarkerColor.GREEN, - "cyan": otio.schema.MarkerColor.CYAN, - "white": otio.schema.MarkerColor.WHITE, - "orange": otio.schema.MarkerColor.ORANGE, - "blue": otio.schema.MarkerColor.BLUE, - "purple": otio.schema.MarkerColor.PURPLE, - "pink": otio.schema.MarkerColor.PINK, - "black": otio.schema.MarkerColor.BLACK, + (1.0, 0.0, 0.0): otio.schema.MarkerColor.RED, + (1.0, 0.5, 0.0): otio.schema.MarkerColor.ORANGE, + (1.0, 1.0, 0.0): otio.schema.MarkerColor.YELLOW, + (1.0, 0.5, 1.0): otio.schema.MarkerColor.PINK, + (1.0, 1.0, 1.0): otio.schema.MarkerColor.WHITE, + (0.0, 1.0, 0.0): otio.schema.MarkerColor.GREEN, + (0.0, 1.0, 1.0): otio.schema.MarkerColor.CYAN, + (0.0, 0.0, 1.0): otio.schema.MarkerColor.BLUE, + (0.5, 0.0, 0.5): otio.schema.MarkerColor.PURPLE, + (0.5, 0.0, 1.0): otio.schema.MarkerColor.MAGENTA, + (0.0, 0.0, 0.0): otio.schema.MarkerColor.BLACK } MARKERS_INCLUDE = True From c814e04691546032b1a6fe2937b2a4a8382396e3 Mon Sep 17 00:00:00 2001 From: 2-REC Date: Tue, 21 Dec 2021 17:35:29 +0700 Subject: [PATCH 284/341] Check min length of plugin path --- openpype/lib/plugin_tools.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/openpype/lib/plugin_tools.py b/openpype/lib/plugin_tools.py index 2a859da7cb..8de5f641eb 100644 --- a/openpype/lib/plugin_tools.py +++ b/openpype/lib/plugin_tools.py @@ -227,20 +227,27 @@ def filter_pyblish_plugins(plugins): # iterate over plugins for plugin in plugins[:]: - file = os.path.normpath(inspect.getsourcefile(plugin)) - file = os.path.normpath(file) - - # host determined from path - host_from_file = file.split(os.path.sep)[-4:-3][0] - plugin_kind = file.split(os.path.sep)[-2:-1][0] - - # TODO: change after all plugins are moved one level up - if host_from_file == "openpype": - host_from_file = "global" - try: config_data = presets[host]["publish"][plugin.__name__] except KeyError: + # host determined from path + file = os.path.normpath(inspect.getsourcefile(plugin)) + file = os.path.normpath(file) + + split_path = file.split(os.path.sep) + if len(split_path) < 4: + log.warning( + 'plugin path too short to extract host {}'.format(file) + ) + continue + + host_from_file = split_path[-4:-3][0] + plugin_kind = split_path[-2:-1][0] + + # TODO: change after all plugins are moved one level up + if host_from_file == "openpype": + host_from_file = "global" + try: config_data = presets[host_from_file][plugin_kind][plugin.__name__] # noqa: E501 except KeyError: From 6d15256840d39d07b8e4c3d1e4a20f8b715027c5 Mon Sep 17 00:00:00 2001 From: 2-REC Date: Tue, 21 Dec 2021 17:38:39 +0700 Subject: [PATCH 285/341] Simplified indexing --- openpype/lib/plugin_tools.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/lib/plugin_tools.py b/openpype/lib/plugin_tools.py index 8de5f641eb..7c66f9760d 100644 --- a/openpype/lib/plugin_tools.py +++ b/openpype/lib/plugin_tools.py @@ -241,8 +241,8 @@ def filter_pyblish_plugins(plugins): ) continue - host_from_file = split_path[-4:-3][0] - plugin_kind = split_path[-2:-1][0] + host_from_file = split_path[-4] + plugin_kind = split_path[-2] # TODO: change after all plugins are moved one level up if host_from_file == "openpype": From 9b0e2c3e8beccc86fdbfa317080008cfa8e2d9b3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 21 Dec 2021 13:21:31 +0100 Subject: [PATCH 286/341] added new exception PublishXmlValidationError --- openpype/pipeline/publish/__init__.py | 8 ++- openpype/pipeline/publish/lib.py | 57 ++++++++++++++++++++ openpype/pipeline/publish/publish_plugins.py | 25 ++++++++- 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/openpype/pipeline/publish/__init__.py b/openpype/pipeline/publish/__init__.py index ca958816fe..d106f28617 100644 --- a/openpype/pipeline/publish/__init__.py +++ b/openpype/pipeline/publish/__init__.py @@ -6,7 +6,9 @@ from .publish_plugins import ( from .lib import ( DiscoverResult, - publish_plugins_discover + publish_plugins_discover, + load_help_content_from_plugin, + load_help_content_from_filepath ) @@ -16,5 +18,7 @@ __all__ = ( "OpenPypePyblishPluginMixin", "DiscoverResult", - "publish_plugins_discover" + "publish_plugins_discover", + "load_help_content_from_plugin", + "load_help_content_from_filepath" ) diff --git a/openpype/pipeline/publish/lib.py b/openpype/pipeline/publish/lib.py index 0fa712a301..aa30ac22c9 100644 --- a/openpype/pipeline/publish/lib.py +++ b/openpype/pipeline/publish/lib.py @@ -1,6 +1,8 @@ import os import sys import types +import inspect +import xml.etree.ElementTree import six import pyblish.plugin @@ -28,6 +30,61 @@ class DiscoverResult: self.plugins[item] = value +class HelpContent: + def __init__(self, title, description, detail=None): + self.title = title + self.description = description + self.detail = detail + + +def load_help_content_from_filepath(filepath): + """Load help content from xml file. + + Xml file may containt errors and warnings. + """ + errors = {} + warnings = {} + output = { + "errors": errors, + "warnings": warnings + } + if not os.path.exists(filepath): + return output + tree = xml.etree.ElementTree.parse(filepath) + root = tree.getroot() + for child in root: + child_id = child.attrib.get("id") + if child_id is None: + continue + + # Make sure ID is string + child_id = str(child_id) + + title = child.find("title").text + description = child.find("description").text + detail_node = child.find("detail") + detail = None + if detail_node: + detail = detail_node.text + if child.tag == "error": + errors[child_id] = HelpContent(title, description, detail) + elif child.tag == "warning": + warnings[child_id] = HelpContent(title, description, detail) + return output + + +def load_help_content_from_plugin(plugin): + cls = plugin + if not inspect.isclass(plugin): + cls = plugin.__class__ + plugin_filepath = inspect.getfile(cls) + plugin_dir = os.path.dirname(plugin_filepath) + basename = os.path.splitext(os.path.basename(plugin_filepath))[0] + filename = basename + ".xml" + filepath = os.path.join(plugin_dir, "help", filename) + return load_help_content_from_filepath(filepath) + + def publish_plugins_discover(paths=None): """Find and return available pyblish plug-ins diff --git a/openpype/pipeline/publish/publish_plugins.py b/openpype/pipeline/publish/publish_plugins.py index b60b9f43a7..9a73d1acc6 100644 --- a/openpype/pipeline/publish/publish_plugins.py +++ b/openpype/pipeline/publish/publish_plugins.py @@ -1,3 +1,6 @@ +from .lib import load_help_content_from_plugin + + class PublishValidationError(Exception): """Validation error happened during publishing. @@ -12,13 +15,33 @@ class PublishValidationError(Exception): description(str): Detailed description of an error. It is possible to use Markdown syntax. """ - def __init__(self, message, title=None, description=None): + def __init__(self, message, title=None, description=None, detail=None): self.message = message self.title = title or "< Missing title >" self.description = description or message + self.detail = detail super(PublishValidationError, self).__init__(message) +class PublishXmlValidationError(PublishValidationError): + def __init__( + self, message, plugin, key=None, *formattings_arg, **formatting_kwargs + ): + if key is None: + key = "main" + result = load_help_content_from_plugin(plugin) + content_obj = result["errors"][key] + description = content_obj.description.format( + *formattings_arg, **formatting_kwargs + ) + detail = content_obj.detail.format( + *formattings_arg, **formatting_kwargs + ) + super(PublishXmlValidationError, self).__init__( + message, content_obj.title, description, detail + ) + + class KnownPublishError(Exception): """Publishing crashed because of known error. From c5b9a0bd05ecf8764b2418cdf1fbba0746f02cc2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 21 Dec 2021 13:22:11 +0100 Subject: [PATCH 287/341] added PublishXmlValidationError to 'pipeline.publish' --- openpype/pipeline/publish/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openpype/pipeline/publish/__init__.py b/openpype/pipeline/publish/__init__.py index d106f28617..228c4d8dcb 100644 --- a/openpype/pipeline/publish/__init__.py +++ b/openpype/pipeline/publish/__init__.py @@ -1,5 +1,6 @@ from .publish_plugins import ( PublishValidationError, + PublishXmlValidationError, KnownPublishError, OpenPypePyblishPluginMixin ) @@ -14,6 +15,7 @@ from .lib import ( __all__ = ( "PublishValidationError", + "PublishXmlValidationError", "KnownPublishError", "OpenPypePyblishPluginMixin", From d5b24781bb53234bf9942ab50d1760113d4f8fbd Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 21 Dec 2021 13:25:13 +0100 Subject: [PATCH 288/341] reduced formatting possibilities --- openpype/pipeline/publish/publish_plugins.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/openpype/pipeline/publish/publish_plugins.py b/openpype/pipeline/publish/publish_plugins.py index 9a73d1acc6..78dbaf2ddc 100644 --- a/openpype/pipeline/publish/publish_plugins.py +++ b/openpype/pipeline/publish/publish_plugins.py @@ -25,18 +25,17 @@ class PublishValidationError(Exception): class PublishXmlValidationError(PublishValidationError): def __init__( - self, message, plugin, key=None, *formattings_arg, **formatting_kwargs + self, message, plugin, key=None, formatting_data=None ): if key is None: key = "main" + + if not formatting_data: + formatting_data = {} result = load_help_content_from_plugin(plugin) content_obj = result["errors"][key] - description = content_obj.description.format( - *formattings_arg, **formatting_kwargs - ) - detail = content_obj.detail.format( - *formattings_arg, **formatting_kwargs - ) + description = content_obj.description.format(**formatting_data) + detail = content_obj.detail.format(**formatting_data) super(PublishXmlValidationError, self).__init__( message, content_obj.title, description, detail ) From a05a6785584e7efa5e6f93e9939c5e91b80038b2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 21 Dec 2021 13:50:05 +0100 Subject: [PATCH 289/341] imported PublishXmlValidationError to 'openpype.pipeline' level --- openpype/pipeline/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openpype/pipeline/__init__.py b/openpype/pipeline/__init__.py index e968df4011..79d6ce4d54 100644 --- a/openpype/pipeline/__init__.py +++ b/openpype/pipeline/__init__.py @@ -9,6 +9,7 @@ from .create import ( from .publish import ( PublishValidationError, + PublishXmlValidationError, KnownPublishError, OpenPypePyblishPluginMixin ) @@ -23,6 +24,7 @@ __all__ = ( "CreatedInstance", "PublishValidationError", + "PublishXmlValidationError", "KnownPublishError", "OpenPypePyblishPluginMixin" ) From fe3af18101de12804bc9361c5c121e4c4238aa74 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 21 Dec 2021 13:53:17 +0100 Subject: [PATCH 290/341] swapped plugin and message args order --- openpype/pipeline/publish/publish_plugins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/pipeline/publish/publish_plugins.py b/openpype/pipeline/publish/publish_plugins.py index 78dbaf2ddc..48fa2499b8 100644 --- a/openpype/pipeline/publish/publish_plugins.py +++ b/openpype/pipeline/publish/publish_plugins.py @@ -25,7 +25,7 @@ class PublishValidationError(Exception): class PublishXmlValidationError(PublishValidationError): def __init__( - self, message, plugin, key=None, formatting_data=None + self, plugin, message, key=None, formatting_data=None ): if key is None: key = "main" From 5683dda65d2f17ec17efc2d4f749d95324295236 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 21 Dec 2021 14:05:12 +0100 Subject: [PATCH 291/341] do not format empty detail --- openpype/pipeline/publish/publish_plugins.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openpype/pipeline/publish/publish_plugins.py b/openpype/pipeline/publish/publish_plugins.py index 48fa2499b8..bce64ec709 100644 --- a/openpype/pipeline/publish/publish_plugins.py +++ b/openpype/pipeline/publish/publish_plugins.py @@ -35,7 +35,9 @@ class PublishXmlValidationError(PublishValidationError): result = load_help_content_from_plugin(plugin) content_obj = result["errors"][key] description = content_obj.description.format(**formatting_data) - detail = content_obj.detail.format(**formatting_data) + detail = content_obj.detail + if detail: + detail = detail.format(**formatting_data) super(PublishXmlValidationError, self).__init__( message, content_obj.title, description, detail ) From d6b386583633c0c510f6b54a6b0999f7312f8e75 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 21 Dec 2021 14:06:27 +0100 Subject: [PATCH 292/341] fix detail node bool --- openpype/pipeline/publish/lib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/pipeline/publish/lib.py b/openpype/pipeline/publish/lib.py index aa30ac22c9..f38e73afe2 100644 --- a/openpype/pipeline/publish/lib.py +++ b/openpype/pipeline/publish/lib.py @@ -64,7 +64,7 @@ def load_help_content_from_filepath(filepath): description = child.find("description").text detail_node = child.find("detail") detail = None - if detail_node: + if detail_node is not None: detail = detail_node.text if child.tag == "error": errors[child_id] = HelpContent(title, description, detail) From 0c7a12c1f22938704c3c70bdd9ee375a8c5366d5 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 21 Dec 2021 15:59:00 +0100 Subject: [PATCH 293/341] Implemented validators for New publisher for Photoshop --- .../publish/help/validate_instance_asset.xml | 25 +++++++++++++++++++ .../plugins/publish/help/validate_naming.xml | 21 ++++++++++++++++ .../publish/help/validate_unique_subsets.xml | 23 +++++++++++++++++ .../publish/validate_instance_asset.py | 12 +++++++-- .../plugins/publish/validate_naming.py | 22 ++++++++++------ .../publish/validate_unique_subsets.py | 23 +++++++++++++---- 6 files changed, 111 insertions(+), 15 deletions(-) create mode 100644 openpype/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml create mode 100644 openpype/hosts/photoshop/plugins/publish/help/validate_naming.xml create mode 100644 openpype/hosts/photoshop/plugins/publish/help/validate_unique_subsets.xml diff --git a/openpype/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml b/openpype/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml new file mode 100644 index 0000000000..3b040e8ea8 --- /dev/null +++ b/openpype/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml @@ -0,0 +1,25 @@ + + + +Subset context + +## Invalid subset context + +Asset name found '{found}' in subsets, expected '{expected}'. + +### How to repair? + +You can fix this with `Repair` button on the right. This will use '{expected}' asset name and overwrite '{found}' asset name in scene metadata. + +After that restart `Publish` with a `Reload button`. + +If this is unwanted, close workfile and open again, that way different asset value would be used for context information. + + +### __Detailed Info__ (optional) + +This might happen if you are reuse old workfile and open it in different context. +(Eg. you created subset "renderCompositingDefault" from asset "Robot' in "your_project_Robot_compositing.aep", now you opened this workfile in a context "Sloth" but existing subset for "Robot" asset stayed in the workfile.) + + + \ No newline at end of file diff --git a/openpype/hosts/photoshop/plugins/publish/help/validate_naming.xml b/openpype/hosts/photoshop/plugins/publish/help/validate_naming.xml new file mode 100644 index 0000000000..21a7370340 --- /dev/null +++ b/openpype/hosts/photoshop/plugins/publish/help/validate_naming.xml @@ -0,0 +1,21 @@ + + + +Invalid name + +## Invalid name of subset + +Name of subset is created from a layer name. Some characters (whitespace, '/' etc.) are not allowed because of publishing (files couldn't be saved on some OSes). + +### How to repair? + +You can fix this with `Repair` button on the right. This will remove invalid characters with safe character ('_' by default) in both subset names and matching group names. + +After that restart `Publish` with a `Reload button`. + +Or you use `Subset Manager` to delete existing subsets, remove created groups, rename layers that are used for their creation and use `Create` option in the Openpype menu to create them again. + +Invalid characters and 'safe character' could be configured in Settings. Ask your OpenPype admin to modify them if necessary. + + + \ No newline at end of file diff --git a/openpype/hosts/photoshop/plugins/publish/help/validate_unique_subsets.xml b/openpype/hosts/photoshop/plugins/publish/help/validate_unique_subsets.xml new file mode 100644 index 0000000000..fa7c76a2dd --- /dev/null +++ b/openpype/hosts/photoshop/plugins/publish/help/validate_unique_subsets.xml @@ -0,0 +1,23 @@ + + + +Subsets duplicated + +## Some subsets are duplicated + +Created subsets must be unique. + +Subsets '{duplicates_str}' are duplicated. + +### How to repair? + +Use `Subset Manager` to delete duplicated subset to have only unique subset names and restart `Publish` with a `Reload button`. + + +### __Detailed Info__ (optional) + +Subset names are created from layer names. Layer names are filtered for characters that would break publishing process when files are created. +This replacement process might result in duplicate names of subsets. + + + \ No newline at end of file diff --git a/openpype/hosts/photoshop/plugins/publish/validate_instance_asset.py b/openpype/hosts/photoshop/plugins/publish/validate_instance_asset.py index 4dc1972074..8f13cc6b33 100644 --- a/openpype/hosts/photoshop/plugins/publish/validate_instance_asset.py +++ b/openpype/hosts/photoshop/plugins/publish/validate_instance_asset.py @@ -1,8 +1,10 @@ from avalon import api import pyblish.api -import openpype.api from avalon import photoshop +import openpype.api +from openpype.pipeline import PublishXmlValidationError + class ValidateInstanceAssetRepair(pyblish.api.Action): """Repair the instance asset.""" @@ -56,4 +58,10 @@ class ValidateInstanceAsset(pyblish.api.InstancePlugin): f"If that's not correct value, close workfile and " f"reopen via Workfiles!" ) - assert instance_asset == current_asset, msg + formatting_data = { + "found": instance_asset, + "expected": current_asset + } + if instance_asset != current_asset: + raise PublishXmlValidationError(self, msg, + formatting_data=formatting_data) diff --git a/openpype/hosts/photoshop/plugins/publish/validate_naming.py b/openpype/hosts/photoshop/plugins/publish/validate_naming.py index 1635096f4b..d548992f09 100644 --- a/openpype/hosts/photoshop/plugins/publish/validate_naming.py +++ b/openpype/hosts/photoshop/plugins/publish/validate_naming.py @@ -1,9 +1,11 @@ import re import pyblish.api -import openpype.api from avalon import photoshop +import openpype.api +from openpype.pipeline import PublishXmlValidationError + class ValidateNamingRepair(pyblish.api.Action): """Repair the instance asset.""" @@ -69,14 +71,18 @@ class ValidateNaming(pyblish.api.InstancePlugin): replace_char = '' def process(self, instance): - help_msg = ' Use Repair action (A) in Pyblish to fix it.' - msg = "Name \"{}\" is not allowed.{}".format(instance.data["name"], - help_msg) - assert not re.search(self.invalid_chars, instance.data["name"]), msg + msg = "Name \"{}\" is not allowed.".format(instance.data["name"]) - msg = "Subset \"{}\" is not allowed.{}".format(instance.data["subset"], - help_msg) - assert not re.search(self.invalid_chars, instance.data["subset"]), msg + formatting_data = {"error_msg": msg} + if re.search(self.invalid_chars, instance.data["name"]): + raise PublishXmlValidationError(self, msg, + formatting_data=formatting_data) + + msg = "Subset \"{}\" is not allowed.".format(instance.data["subset"]) + formatting_data = {"error_msg": msg} + if re.search(self.invalid_chars, instance.data["subset"]): + raise PublishXmlValidationError(self, msg, + formatting_data=formatting_data) @classmethod def get_replace_chars(cls): diff --git a/openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py b/openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py index 15ae5fbcea..d41fefa971 100644 --- a/openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py +++ b/openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py @@ -1,5 +1,8 @@ +import collections + import pyblish.api import openpype.api +from openpype.pipeline import PublishXmlValidationError class ValidateSubsetUniqueness(pyblish.api.ContextPlugin): @@ -19,8 +22,18 @@ class ValidateSubsetUniqueness(pyblish.api.ContextPlugin): if instance.data.get('publish'): subset_names.append(instance.data.get('subset')) - msg = ( - "Instance subset names are not unique. " + - "Remove duplicates via SubsetManager." - ) - assert len(subset_names) == len(set(subset_names)), msg + duplicates = [item + for item, count in + collections.Counter(subset_names).items() + if count > 1] + + if duplicates: + duplicates_str = ",".join(duplicates) + formatting_data = {"duplicates_str": duplicates_str} + msg = ( + "Instance subset names {} are not unique.".format( + duplicates_str) + + " Remove duplicates via SubsetManager." + ) + raise PublishXmlValidationError(self, msg, + formatting_data=formatting_data) From 96da6a07f612d0a1357f4e46640919b38001d750 Mon Sep 17 00:00:00 2001 From: OpenPype Date: Wed, 22 Dec 2021 03:42:14 +0000 Subject: [PATCH 294/341] [Automated] Bump version --- CHANGELOG.md | 20 +++++--------------- openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1eb8455a09..0c6d1b8fe1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [3.7.0-nightly.9](https://github.com/pypeclub/OpenPype/tree/HEAD) +## [3.7.0-nightly.10](https://github.com/pypeclub/OpenPype/tree/HEAD) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...HEAD) @@ -8,14 +8,12 @@ - General: Default modules hierarchy n2 [\#2368](https://github.com/pypeclub/OpenPype/pull/2368) -**🆕 New features** - -- Settings UI use OpenPype styles [\#2296](https://github.com/pypeclub/OpenPype/pull/2296) - **🚀 Enhancements** +- General: Environment variables groups [\#2424](https://github.com/pypeclub/OpenPype/pull/2424) - Settings UI: Hyperlinks to settings [\#2420](https://github.com/pypeclub/OpenPype/pull/2420) - Modules: JobQueue module moved one hierarchy level higher [\#2419](https://github.com/pypeclub/OpenPype/pull/2419) +- TimersManager: Start timer post launch hook [\#2418](https://github.com/pypeclub/OpenPype/pull/2418) - Ftrack: Check existence of object type on recreation [\#2404](https://github.com/pypeclub/OpenPype/pull/2404) - Flame: moving `utility\_scripts` to api folder also with `scripts` [\#2385](https://github.com/pypeclub/OpenPype/pull/2385) - Centos 7 dependency compatibility [\#2384](https://github.com/pypeclub/OpenPype/pull/2384) @@ -27,18 +25,14 @@ - Burnins: Be able recognize mxf OPAtom format [\#2361](https://github.com/pypeclub/OpenPype/pull/2361) - Maya: Add is\_static\_image\_plane and is\_in\_all\_views option in imagePlaneLoader [\#2356](https://github.com/pypeclub/OpenPype/pull/2356) - Local settings: Copyable studio paths [\#2349](https://github.com/pypeclub/OpenPype/pull/2349) -- Assets Widget: Clear model on project change [\#2345](https://github.com/pypeclub/OpenPype/pull/2345) -- General: OpenPype default modules hierarchy [\#2338](https://github.com/pypeclub/OpenPype/pull/2338) -- General: FFprobe error exception contain original error message [\#2328](https://github.com/pypeclub/OpenPype/pull/2328) -- Resolve: Add experimental button to menu [\#2325](https://github.com/pypeclub/OpenPype/pull/2325) -- General: Reduce vendor imports [\#2305](https://github.com/pypeclub/OpenPype/pull/2305) -- Ftrack: Synchronize input links [\#2287](https://github.com/pypeclub/OpenPype/pull/2287) +- General: Multilayer EXRs support [\#2315](https://github.com/pypeclub/OpenPype/pull/2315) **🐛 Bug fixes** - PS: Introduced settings for invalid characters to use in ValidateNaming plugin [\#2417](https://github.com/pypeclub/OpenPype/pull/2417) - Settings UI: Breadcrumbs path does not create new entities [\#2416](https://github.com/pypeclub/OpenPype/pull/2416) - AfterEffects: Variant 2022 is in defaults but missing in schemas [\#2412](https://github.com/pypeclub/OpenPype/pull/2412) +- Nuke: baking representations was not additive [\#2406](https://github.com/pypeclub/OpenPype/pull/2406) - General: Fix access to environments from default settings [\#2403](https://github.com/pypeclub/OpenPype/pull/2403) - Fix: Placeholder Input color set fix [\#2399](https://github.com/pypeclub/OpenPype/pull/2399) - Settings: Fix state change of wrapper label [\#2396](https://github.com/pypeclub/OpenPype/pull/2396) @@ -53,12 +47,9 @@ - Launcher: Minimize button on MacOs [\#2355](https://github.com/pypeclub/OpenPype/pull/2355) - StandalonePublisher: Fix import of constant [\#2354](https://github.com/pypeclub/OpenPype/pull/2354) - Adobe products show issue [\#2347](https://github.com/pypeclub/OpenPype/pull/2347) -- Maya Look Assigner: Fix Python 3 compatibility [\#2343](https://github.com/pypeclub/OpenPype/pull/2343) - Remove wrongly used host for hook [\#2342](https://github.com/pypeclub/OpenPype/pull/2342) - Tools: Use Qt context on tools show [\#2340](https://github.com/pypeclub/OpenPype/pull/2340) - Flame: Fix default argument value in custom dictionary [\#2339](https://github.com/pypeclub/OpenPype/pull/2339) -- Timers Manager: Disable auto stop timer on linux platform [\#2334](https://github.com/pypeclub/OpenPype/pull/2334) -- Fix - provider icons are pulled from a folder [\#2326](https://github.com/pypeclub/OpenPype/pull/2326) - Royal Render: Fix plugin order and OpenPype auto-detection [\#2291](https://github.com/pypeclub/OpenPype/pull/2291) **Merged pull requests:** @@ -67,7 +58,6 @@ - Add validator to check correct version of extension for PS and AE [\#2387](https://github.com/pypeclub/OpenPype/pull/2387) - Linux : flip updating submodules logic [\#2357](https://github.com/pypeclub/OpenPype/pull/2357) - Update of avalon-core [\#2346](https://github.com/pypeclub/OpenPype/pull/2346) -- Maya: configurable model top level validation [\#2321](https://github.com/pypeclub/OpenPype/pull/2321) ## [3.6.4](https://github.com/pypeclub/OpenPype/tree/3.6.4) (2021-11-23) diff --git a/openpype/version.py b/openpype/version.py index 544160d41c..273755dfd0 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.7.0-nightly.9" +__version__ = "3.7.0-nightly.10" diff --git a/pyproject.toml b/pyproject.toml index 07a9ac8e43..ea6d9ee5e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.7.0-nightly.9" # OpenPype +version = "3.7.0-nightly.10" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From 5efef322a6415aa0ebb4c985a00e26d1341ab9e0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 22 Dec 2021 11:37:31 +0100 Subject: [PATCH 295/341] added attribute log_mongo_url_components back for older builds --- openpype/lib/log.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openpype/lib/log.py b/openpype/lib/log.py index a34cb898e3..a42faef008 100644 --- a/openpype/lib/log.py +++ b/openpype/lib/log.py @@ -202,6 +202,11 @@ class PypeLogger: use_mongo_logging = None mongo_process_id = None + # Backwards compatibility - was used in start.py + # TODO remove when all old builds are replaced with new one + # not using 'log_mongo_url_components' + log_mongo_url_components = None + # Database name in Mongo log_database_name = os.environ["OPENPYPE_DATABASE_NAME"] # Collection name under database in Mongo @@ -320,6 +325,7 @@ class PypeLogger: # Change initialization state to prevent runtime changes # if is executed during runtime cls.initialized = False + cls.log_mongo_url_components = get_default_components() # Define if should logging to mongo be used use_mongo_logging = bool(log4mongo is not None) From 1914c144cd2998dc40c5253f8ea9597648d51ad5 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 22 Dec 2021 11:38:43 +0100 Subject: [PATCH 296/341] uses get_default_components for log components --- start.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/start.py b/start.py index ae6aefe34e..b5a8d95fd0 100644 --- a/start.py +++ b/start.py @@ -1109,15 +1109,15 @@ def get_info(use_staging=None) -> list: # Reinitialize PypeLogger.initialize() - log_components = PypeLogger.log_mongo_url_components - if log_components["host"]: - inf.append(("Logging to MongoDB", log_components["host"])) - inf.append((" - port", log_components["port"] or "")) + mongo_components = get_default_components() + if mongo_components["host"]: + inf.append(("Logging to MongoDB", mongo_components["host"])) + inf.append((" - port", mongo_components["port"] or "")) inf.append((" - database", PypeLogger.log_database_name)) inf.append((" - collection", PypeLogger.log_collection_name)) - inf.append((" - user", log_components["username"] or "")) - if log_components["auth_db"]: - inf.append((" - auth source", log_components["auth_db"])) + inf.append((" - user", mongo_components["username"] or "")) + if mongo_components["auth_db"]: + inf.append((" - auth source", mongo_components["auth_db"])) maximum = max(len(i[0]) for i in inf) formatted = [] From beeea44cb952412b1e4b1d78f0e78340aa5c68c3 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 22 Dec 2021 13:09:14 +0100 Subject: [PATCH 297/341] Forced cx_freeze to include sqlite3 into build because of pytest requirements --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index cd3ed4f82c..a21645e66a 100644 --- a/setup.py +++ b/setup.py @@ -48,7 +48,8 @@ install_requires = [ "filecmp", "dns", # Python defaults (cx_Freeze skip them by default) - "dbm" + "dbm", + "sqlite3" ] includes = [] From 8d06754ba286cefb80646c6d3d29577ba00182db Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 22 Dec 2021 15:51:42 +0100 Subject: [PATCH 298/341] update avalon unreal plugin --- repos/avalon-unreal-integration | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/avalon-unreal-integration b/repos/avalon-unreal-integration index 43f6ea9439..8529332aed 160000 --- a/repos/avalon-unreal-integration +++ b/repos/avalon-unreal-integration @@ -1 +1 @@ -Subproject commit 43f6ea943980b29c02a170942b566ae11f2b7080 +Subproject commit 8529332aeddddc0bfccc7b1455ce0fa0aa571da9 From 5dedd2655dd501d5ad6aa59161b54fba548768d4 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 22 Dec 2021 16:40:20 +0100 Subject: [PATCH 299/341] Revert "Photoshop: New style validations for New publisher" --- .../publish/help/validate_instance_asset.xml | 25 -------- .../plugins/publish/help/validate_naming.xml | 21 ------- .../publish/help/validate_unique_subsets.xml | 23 -------- .../publish/validate_instance_asset.py | 12 +--- .../plugins/publish/validate_naming.py | 22 +++---- .../publish/validate_unique_subsets.py | 23 ++------ openpype/pipeline/__init__.py | 2 - openpype/pipeline/publish/__init__.py | 10 +--- openpype/pipeline/publish/lib.py | 57 ------------------- openpype/pipeline/publish/publish_plugins.py | 26 +-------- 10 files changed, 18 insertions(+), 203 deletions(-) delete mode 100644 openpype/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml delete mode 100644 openpype/hosts/photoshop/plugins/publish/help/validate_naming.xml delete mode 100644 openpype/hosts/photoshop/plugins/publish/help/validate_unique_subsets.xml diff --git a/openpype/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml b/openpype/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml deleted file mode 100644 index 3b040e8ea8..0000000000 --- a/openpype/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - -Subset context - -## Invalid subset context - -Asset name found '{found}' in subsets, expected '{expected}'. - -### How to repair? - -You can fix this with `Repair` button on the right. This will use '{expected}' asset name and overwrite '{found}' asset name in scene metadata. - -After that restart `Publish` with a `Reload button`. - -If this is unwanted, close workfile and open again, that way different asset value would be used for context information. - - -### __Detailed Info__ (optional) - -This might happen if you are reuse old workfile and open it in different context. -(Eg. you created subset "renderCompositingDefault" from asset "Robot' in "your_project_Robot_compositing.aep", now you opened this workfile in a context "Sloth" but existing subset for "Robot" asset stayed in the workfile.) - - - \ No newline at end of file diff --git a/openpype/hosts/photoshop/plugins/publish/help/validate_naming.xml b/openpype/hosts/photoshop/plugins/publish/help/validate_naming.xml deleted file mode 100644 index 21a7370340..0000000000 --- a/openpype/hosts/photoshop/plugins/publish/help/validate_naming.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - -Invalid name - -## Invalid name of subset - -Name of subset is created from a layer name. Some characters (whitespace, '/' etc.) are not allowed because of publishing (files couldn't be saved on some OSes). - -### How to repair? - -You can fix this with `Repair` button on the right. This will remove invalid characters with safe character ('_' by default) in both subset names and matching group names. - -After that restart `Publish` with a `Reload button`. - -Or you use `Subset Manager` to delete existing subsets, remove created groups, rename layers that are used for their creation and use `Create` option in the Openpype menu to create them again. - -Invalid characters and 'safe character' could be configured in Settings. Ask your OpenPype admin to modify them if necessary. - - - \ No newline at end of file diff --git a/openpype/hosts/photoshop/plugins/publish/help/validate_unique_subsets.xml b/openpype/hosts/photoshop/plugins/publish/help/validate_unique_subsets.xml deleted file mode 100644 index fa7c76a2dd..0000000000 --- a/openpype/hosts/photoshop/plugins/publish/help/validate_unique_subsets.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - -Subsets duplicated - -## Some subsets are duplicated - -Created subsets must be unique. - -Subsets '{duplicates_str}' are duplicated. - -### How to repair? - -Use `Subset Manager` to delete duplicated subset to have only unique subset names and restart `Publish` with a `Reload button`. - - -### __Detailed Info__ (optional) - -Subset names are created from layer names. Layer names are filtered for characters that would break publishing process when files are created. -This replacement process might result in duplicate names of subsets. - - - \ No newline at end of file diff --git a/openpype/hosts/photoshop/plugins/publish/validate_instance_asset.py b/openpype/hosts/photoshop/plugins/publish/validate_instance_asset.py index 8f13cc6b33..4dc1972074 100644 --- a/openpype/hosts/photoshop/plugins/publish/validate_instance_asset.py +++ b/openpype/hosts/photoshop/plugins/publish/validate_instance_asset.py @@ -1,9 +1,7 @@ from avalon import api import pyblish.api -from avalon import photoshop - import openpype.api -from openpype.pipeline import PublishXmlValidationError +from avalon import photoshop class ValidateInstanceAssetRepair(pyblish.api.Action): @@ -58,10 +56,4 @@ class ValidateInstanceAsset(pyblish.api.InstancePlugin): f"If that's not correct value, close workfile and " f"reopen via Workfiles!" ) - formatting_data = { - "found": instance_asset, - "expected": current_asset - } - if instance_asset != current_asset: - raise PublishXmlValidationError(self, msg, - formatting_data=formatting_data) + assert instance_asset == current_asset, msg diff --git a/openpype/hosts/photoshop/plugins/publish/validate_naming.py b/openpype/hosts/photoshop/plugins/publish/validate_naming.py index d548992f09..1635096f4b 100644 --- a/openpype/hosts/photoshop/plugins/publish/validate_naming.py +++ b/openpype/hosts/photoshop/plugins/publish/validate_naming.py @@ -1,10 +1,8 @@ import re import pyblish.api -from avalon import photoshop - import openpype.api -from openpype.pipeline import PublishXmlValidationError +from avalon import photoshop class ValidateNamingRepair(pyblish.api.Action): @@ -71,18 +69,14 @@ class ValidateNaming(pyblish.api.InstancePlugin): replace_char = '' def process(self, instance): - msg = "Name \"{}\" is not allowed.".format(instance.data["name"]) + help_msg = ' Use Repair action (A) in Pyblish to fix it.' + msg = "Name \"{}\" is not allowed.{}".format(instance.data["name"], + help_msg) + assert not re.search(self.invalid_chars, instance.data["name"]), msg - formatting_data = {"error_msg": msg} - if re.search(self.invalid_chars, instance.data["name"]): - raise PublishXmlValidationError(self, msg, - formatting_data=formatting_data) - - msg = "Subset \"{}\" is not allowed.".format(instance.data["subset"]) - formatting_data = {"error_msg": msg} - if re.search(self.invalid_chars, instance.data["subset"]): - raise PublishXmlValidationError(self, msg, - formatting_data=formatting_data) + msg = "Subset \"{}\" is not allowed.{}".format(instance.data["subset"], + help_msg) + assert not re.search(self.invalid_chars, instance.data["subset"]), msg @classmethod def get_replace_chars(cls): diff --git a/openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py b/openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py index d41fefa971..15ae5fbcea 100644 --- a/openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py +++ b/openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py @@ -1,8 +1,5 @@ -import collections - import pyblish.api import openpype.api -from openpype.pipeline import PublishXmlValidationError class ValidateSubsetUniqueness(pyblish.api.ContextPlugin): @@ -22,18 +19,8 @@ class ValidateSubsetUniqueness(pyblish.api.ContextPlugin): if instance.data.get('publish'): subset_names.append(instance.data.get('subset')) - duplicates = [item - for item, count in - collections.Counter(subset_names).items() - if count > 1] - - if duplicates: - duplicates_str = ",".join(duplicates) - formatting_data = {"duplicates_str": duplicates_str} - msg = ( - "Instance subset names {} are not unique.".format( - duplicates_str) + - " Remove duplicates via SubsetManager." - ) - raise PublishXmlValidationError(self, msg, - formatting_data=formatting_data) + msg = ( + "Instance subset names are not unique. " + + "Remove duplicates via SubsetManager." + ) + assert len(subset_names) == len(set(subset_names)), msg diff --git a/openpype/pipeline/__init__.py b/openpype/pipeline/__init__.py index 79d6ce4d54..e968df4011 100644 --- a/openpype/pipeline/__init__.py +++ b/openpype/pipeline/__init__.py @@ -9,7 +9,6 @@ from .create import ( from .publish import ( PublishValidationError, - PublishXmlValidationError, KnownPublishError, OpenPypePyblishPluginMixin ) @@ -24,7 +23,6 @@ __all__ = ( "CreatedInstance", "PublishValidationError", - "PublishXmlValidationError", "KnownPublishError", "OpenPypePyblishPluginMixin" ) diff --git a/openpype/pipeline/publish/__init__.py b/openpype/pipeline/publish/__init__.py index 228c4d8dcb..ca958816fe 100644 --- a/openpype/pipeline/publish/__init__.py +++ b/openpype/pipeline/publish/__init__.py @@ -1,26 +1,20 @@ from .publish_plugins import ( PublishValidationError, - PublishXmlValidationError, KnownPublishError, OpenPypePyblishPluginMixin ) from .lib import ( DiscoverResult, - publish_plugins_discover, - load_help_content_from_plugin, - load_help_content_from_filepath + publish_plugins_discover ) __all__ = ( "PublishValidationError", - "PublishXmlValidationError", "KnownPublishError", "OpenPypePyblishPluginMixin", "DiscoverResult", - "publish_plugins_discover", - "load_help_content_from_plugin", - "load_help_content_from_filepath" + "publish_plugins_discover" ) diff --git a/openpype/pipeline/publish/lib.py b/openpype/pipeline/publish/lib.py index f38e73afe2..0fa712a301 100644 --- a/openpype/pipeline/publish/lib.py +++ b/openpype/pipeline/publish/lib.py @@ -1,8 +1,6 @@ import os import sys import types -import inspect -import xml.etree.ElementTree import six import pyblish.plugin @@ -30,61 +28,6 @@ class DiscoverResult: self.plugins[item] = value -class HelpContent: - def __init__(self, title, description, detail=None): - self.title = title - self.description = description - self.detail = detail - - -def load_help_content_from_filepath(filepath): - """Load help content from xml file. - - Xml file may containt errors and warnings. - """ - errors = {} - warnings = {} - output = { - "errors": errors, - "warnings": warnings - } - if not os.path.exists(filepath): - return output - tree = xml.etree.ElementTree.parse(filepath) - root = tree.getroot() - for child in root: - child_id = child.attrib.get("id") - if child_id is None: - continue - - # Make sure ID is string - child_id = str(child_id) - - title = child.find("title").text - description = child.find("description").text - detail_node = child.find("detail") - detail = None - if detail_node is not None: - detail = detail_node.text - if child.tag == "error": - errors[child_id] = HelpContent(title, description, detail) - elif child.tag == "warning": - warnings[child_id] = HelpContent(title, description, detail) - return output - - -def load_help_content_from_plugin(plugin): - cls = plugin - if not inspect.isclass(plugin): - cls = plugin.__class__ - plugin_filepath = inspect.getfile(cls) - plugin_dir = os.path.dirname(plugin_filepath) - basename = os.path.splitext(os.path.basename(plugin_filepath))[0] - filename = basename + ".xml" - filepath = os.path.join(plugin_dir, "help", filename) - return load_help_content_from_filepath(filepath) - - def publish_plugins_discover(paths=None): """Find and return available pyblish plug-ins diff --git a/openpype/pipeline/publish/publish_plugins.py b/openpype/pipeline/publish/publish_plugins.py index bce64ec709..b60b9f43a7 100644 --- a/openpype/pipeline/publish/publish_plugins.py +++ b/openpype/pipeline/publish/publish_plugins.py @@ -1,6 +1,3 @@ -from .lib import load_help_content_from_plugin - - class PublishValidationError(Exception): """Validation error happened during publishing. @@ -15,34 +12,13 @@ class PublishValidationError(Exception): description(str): Detailed description of an error. It is possible to use Markdown syntax. """ - def __init__(self, message, title=None, description=None, detail=None): + def __init__(self, message, title=None, description=None): self.message = message self.title = title or "< Missing title >" self.description = description or message - self.detail = detail super(PublishValidationError, self).__init__(message) -class PublishXmlValidationError(PublishValidationError): - def __init__( - self, plugin, message, key=None, formatting_data=None - ): - if key is None: - key = "main" - - if not formatting_data: - formatting_data = {} - result = load_help_content_from_plugin(plugin) - content_obj = result["errors"][key] - description = content_obj.description.format(**formatting_data) - detail = content_obj.detail - if detail: - detail = detail.format(**formatting_data) - super(PublishXmlValidationError, self).__init__( - message, content_obj.title, description, detail - ) - - class KnownPublishError(Exception): """Publishing crashed because of known error. From 86bdddf343513fb34aefcceaad2d1a50b0643e4c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 22 Dec 2021 18:30:40 +0100 Subject: [PATCH 300/341] renamed linux_app_launcher to app_launcher --- linux_app_launcher.py => app_launcher.py | 0 openpype/lib/execute.py | 2 +- setup.py | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) rename linux_app_launcher.py => app_launcher.py (100%) diff --git a/linux_app_launcher.py b/app_launcher.py similarity index 100% rename from linux_app_launcher.py rename to app_launcher.py diff --git a/openpype/lib/execute.py b/openpype/lib/execute.py index a36a1f0bf4..f97617d906 100644 --- a/openpype/lib/execute.py +++ b/openpype/lib/execute.py @@ -193,7 +193,7 @@ def get_linux_launcher_args(*args): list: Executables with possible positional argument to script when called from code. """ - filename = "linux_app_launcher" + filename = "app_launcher" openpype_executable = os.environ["OPENPYPE_EXECUTABLE"] executable_filename = os.path.basename(openpype_executable) diff --git a/setup.py b/setup.py index de4887ae3c..a16984ca8e 100644 --- a/setup.py +++ b/setup.py @@ -112,9 +112,9 @@ executables = [ if IS_LINUX: executables.append( Executable( - "linux_app_launcher.py", + "app_launcher.py", base=None, - target_name="linux_app_launcher", + target_name="app_launcher", icon=icon_path.as_posix() ) ) From 6dabbf26014d2abb5eed4406085de9ffa8060511 Mon Sep 17 00:00:00 2001 From: OpenPype Date: Sat, 25 Dec 2021 03:42:38 +0000 Subject: [PATCH 301/341] [Automated] Bump version --- CHANGELOG.md | 27 +++++++++------------------ openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c6d1b8fe1..6b7b5ab20f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [3.7.0-nightly.10](https://github.com/pypeclub/OpenPype/tree/HEAD) +## [3.7.0-nightly.11](https://github.com/pypeclub/OpenPype/tree/HEAD) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...HEAD) @@ -10,11 +10,15 @@ **🚀 Enhancements** +- Photoshop: New style validations for New publisher [\#2429](https://github.com/pypeclub/OpenPype/pull/2429) - General: Environment variables groups [\#2424](https://github.com/pypeclub/OpenPype/pull/2424) +- Unreal: Dynamic menu created in Python [\#2422](https://github.com/pypeclub/OpenPype/pull/2422) - Settings UI: Hyperlinks to settings [\#2420](https://github.com/pypeclub/OpenPype/pull/2420) - Modules: JobQueue module moved one hierarchy level higher [\#2419](https://github.com/pypeclub/OpenPype/pull/2419) - TimersManager: Start timer post launch hook [\#2418](https://github.com/pypeclub/OpenPype/pull/2418) - Ftrack: Check existence of object type on recreation [\#2404](https://github.com/pypeclub/OpenPype/pull/2404) +- Enhancement: Global cleanup plugin that explicitly remove paths from context [\#2402](https://github.com/pypeclub/OpenPype/pull/2402) +- General: MongoDB ability to specify replica set groups [\#2401](https://github.com/pypeclub/OpenPype/pull/2401) - Flame: moving `utility\_scripts` to api folder also with `scripts` [\#2385](https://github.com/pypeclub/OpenPype/pull/2385) - Centos 7 dependency compatibility [\#2384](https://github.com/pypeclub/OpenPype/pull/2384) - Enhancement: Settings: Use project settings values from another project [\#2382](https://github.com/pypeclub/OpenPype/pull/2382) @@ -24,11 +28,10 @@ - Hiero: python3 compatibility [\#2365](https://github.com/pypeclub/OpenPype/pull/2365) - Burnins: Be able recognize mxf OPAtom format [\#2361](https://github.com/pypeclub/OpenPype/pull/2361) - Maya: Add is\_static\_image\_plane and is\_in\_all\_views option in imagePlaneLoader [\#2356](https://github.com/pypeclub/OpenPype/pull/2356) -- Local settings: Copyable studio paths [\#2349](https://github.com/pypeclub/OpenPype/pull/2349) -- General: Multilayer EXRs support [\#2315](https://github.com/pypeclub/OpenPype/pull/2315) **🐛 Bug fixes** +- Short Pyblish plugin path [\#2428](https://github.com/pypeclub/OpenPype/pull/2428) - PS: Introduced settings for invalid characters to use in ValidateNaming plugin [\#2417](https://github.com/pypeclub/OpenPype/pull/2417) - Settings UI: Breadcrumbs path does not create new entities [\#2416](https://github.com/pypeclub/OpenPype/pull/2416) - AfterEffects: Variant 2022 is in defaults but missing in schemas [\#2412](https://github.com/pypeclub/OpenPype/pull/2412) @@ -44,37 +47,25 @@ - Nuke: fixing node name based on switched asset name [\#2369](https://github.com/pypeclub/OpenPype/pull/2369) - JobQueue: Fix loading of settings [\#2362](https://github.com/pypeclub/OpenPype/pull/2362) - Tools: Placeholder color [\#2359](https://github.com/pypeclub/OpenPype/pull/2359) -- Launcher: Minimize button on MacOs [\#2355](https://github.com/pypeclub/OpenPype/pull/2355) -- StandalonePublisher: Fix import of constant [\#2354](https://github.com/pypeclub/OpenPype/pull/2354) -- Adobe products show issue [\#2347](https://github.com/pypeclub/OpenPype/pull/2347) -- Remove wrongly used host for hook [\#2342](https://github.com/pypeclub/OpenPype/pull/2342) -- Tools: Use Qt context on tools show [\#2340](https://github.com/pypeclub/OpenPype/pull/2340) +- Houdini: Fix HDA creation [\#2350](https://github.com/pypeclub/OpenPype/pull/2350) - Flame: Fix default argument value in custom dictionary [\#2339](https://github.com/pypeclub/OpenPype/pull/2339) -- Royal Render: Fix plugin order and OpenPype auto-detection [\#2291](https://github.com/pypeclub/OpenPype/pull/2291) **Merged pull requests:** +- Forced cx\_freeze to include sqlite3 into build [\#2432](https://github.com/pypeclub/OpenPype/pull/2432) +- Maya: Replaced PATH usage with vendored oiio path for maketx utility [\#2405](https://github.com/pypeclub/OpenPype/pull/2405) - \[Fix\]\[MAYA\] Handle message type attribute within CollectLook [\#2394](https://github.com/pypeclub/OpenPype/pull/2394) - Add validator to check correct version of extension for PS and AE [\#2387](https://github.com/pypeclub/OpenPype/pull/2387) - Linux : flip updating submodules logic [\#2357](https://github.com/pypeclub/OpenPype/pull/2357) -- Update of avalon-core [\#2346](https://github.com/pypeclub/OpenPype/pull/2346) ## [3.6.4](https://github.com/pypeclub/OpenPype/tree/3.6.4) (2021-11-23) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/CI/3.7.0-nightly.1...3.6.4) -**🐛 Bug fixes** - -- Nuke: inventory update removes all loaded read nodes [\#2294](https://github.com/pypeclub/OpenPype/pull/2294) - ## [3.6.3](https://github.com/pypeclub/OpenPype/tree/3.6.3) (2021-11-19) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/CI/3.6.3-nightly.1...3.6.3) -**🐛 Bug fixes** - -- Deadline: Fix publish targets [\#2280](https://github.com/pypeclub/OpenPype/pull/2280) - ## [3.6.2](https://github.com/pypeclub/OpenPype/tree/3.6.2) (2021-11-18) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/CI/3.6.2-nightly.2...3.6.2) diff --git a/openpype/version.py b/openpype/version.py index 273755dfd0..bfedfd3d11 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.7.0-nightly.10" +__version__ = "3.7.0-nightly.11" diff --git a/pyproject.toml b/pyproject.toml index ea6d9ee5e5..745a9b3511 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.7.0-nightly.10" # OpenPype +version = "3.7.0-nightly.11" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From 1730c9ce960abda8c2f95c7e4a2bd1db35aefb1c Mon Sep 17 00:00:00 2001 From: OpenPype Date: Wed, 29 Dec 2021 03:42:14 +0000 Subject: [PATCH 302/341] [Automated] Bump version --- CHANGELOG.md | 2 +- openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b7b5ab20f..ee3bf6421a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [3.7.0-nightly.11](https://github.com/pypeclub/OpenPype/tree/HEAD) +## [3.7.0-nightly.12](https://github.com/pypeclub/OpenPype/tree/HEAD) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...HEAD) diff --git a/openpype/version.py b/openpype/version.py index bfedfd3d11..f00f45b5d1 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.7.0-nightly.11" +__version__ = "3.7.0-nightly.12" diff --git a/pyproject.toml b/pyproject.toml index 745a9b3511..a48a6a4439 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.7.0-nightly.11" # OpenPype +version = "3.7.0-nightly.12" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From 1d94607037bad9393fb9ed82fae2842bbe66a626 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 30 Dec 2021 16:57:42 +0100 Subject: [PATCH 303/341] Optimize validation speed for dense polymeshes (especially those that have locked normal) --- .../publish/validate_mesh_normals_unlocked.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py b/openpype/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py index b14781b608..750932df54 100644 --- a/openpype/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py +++ b/openpype/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py @@ -1,4 +1,5 @@ from maya import cmds +import maya.api.OpenMaya as om2 import pyblish.api import openpype.api @@ -25,10 +26,16 @@ class ValidateMeshNormalsUnlocked(pyblish.api.Validator): @staticmethod def has_locked_normals(mesh): - """Return whether a mesh node has locked normals""" - return any(cmds.polyNormalPerVertex("{}.vtxFace[*][*]".format(mesh), - query=True, - freezeNormal=True)) + """Return whether mesh has at least one locked normal""" + + sel = om2.MGlobal.getSelectionListByName(mesh) + node = sel.getDependNode(0) + fn_mesh = om2.MFnMesh(node) + _, normal_ids = fn_mesh.getNormalIds() + for normal_id in normal_ids: + if fn_mesh.isNormalLocked(normal_id): + return True + return False @classmethod def get_invalid(cls, instance): From 3a95b99e42bf3903bbd5e66e6cb2558a5e880353 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 30 Dec 2021 17:56:50 +0100 Subject: [PATCH 304/341] Re-use polyConstraint from openpype.host.maya.api.lib --- .../plugins/publish/validate_mesh_ngons.py | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/validate_mesh_ngons.py b/openpype/hosts/maya/plugins/publish/validate_mesh_ngons.py index e8cc019b52..839aab0d0b 100644 --- a/openpype/hosts/maya/plugins/publish/validate_mesh_ngons.py +++ b/openpype/hosts/maya/plugins/publish/validate_mesh_ngons.py @@ -7,21 +7,6 @@ from avalon import maya from openpype.hosts.maya.api import lib -def polyConstraint(objects, *args, **kwargs): - kwargs.pop('mode', None) - - with lib.no_undo(flush=False): - with maya.maintained_selection(): - with lib.reset_polySelectConstraint(): - cmds.select(objects, r=1, noExpand=True) - # Acting as 'polyCleanupArgList' for n-sided polygon selection - cmds.polySelectConstraint(*args, mode=3, **kwargs) - result = cmds.ls(selection=True) - cmds.select(clear=True) - - return result - - class ValidateMeshNgons(pyblish.api.Validator): """Ensure that meshes don't have ngons @@ -41,8 +26,17 @@ class ValidateMeshNgons(pyblish.api.Validator): @staticmethod def get_invalid(instance): - meshes = cmds.ls(instance, type='mesh') - return polyConstraint(meshes, type=8, size=3) + meshes = cmds.ls(instance, type='mesh', long=True) + + # Get all faces + faces = ['{0}.f[*]'.format(node) for node in meshes] + + # Filter to n-sided polygon faces (ngons) + invalid = lib.polyConstraint(faces, + t=0x0008, # type=face + size=3) # size=nsided + + return invalid def process(self, instance): """Process all the nodes in the instance "objectSet""" From c8da4709fe0b5914aa69011db7f60dae2edd763c Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 30 Dec 2021 21:43:47 +0100 Subject: [PATCH 305/341] Fix errors being logged to script editor when attribute is not user-defined attribute. --- .../hosts/maya/plugins/publish/validate_rig_controllers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/validate_rig_controllers.py b/openpype/hosts/maya/plugins/publish/validate_rig_controllers.py index 4e028d1d24..d5a1fd3529 100644 --- a/openpype/hosts/maya/plugins/publish/validate_rig_controllers.py +++ b/openpype/hosts/maya/plugins/publish/validate_rig_controllers.py @@ -164,7 +164,8 @@ class ValidateRigControllers(pyblish.api.InstancePlugin): continue # Ignore proxy connections. - if cmds.addAttr(plug, query=True, usedAsProxy=True): + if (cmds.addAttr(plug, query=True, exists=True) and + cmds.addAttr(plug, query=True, usedAsProxy=True)): continue # Check for incoming connections From fdd7efb2bf7d070dee1c2bea1719b500b3232b57 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 31 Dec 2021 01:19:21 +0100 Subject: [PATCH 306/341] Improve speed of Collect History logic - maya.cmds.listHistory returns duplicates if multiple nodes have the same node in histor, thus making them unique reduces tons of items continuing through all the commands - cmds.ls(type="renderLayer") now without input nodes. History tends to be so big that calling the command with those nodes as arguments produces a big overhead, simultaneously amount of renderlayers usually tend to be relatively small. So we just get all renderlayers and filter ourselves. - use `fastIteration` flag in Maya 2020+ --- .../maya/plugins/publish/collect_history.py | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_history.py b/openpype/hosts/maya/plugins/publish/collect_history.py index 16c8e4342e..71f0169971 100644 --- a/openpype/hosts/maya/plugins/publish/collect_history.py +++ b/openpype/hosts/maya/plugins/publish/collect_history.py @@ -22,15 +22,22 @@ class CollectMayaHistory(pyblish.api.InstancePlugin): def process(self, instance): - # Collect the history with long names - history = cmds.listHistory(instance, leaf=False) or [] - history = cmds.ls(history, long=True) + kwargs = {} + if int(cmds.about(version=True)) >= 2020: + # New flag since Maya 2020 which makes cmds.listHistory faster + kwargs = {"fastIteration": True} + else: + self.log.debug("Ignoring `fastIteration` flag before Maya 2020..") - # Remove invalid node types (like renderlayers) - invalid = cmds.ls(history, type="renderLayer", long=True) - if invalid: - invalid = set(invalid) # optimize lookup - history = [x for x in history if x not in invalid] + # Collect the history with long names + history = set(cmds.listHistory(instance, leaf=False, **kwargs) or []) + history = cmds.ls(list(history), long=True) + + # Exclude invalid nodes (like renderlayers) + exclude = cmds.ls(type="renderLayer", long=True) + if exclude: + exclude = set(exclude) # optimize lookup + history = [x for x in history if x not in exclude] # Combine members with history members = instance[:] + history From 0761613e09dce0bf5e028f7dfb8a3b74c0fde913 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 10:39:09 +0100 Subject: [PATCH 307/341] removed usage of sw_folders --- .../action_create_folders.py | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/event_handlers_user/action_create_folders.py b/openpype/modules/default_modules/ftrack/event_handlers_user/action_create_folders.py index 994dbd90e4..8bbef9ad73 100644 --- a/openpype/modules/default_modules/ftrack/event_handlers_user/action_create_folders.py +++ b/openpype/modules/default_modules/ftrack/event_handlers_user/action_create_folders.py @@ -111,13 +111,6 @@ class CreateFolders(BaseAction): publish_template = publish_template[key] publish_has_apps = "{app" in publish_template - tools_settings = project_settings["global"]["tools"] - app_presets = tools_settings["Workfiles"]["sw_folders"] - app_manager_apps = None - if app_presets and (work_has_apps or publish_has_apps): - app_manager_apps = ApplicationManager().applications - - cached_apps = {} collected_paths = [] for entity in all_entities: if entity.entity_type.lower() == "project": @@ -143,26 +136,10 @@ class CreateFolders(BaseAction): if child["object_type"]["name"].lower() != "task": continue tasks_created = True - task_type_name = child["type"]["name"].lower() task_data = ent_data.copy() task_data["task"] = child["name"] apps = [] - if app_manager_apps: - possible_apps = app_presets.get(task_type_name) or [] - for app_name in possible_apps: - - if app_name in cached_apps: - apps.append(cached_apps[app_name]) - continue - - app_def = app_manager_apps.get(app_name) - if app_def and app_def.is_host: - app_dir = app_def.host_name - else: - app_dir = app_name - cached_apps[app_name] = app_dir - apps.append(app_dir) # Template wok if work_has_apps: From fca31274d0b83f31c44301ff00d1ff80017f1ae9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 11:00:24 +0100 Subject: [PATCH 308/341] replaced sw_folders with extra_folders --- .../defaults/project_settings/global.json | 16 +------- .../schemas/schema_global_tools.json | 40 ++++++++++++++++--- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/openpype/settings/defaults/project_settings/global.json b/openpype/settings/defaults/project_settings/global.json index 55732f80ce..cff1259c98 100644 --- a/openpype/settings/defaults/project_settings/global.json +++ b/openpype/settings/defaults/project_settings/global.json @@ -291,21 +291,7 @@ "enabled": false } ], - "sw_folders": { - "compositing": [ - "nuke", - "ae" - ], - "modeling": [ - "maya", - "blender", - "zbrush" - ], - "lookdev": [ - "substance", - "textures" - ] - } + "extra_folders": [] }, "loader": { "family_filter_profiles": [ diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json index 26d3771d8a..10f15e4104 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json @@ -195,14 +195,44 @@ } }, { - "type": "dict-modifiable", + "type": "list", + "key": "extra_folders", + "label": "Extra work folders", "collapsible": true, - "key": "sw_folders", - "label": "Extra task folders", + "use_label_wrap": true, "is_group": true, "object_type": { - "type": "list", - "object_type": "text" + "type": "dict", + "children": [ + { + "type": "hosts-enum", + "key": "hosts", + "label": "Hosts", + "multiselection": true + }, + { + "type": "task-types-enum", + "key": "task_types", + "label": "Task types" + }, + { + "label": "Task names", + "key": "task_names", + "type": "list", + "object_type": "text" + }, + { + "type": "splitter" + }, + { + "key": "folders", + "label": "Folders", + "type": "list", + "highlight_content": true, + "collapsible": false, + "object_type": "text" + } + ] } } ] From 8785536ad38af9101928395f70947e764680267e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 12:41:43 +0100 Subject: [PATCH 309/341] modified imports --- openpype/lib/path_tools.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/openpype/lib/path_tools.py b/openpype/lib/path_tools.py index 9bb0231ca7..ea6258f9f9 100644 --- a/openpype/lib/path_tools.py +++ b/openpype/lib/path_tools.py @@ -1,13 +1,14 @@ -import json -import logging import os import re import abc +import json +import logging import six +from openpype.settings import get_project_settings +from openpype.settings.lib import get_site_local_overrides from .anatomy import Anatomy -from openpype.settings import get_project_settings log = logging.getLogger(__name__) From 22a2a433c15477d7ff625097c3374002c1233d04 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 12:42:01 +0100 Subject: [PATCH 310/341] created function to create extra folders in workdir --- openpype/lib/__init__.py | 4 ++- openpype/lib/path_tools.py | 53 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/openpype/lib/__init__.py b/openpype/lib/__init__.py index c99e3bc28d..0b8a4dfa15 100644 --- a/openpype/lib/__init__.py +++ b/openpype/lib/__init__.py @@ -148,7 +148,8 @@ from .path_tools import ( get_version_from_path, get_last_version_from_path, create_project_folders, - get_project_basic_paths + create_workdir_extra_folders, + get_project_basic_paths, ) from .editorial import ( @@ -290,6 +291,7 @@ __all__ = [ "frames_to_timecode", "make_sequence_collection", "create_project_folders", + "create_workdir_extra_folders", "get_project_basic_paths", "get_openpype_version", diff --git a/openpype/lib/path_tools.py b/openpype/lib/path_tools.py index ea6258f9f9..12e9e2db9c 100644 --- a/openpype/lib/path_tools.py +++ b/openpype/lib/path_tools.py @@ -9,6 +9,7 @@ from openpype.settings import get_project_settings from openpype.settings.lib import get_site_local_overrides from .anatomy import Anatomy +from .profiles_filtering import filter_profiles log = logging.getLogger(__name__) @@ -201,6 +202,58 @@ def get_project_basic_paths(project_name): return _list_path_items(folder_structure) +def create_workdir_extra_folders( + workdir, host_name, task_type, task_name, project_name, + project_settings=None +): + """Create extra folders in work directory based on context. + + Args: + workdir (str): Path to workdir where workfiles is stored. + host_name (str): Name of host implementation. + task_type (str): Type of task for which extra folders should be + created. + task_name (str): Name of task for which extra folders should be + created. + project_name (str): Name of project on which task is. + project_settings (dict): Prepared project settings. Are loaded if not + passed. + """ + # Load project settings if not set + if not project_settings: + project_settings = get_project_settings(project_name) + + # Load extra folders profiles + extra_folders_profiles = ( + project_settings["global"]["tools"]["Workfiles"]["extra_folders"] + ) + # Skip if are empty + if not extra_folders_profiles: + return + + # Prepare profiles filters + filter_data = { + "task_types": task_type, + "task_names": task_name, + "hosts": host_name + } + profile = filter_profiles(extra_folders_profiles, filter_data) + if profile is None: + return + + for subfolder in profile["folders"]: + # Make sure backslashes are converted to forwards slashes + # and does not start with slash + subfolder = subfolder.replace("\\", "/").lstrip("/") + # Skip empty strings + if not subfolder: + continue + + fullpath = os.path.join(workdir, subfolder) + if not os.path.exists(fullpath): + os.makedirs(fullpath) + + @six.add_metaclass(abc.ABCMeta) class HostDirmap: """ From ecbe66a0d2a65b777d4352577db8f7dbe32b7b76 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 12:42:36 +0100 Subject: [PATCH 311/341] use trigger create workdir extra folders in workfiles tool --- openpype/tools/workfiles/app.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index 7973b88b82..80e0957fee 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -25,7 +25,8 @@ from openpype.lib import ( get_workfile_doc, create_workfile_doc, save_workfile_data_to_doc, - get_workfile_template_key + get_workfile_template_key, + create_workdir_extra_folders ) from .model import FilesModel @@ -672,7 +673,13 @@ class FilesWidget(QtWidgets.QWidget): self.set_asset_task( self._asset_id, self._task_name, self._task_type ) - + create_workdir_extra_folders( + self.root, + api.Session["AVALON_APP"], + self._task_type, + self._task_name, + api.Session["AVALON_PROJECT"] + ) pipeline.emit("after.workfile.save", [file_path]) self.workfile_created.emit(file_path) From b86a4ea95b5356f368919d037f3922f331595753 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 12:46:01 +0100 Subject: [PATCH 312/341] don't use schedule in workfiles tool --- openpype/tools/workfiles/app.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index 80e0957fee..0615ec0aca 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -12,7 +12,6 @@ from avalon import io, api, pipeline from openpype import style from openpype.tools.utils.lib import ( - schedule, qt_app_context ) from openpype.tools.utils import PlaceholderLineEdit @@ -736,7 +735,7 @@ class FilesWidget(QtWidgets.QWidget): self.files_model.refresh() if self.auto_select_latest_modified: - schedule(self._select_last_modified_file, 100) + self._select_last_modified_file() def on_context_menu(self, point): index = self.files_view.indexAt(point) @@ -941,8 +940,8 @@ class Window(QtWidgets.QMainWindow): # Connect signals set_context_timer.timeout.connect(self._on_context_set_timeout) - assets_widget.selection_changed.connect(self.on_asset_changed) - tasks_widget.task_changed.connect(self.on_task_changed) + assets_widget.selection_changed.connect(self._on_asset_changed) + tasks_widget.task_changed.connect(self._on_task_changed) files_widget.file_selected.connect(self.on_file_select) files_widget.workfile_created.connect(self.on_workfile_create) files_widget.file_opened.connect(self._on_file_opened) @@ -987,13 +986,6 @@ class Window(QtWidgets.QMainWindow): def set_save_enabled(self, enabled): self.files_widget.btn_save.setEnabled(enabled) - def on_task_changed(self): - # Since we query the disk give it slightly more delay - schedule(self._on_task_changed, 100, channel="mongo") - - def on_asset_changed(self): - schedule(self._on_asset_changed, 50, channel="mongo") - def on_file_select(self, filepath): asset_id = self.assets_widget.get_selected_asset_id() task_name = self.tasks_widget.get_selected_task_name() From d68992a76494706925ffac4b8180544459b5822a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 12:56:52 +0100 Subject: [PATCH 313/341] added prelaunch hook that will create extra folders in workdir for launch context --- .../hooks/pre_create_extra_workdir_folders.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 openpype/hooks/pre_create_extra_workdir_folders.py diff --git a/openpype/hooks/pre_create_extra_workdir_folders.py b/openpype/hooks/pre_create_extra_workdir_folders.py new file mode 100644 index 0000000000..d79c5831ee --- /dev/null +++ b/openpype/hooks/pre_create_extra_workdir_folders.py @@ -0,0 +1,33 @@ +import os +from openpype.lib import ( + PreLaunchHook, + create_workdir_extra_folders +) + + +class AddLastWorkfileToLaunchArgs(PreLaunchHook): + """Add last workfile path to launch arguments. + + This is not possible to do for all applications the same way. + """ + + # Execute after workfile template copy + order = 15 + + def execute(self): + if not self.application.is_host: + return + + env = self.data.get("env") or {} + workdir = env.get("AVALON_WORKDIR") + if not workdir or not os.path.exists(workdir): + return + + host_name = self.application.host_name + task_type = self.data["task_type"] + task_name = self.data["task_name"] + project_name = self.data["project_name"] + + create_workdir_extra_folders( + workdir, host_name, task_type, task_name, project_name, + ) From 8826b6dfa2519feb5a28ea4264a8c8e51db74ce0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 13:02:29 +0100 Subject: [PATCH 314/341] added label --- .../schemas/projects_schema/schemas/schema_global_tools.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json index 10f15e4104..bb71c9bde6 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json @@ -224,6 +224,10 @@ { "type": "splitter" }, + { + "type": "label", + "label": "Folders will be created in directory next to workfile. Items may contain nested directories (e.g. resources/images)." + }, { "key": "folders", "label": "Folders", From 2cbe986f9fbdead632b7adf85e7545d09ff3cebc Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 31 Dec 2021 14:09:25 +0100 Subject: [PATCH 315/341] Fix error when clicking on empty Subset area in Loader after having a Subset selected. - Also reorder the code so variables are closer to where they are used to avoid confusion --- openpype/tools/loader/app.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/openpype/tools/loader/app.py b/openpype/tools/loader/app.py index 583065633b..62bf5538de 100644 --- a/openpype/tools/loader/app.py +++ b/openpype/tools/loader/app.py @@ -363,7 +363,6 @@ class LoaderWindow(QtWidgets.QDialog): # Active must be in the selected rows otherwise we # assume it's not actually an "active" current index. - version_docs = None version_doc = None active = selection.currentIndex() rows = selection.selectedRows(column=active.column()) @@ -375,9 +374,10 @@ class LoaderWindow(QtWidgets.QDialog): not (item.get("isGroup") or item.get("isMerged")) ): version_doc = item["version_document"] + self._version_info_widget.set_version(version_doc) + version_docs = [] if rows: - version_docs = [] for index in rows: if not index or not index.isValid(): continue @@ -390,8 +390,6 @@ class LoaderWindow(QtWidgets.QDialog): else: version_docs.append(item["version_document"]) - self._version_info_widget.set_version(version_doc) - thumbnail_src_ids = [ version_doc["_id"] for version_doc in version_docs @@ -402,7 +400,7 @@ class LoaderWindow(QtWidgets.QDialog): self._thumbnail_widget.set_thumbnail(thumbnail_src_ids) if self._repres_widget is not None: - version_ids = [doc["_id"] for doc in version_docs or []] + version_ids = [doc["_id"] for doc in version_docs] self._repres_widget.set_version_ids(version_ids) # self._repres_widget.change_visibility("subset", len(rows) > 1) From 6f2a9bc116e624c3ed259d972e13c3356b5b392e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 14:31:39 +0100 Subject: [PATCH 316/341] copied main thread processor from new publisher --- openpype/tools/pyblish_pype/control.py | 66 ++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/openpype/tools/pyblish_pype/control.py b/openpype/tools/pyblish_pype/control.py index 2a9e67097e..331114fba4 100644 --- a/openpype/tools/pyblish_pype/control.py +++ b/openpype/tools/pyblish_pype/control.py @@ -28,6 +28,72 @@ class IterationBreak(Exception): pass +class MainThreadItem: + """Callback with args and kwargs.""" + def __init__(self, callback, *args, **kwargs): + self.callback = callback + self.args = args + self.kwargs = kwargs + + def process(self): + self.callback(*self.args, **self.kwargs) + + +class MainThreadProcess(QtCore.QObject): + """Qt based main thread process executor. + + Has timer which controls each 50ms if there is new item to process. + + This approach gives ability to update UI meanwhile plugin is in progress. + """ + def __init__(self): + super(MainThreadProcess, self).__init__() + self._items_to_process = collections.deque() + + timer = QtCore.QTimer() + timer.setInterval(10) + + timer.timeout.connect(self._execute) + + self._timer = timer + + def process(self, func, *args, **kwargs): + item = MainThreadItem(func, *args, **kwargs) + self.add_item(item) + + def add_item(self, item): + self._items_to_process.append(item) + + def _execute(self): + if not self._items_to_process: + return + + item = self._items_to_process.popleft() + item.process() + + def start(self): + if not self._timer.isActive(): + self._timer.start() + + def stop(self): + if self._timer.isActive(): + self._timer.stop() + + def clear(self): + if self._timer.isActive(): + self._timer.stop() + self._items_to_process = collections.deque() + + def stop_if_empty(self): + if self._timer.isActive(): + item = MainThreadItem(self._stop_if_empty) + self.add_item(item) + + def _stop_if_empty(self): + if not self._items_to_process: + self.stop() + + class Controller(QtCore.QObject): log = logging.getLogger("PyblishController") # Emitted when the GUI is about to start processing; From 3029b7b148318db9462abf44afbc691f9f888802 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 14:32:00 +0100 Subject: [PATCH 317/341] do not call reset, collect, validate and publish in deffer --- openpype/tools/pyblish_pype/window.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/openpype/tools/pyblish_pype/window.py b/openpype/tools/pyblish_pype/window.py index 536f793216..fdd2d80e23 100644 --- a/openpype/tools/pyblish_pype/window.py +++ b/openpype/tools/pyblish_pype/window.py @@ -1148,7 +1148,7 @@ class Window(QtWidgets.QDialog): self.comment_box.placeholder.setVisible(False) self.comment_box.placeholder.setVisible(True) # Launch controller reset - util.defer(500, self.controller.reset) + self.controller.reset() def validate(self): self.info(self.tr("Preparing validate..")) @@ -1159,7 +1159,7 @@ class Window(QtWidgets.QDialog): self.button_suspend_logs.setEnabled(False) - util.defer(5, self.controller.validate) + self.controller.validate() def publish(self): self.info(self.tr("Preparing publish..")) @@ -1170,7 +1170,7 @@ class Window(QtWidgets.QDialog): self.button_suspend_logs.setEnabled(False) - util.defer(5, self.controller.publish) + self.controller.publish() def act(self, plugin_item, action): self.info("%s %s.." % (self.tr("Preparing"), action)) @@ -1187,9 +1187,7 @@ class Window(QtWidgets.QDialog): ) # Give Qt time to draw - util.defer(100, lambda: self.controller.act( - plugin_item.plugin, action - )) + self.controller.act(plugin_item.plugin, action) self.info(self.tr("Action prepared.")) @@ -1267,7 +1265,7 @@ class Window(QtWidgets.QDialog): self.info(self.tr("..as soon as processing is finished..")) self.controller.stop() self.finished.connect(self.close) - util.defer(2000, on_problem) + util.defer(200, on_problem) return event.ignore() self.state["is_closing"] = True From 8cc389a63f3c9dfedcad72256b3187ae767393e2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 14:32:34 +0100 Subject: [PATCH 318/341] modified processing to not use defer function --- openpype/tools/pyblish_pype/control.py | 84 +++++++++++++++++++------- 1 file changed, 63 insertions(+), 21 deletions(-) diff --git a/openpype/tools/pyblish_pype/control.py b/openpype/tools/pyblish_pype/control.py index 331114fba4..65faa185d2 100644 --- a/openpype/tools/pyblish_pype/control.py +++ b/openpype/tools/pyblish_pype/control.py @@ -9,6 +9,7 @@ import os import sys import inspect import logging +import collections from Qt import QtCore @@ -137,6 +138,7 @@ class Controller(QtCore.QObject): self.plugins = {} self.optional_default = {} self.instance_toggled.connect(self._on_instance_toggled) + self._main_thread_processor = MainThreadProcess() def reset_variables(self): self.log.debug("Resetting pyblish context variables") @@ -235,7 +237,11 @@ class Controller(QtCore.QObject): def reset(self): """Discover plug-ins and run collection.""" + self._main_thread_processor.clear() + self._main_thread_processor.process(self._reset) + self._main_thread_processor.start() + def _reset(self): self.reset_context() self.reset_variables() @@ -276,21 +282,25 @@ class Controller(QtCore.QObject): if self.is_running: self.is_running = False self.was_finished.emit() + self._main_thread_processor.stop() def stop(self): self.log.debug("Stopping") self.stopped = True def act(self, plugin, action): - def on_next(): - result = pyblish.plugin.process( - plugin, self.context, None, action.id - ) - self.is_running = False - self.was_acted.emit(result) - self.is_running = True - util.defer(100, on_next) + item = MainThreadItem(self._process_action, plugin, action) + self._main_thread_processor.add_item(item) + self._main_thread_processor.start() + self._main_thread_processor.stop_if_empty() + + def _process_action(self, plugin, action): + result = pyblish.plugin.process( + plugin, self.context, None, action.id + ) + self.is_running = False + self.was_acted.emit(result) def emit_(self, signal, kwargs): pyblish.api.emit(signal, **kwargs) @@ -421,11 +431,13 @@ class Controller(QtCore.QObject): self.passed_group.emit(self.processing["next_group_order"]) - def iterate_and_process(self, on_finished=lambda: None): + def iterate_and_process(self, on_finished=None): """ Iterating inserted plugins with current context. Collectors do not contain instances, they are None when collecting! This process don't stop on one """ + self._main_thread_processor.start() + def on_next(): self.log.debug("Looking for next pair to process") try: @@ -437,13 +449,19 @@ class Controller(QtCore.QObject): self.log.debug("Iteration break was raised") self.is_running = False self.was_stopped.emit() + self._main_thread_processor.stop() return except StopIteration: self.log.debug("Iteration stop was raised") self.is_running = False # All pairs were processed successfully! - return util.defer(500, on_finished) + if on_finished is not None: + self._main_thread_processor.add_item( + MainThreadItem(on_finished) + ) + self._main_thread_processor.stop_if_empty() + return except Exception as exc: self.log.warning( @@ -451,12 +469,15 @@ class Controller(QtCore.QObject): exc_info=True ) exc_msg = str(exc) - return util.defer( - 500, lambda: on_unexpected_error(error=exc_msg) + self._main_thread_processor.add_item( + MainThreadItem(on_unexpected_error, error=exc_msg) ) + return self.about_to_process.emit(*self.current_pair) - util.defer(100, on_process) + self._main_thread_processor.add_item( + MainThreadItem(on_process) + ) def on_process(): try: @@ -477,11 +498,14 @@ class Controller(QtCore.QObject): exc_info=True ) exc_msg = str(exc) - return util.defer( - 500, lambda: on_unexpected_error(error=exc_msg) + self._main_thread_processor.add_item( + MainThreadItem(on_unexpected_error, error=exc_msg) ) + return - util.defer(10, on_next) + self._main_thread_processor.add_item( + MainThreadItem(on_next) + ) def on_unexpected_error(error): # TODO this should be handled much differently @@ -489,24 +513,42 @@ class Controller(QtCore.QObject): self.is_running = False self.was_stopped.emit() util.u_print(u"An unexpected error occurred:\n %s" % error) - return util.defer(500, on_finished) + if on_finished is not None: + self._main_thread_processor.add_item( + MainThreadItem(on_finished) + ) + self._main_thread_processor.stop_if_empty() self.is_running = True - util.defer(10, on_next) + self._main_thread_processor.add_item( + MainThreadItem(on_next) + ) def collect(self): """ Iterate and process Collect plugins - load_plugins method is launched again when finished """ - self.iterate_and_process() + self._main_thread_processor.process(self._start_collect) + self._main_thread_processor.start() def validate(self): """ Process plugins to validations_order value.""" - self.processing["stop_on_validation"] = True - self.iterate_and_process() + self._main_thread_processor.process(self._start_validate) + self._main_thread_processor.start() def publish(self): """ Iterate and process all remaining plugins.""" + self._main_thread_processor.process(self._start_publish) + self._main_thread_processor.start() + + def _start_collect(self): + self.iterate_and_process() + + def _start_validate(self): + self.processing["stop_on_validation"] = True + self.iterate_and_process() + + def _start_publish(self): self.processing["stop_on_validation"] = False self.iterate_and_process(self.on_published) From 0289bb58bef7530d203c20ebef0e17afb272ae90 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 14:33:26 +0100 Subject: [PATCH 319/341] modified timer interval in new publisher --- openpype/tools/publisher/control.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openpype/tools/publisher/control.py b/openpype/tools/publisher/control.py index 24ec9dcb0e..dd97144977 100644 --- a/openpype/tools/publisher/control.py +++ b/openpype/tools/publisher/control.py @@ -41,12 +41,15 @@ class MainThreadProcess(QtCore.QObject): This approach gives ability to update UI meanwhile plugin is in progress. """ + + timer_interval = 10 + def __init__(self): super(MainThreadProcess, self).__init__() self._items_to_process = collections.deque() timer = QtCore.QTimer() - timer.setInterval(50) + timer.setInterval(self.timer_interval) timer.timeout.connect(self._execute) From 1d087b6232588ff7659b9979ee0773259f2ebc54 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 16:25:56 +0100 Subject: [PATCH 320/341] lowered timer interval to 3 ms --- openpype/tools/publisher/control.py | 2 +- openpype/tools/pyblish_pype/control.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/openpype/tools/publisher/control.py b/openpype/tools/publisher/control.py index dd97144977..860c009f15 100644 --- a/openpype/tools/publisher/control.py +++ b/openpype/tools/publisher/control.py @@ -42,7 +42,7 @@ class MainThreadProcess(QtCore.QObject): This approach gives ability to update UI meanwhile plugin is in progress. """ - timer_interval = 10 + timer_interval = 3 def __init__(self): super(MainThreadProcess, self).__init__() diff --git a/openpype/tools/pyblish_pype/control.py b/openpype/tools/pyblish_pype/control.py index 65faa185d2..d2b74e316a 100644 --- a/openpype/tools/pyblish_pype/control.py +++ b/openpype/tools/pyblish_pype/control.py @@ -47,12 +47,14 @@ class MainThreadProcess(QtCore.QObject): This approach gives ability to update UI meanwhile plugin is in progress. """ + timer_interval = 3 + def __init__(self): super(MainThreadProcess, self).__init__() self._items_to_process = collections.deque() timer = QtCore.QTimer() - timer.setInterval(10) + timer.setInterval(self.timer_interval) timer.timeout.connect(self._execute) From f3d9c981b6f817aa0538b9f9618a68adae470a2f Mon Sep 17 00:00:00 2001 From: OpenPype Date: Sat, 1 Jan 2022 03:43:34 +0000 Subject: [PATCH 321/341] [Automated] Bump version --- CHANGELOG.md | 2 +- openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee3bf6421a..ef6c04c06f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [3.7.0-nightly.12](https://github.com/pypeclub/OpenPype/tree/HEAD) +## [3.7.0-nightly.13](https://github.com/pypeclub/OpenPype/tree/HEAD) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...HEAD) diff --git a/openpype/version.py b/openpype/version.py index f00f45b5d1..891cd4fd52 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.7.0-nightly.12" +__version__ = "3.7.0-nightly.13" diff --git a/pyproject.toml b/pyproject.toml index a48a6a4439..adf3e3a25d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.7.0-nightly.12" # OpenPype +version = "3.7.0-nightly.13" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From 73beba9181dd8e71b90169e056d875b5661c36b1 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 3 Jan 2022 12:51:37 +0100 Subject: [PATCH 322/341] fix last import from avalon --- openpype/hosts/tvpaint/plugins/publish/extract_sequence.py | 2 +- openpype/hosts/tvpaint/worker/worker.py | 2 +- openpype/hosts/tvpaint/worker/worker_job.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/tvpaint/plugins/publish/extract_sequence.py b/openpype/hosts/tvpaint/plugins/publish/extract_sequence.py index 31f685919e..b6b8bd0d9e 100644 --- a/openpype/hosts/tvpaint/plugins/publish/extract_sequence.py +++ b/openpype/hosts/tvpaint/plugins/publish/extract_sequence.py @@ -5,7 +5,7 @@ import tempfile from PIL import Image import pyblish.api -from avalon.tvpaint import lib +from openpype.hosts.tvpaint.api import lib from openpype.hosts.tvpaint.lib import ( calculate_layers_extraction_data, get_frame_filename_template, diff --git a/openpype/hosts/tvpaint/worker/worker.py b/openpype/hosts/tvpaint/worker/worker.py index 738656fa91..cfd40bc7ba 100644 --- a/openpype/hosts/tvpaint/worker/worker.py +++ b/openpype/hosts/tvpaint/worker/worker.py @@ -2,7 +2,7 @@ import signal import time import asyncio -from avalon.tvpaint.communication_server import ( +from openpype.hosts.tvpaint.api.communication_server import ( BaseCommunicator, CommunicationWrapper ) diff --git a/openpype/hosts/tvpaint/worker/worker_job.py b/openpype/hosts/tvpaint/worker/worker_job.py index c3893b6f2e..519d42ce73 100644 --- a/openpype/hosts/tvpaint/worker/worker_job.py +++ b/openpype/hosts/tvpaint/worker/worker_job.py @@ -256,7 +256,7 @@ class CollectSceneData(BaseCommand): name = "collect_scene_data" def execute(self): - from avalon.tvpaint.lib import ( + from openpype.hosts.tvpaint.api.lib import ( get_layers_data, get_groups_data, get_layers_pre_post_behavior, From 21b66991b7aa2418b71423a7e541c2ddf764459e Mon Sep 17 00:00:00 2001 From: BenoitConnan Date: Mon, 3 Jan 2022 15:52:17 +0100 Subject: [PATCH 323/341] add "attach_to_root" option as a qargparse argument --- openpype/hosts/maya/api/plugin.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/openpype/hosts/maya/api/plugin.py b/openpype/hosts/maya/api/plugin.py index fdad0e0989..a5f03cd576 100644 --- a/openpype/hosts/maya/api/plugin.py +++ b/openpype/hosts/maya/api/plugin.py @@ -100,6 +100,13 @@ class ReferenceLoader(api.Loader): "offset", label="Position Offset", help="Offset loaded models for easier selection." + ), + qargparse.Boolean( + "attach_to_root", + label="Group imported asset", + default=True, + help="Should a group be created to encapsulate" + " imported representation ?" ) ] From 9da05a2a2e21605f21cb5f9deef06cbf886e4db9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 4 Jan 2022 10:36:42 +0100 Subject: [PATCH 324/341] make dialog shown in create render layer always on top --- openpype/hosts/tvpaint/plugins/create/create_render_layer.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openpype/hosts/tvpaint/plugins/create/create_render_layer.py b/openpype/hosts/tvpaint/plugins/create/create_render_layer.py index c43c136f3e..40a7d15990 100644 --- a/openpype/hosts/tvpaint/plugins/create/create_render_layer.py +++ b/openpype/hosts/tvpaint/plugins/create/create_render_layer.py @@ -197,6 +197,7 @@ class CreateRenderlayer(plugin.Creator): ) def _ask_user_subset_override(self, instance): + from Qt import QtCore from Qt.QtWidgets import QMessageBox title = "Subset \"{}\" already exist".format(instance["subset"]) @@ -206,6 +207,10 @@ class CreateRenderlayer(plugin.Creator): ).format(instance["subset"]) dialog = QMessageBox() + dialog.setWindowFlags( + dialog.windowFlags() + | QtCore.Qt.WindowStaysOnTopHint + ) dialog.setWindowTitle(title) dialog.setText(text) dialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No) From 3ca931097d836bb1b5e49c15dd04291be2bb485d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 4 Jan 2022 10:57:21 +0100 Subject: [PATCH 325/341] source and proxy models can be changed in assets widget --- openpype/tools/utils/assets_widget.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/openpype/tools/utils/assets_widget.py b/openpype/tools/utils/assets_widget.py index f310aafe89..b73aca8d63 100644 --- a/openpype/tools/utils/assets_widget.py +++ b/openpype/tools/utils/assets_widget.py @@ -582,11 +582,8 @@ class AssetsWidget(QtWidgets.QWidget): self.dbcon = dbcon # Tree View - model = AssetModel(dbcon=self.dbcon, parent=self) - proxy = RecursiveSortFilterProxyModel() - proxy.setSourceModel(model) - proxy.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive) - proxy.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive) + model = self._create_source_model() + proxy = self._create_proxy_model(model) view = AssetsView(self) view.setModel(proxy) @@ -628,7 +625,6 @@ class AssetsWidget(QtWidgets.QWidget): selection_model.selectionChanged.connect(self._on_selection_change) refresh_btn.clicked.connect(self.refresh) current_asset_btn.clicked.connect(self.set_current_session_asset) - model.refreshed.connect(self._on_model_refresh) view.doubleClicked.connect(self.double_clicked) self._current_asset_btn = current_asset_btn @@ -639,6 +635,18 @@ class AssetsWidget(QtWidgets.QWidget): self.model_selection = {} + def _create_source_model(self): + model = AssetModel(dbcon=self.dbcon, parent=self) + model.refreshed.connect(self._on_model_refresh) + return model + + def _create_proxy_model(self, source_model): + proxy = RecursiveSortFilterProxyModel() + proxy.setSourceModel(source_model) + proxy.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive) + proxy.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive) + return proxy + @property def refreshing(self): return self._model.refreshing @@ -691,6 +699,12 @@ class AssetsWidget(QtWidgets.QWidget): self._proxy.setFilterFixedString(new_text) def _on_model_refresh(self, has_item): + """This method should be triggered on model refresh. + + Default implementation register this callback in '_create_source_model' + so if you're modifying model keep in mind that this method should be + called when refresh is done. + """ self._proxy.sort(0) self._set_loading_state(loading=False, empty=not has_item) self.refreshed.emit() From 03fa4e7443fa0e4db7b8b48ba4e82c77ccba3d5f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 4 Jan 2022 10:57:59 +0100 Subject: [PATCH 326/341] got rid of 'clear' argument in refresh method of assets widget --- openpype/tools/utils/assets_widget.py | 36 ++++++++++++++++----------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/openpype/tools/utils/assets_widget.py b/openpype/tools/utils/assets_widget.py index b73aca8d63..1495586b04 100644 --- a/openpype/tools/utils/assets_widget.py +++ b/openpype/tools/utils/assets_widget.py @@ -306,6 +306,8 @@ class AssetModel(QtGui.QStandardItemModel): self._items_with_color_by_id = {} self._items_by_asset_id = {} + self._last_project_name = None + @property def refreshing(self): return self._refreshing @@ -347,7 +349,7 @@ class AssetModel(QtGui.QStandardItemModel): return self.get_indexes_by_asset_ids(asset_ids) - def refresh(self, force=False, clear=False): + def refresh(self, force=False): """Refresh the data for the model. Args: @@ -360,7 +362,13 @@ class AssetModel(QtGui.QStandardItemModel): return self.stop_refresh() - if clear: + project_name = self.dbcon.Session.get("AVALON_PROJECT") + clear_model = False + if project_name != self._last_project_name: + clear_model = True + self._last_project_name = project_name + + if clear_model: self._clear_items() # Fetch documents from mongo @@ -401,11 +409,18 @@ class AssetModel(QtGui.QStandardItemModel): self._clear_items() return + self._fill_assets(self._doc_payload) + + self.refreshed.emit(bool(self._items_by_asset_id)) + + self._stop_fetch_thread() + + def _fill_assets(self, asset_docs): # Collect asset documents as needed asset_ids = set() asset_docs_by_id = {} asset_ids_by_parents = collections.defaultdict(set) - for asset_doc in self._doc_payload: + for asset_doc in asset_docs: asset_id = asset_doc["_id"] asset_data = asset_doc.get("data") or {} parent_id = asset_data.get("visualParent") @@ -511,10 +526,6 @@ class AssetModel(QtGui.QStandardItemModel): except Exception: pass - self.refreshed.emit(bool(self._items_by_asset_id)) - - self._stop_fetch_thread() - def _threaded_fetch(self): asset_docs = self._fetch_asset_docs() if not self._refreshing: @@ -652,12 +663,7 @@ class AssetsWidget(QtWidgets.QWidget): return self._model.refreshing def refresh(self): - project_name = self.dbcon.Session.get("AVALON_PROJECT") - clear_model = False - if project_name != self._last_project_name: - clear_model = True - self._last_project_name = project_name - self._refresh_model(clear_model) + self._refresh_model() def stop_refresh(self): self._model.stop_refresh() @@ -709,14 +715,14 @@ class AssetsWidget(QtWidgets.QWidget): self._set_loading_state(loading=False, empty=not has_item) self.refreshed.emit() - def _refresh_model(self, clear=False): + def _refresh_model(self): # Store selection self._set_loading_state(loading=True, empty=True) # Trigger signal before refresh is called self.refresh_triggered.emit() # Refresh model - self._model.refresh(clear=clear) + self._model.refresh() def _set_loading_state(self, loading, empty): self._view.set_loading_state(loading, empty) From e389067ed26a773b023245900d6edf84331439ad Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 4 Jan 2022 10:59:57 +0100 Subject: [PATCH 327/341] tasks widget have ability to create different tasks model --- openpype/tools/utils/tasks_widget.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/openpype/tools/utils/tasks_widget.py b/openpype/tools/utils/tasks_widget.py index 419e77c780..6e6cd17ffd 100644 --- a/openpype/tools/utils/tasks_widget.py +++ b/openpype/tools/utils/tasks_widget.py @@ -194,6 +194,8 @@ class TasksWidget(QtWidgets.QWidget): task_changed = QtCore.Signal() def __init__(self, dbcon, parent=None): + self._dbcon = dbcon + super(TasksWidget, self).__init__(parent) tasks_view = DeselectableTreeView(self) @@ -204,9 +206,8 @@ class TasksWidget(QtWidgets.QWidget): header_view = tasks_view.header() header_view.setSortIndicator(0, QtCore.Qt.AscendingOrder) - tasks_model = TasksModel(dbcon) - tasks_proxy = TasksProxyModel() - tasks_proxy.setSourceModel(tasks_model) + tasks_model = self._create_source_model() + tasks_proxy = self._create_proxy_model(tasks_model) tasks_view.setModel(tasks_proxy) layout = QtWidgets.QVBoxLayout(self) @@ -222,6 +223,19 @@ class TasksWidget(QtWidgets.QWidget): self._last_selected_task_name = None + def _create_source_model(self): + """Create source model of tasks widget. + + Model must have available 'refresh' method and 'set_asset_id' to change + context of asset. + """ + return TasksModel(self._dbcon) + + def _create_proxy_model(self, source_model): + proxy = TasksProxyModel() + proxy.setSourceModel(source_model) + return proxy + def refresh(self): self._tasks_model.refresh() From 5d611395dfc34dd40192f6c3faf97f026c3bd042 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 4 Jan 2022 12:21:34 +0100 Subject: [PATCH 328/341] improve handling with selection --- openpype/hosts/flame/api/menu.py | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/openpype/hosts/flame/api/menu.py b/openpype/hosts/flame/api/menu.py index 893c7a21d0..fef6dbfa35 100644 --- a/openpype/hosts/flame/api/menu.py +++ b/openpype/hosts/flame/api/menu.py @@ -25,11 +25,11 @@ default_flame_export_presets = { } -def send_selection(selection): +def callback_selection(selection, function): import openpype.hosts.flame as opflame opflame.selection = selection print(opflame.selection) - return True + function() class _FlameMenuApp(object): @@ -103,9 +103,6 @@ class FlameMenuProjectConnect(_FlameMenuApp): if not self.flame: return [] - flame_project_name = self.flame_project_name - self.log.info("______ {} ______".format(flame_project_name)) - menu = deepcopy(self.menu) menu['actions'].append({ @@ -114,13 +111,13 @@ class FlameMenuProjectConnect(_FlameMenuApp): }) menu['actions'].append({ "name": "Create ...", - "isVisible": send_selection, - "execute": lambda x: self.tools_helper.show_creator() + "execute": lambda x: callback_selection( + x, self.tools_helper.show_creator) }) menu['actions'].append({ "name": "Publish ...", - "isVisible": send_selection, - "execute": lambda x: self.tools_helper.show_publish() + "execute": lambda x: callback_selection( + x, self.tools_helper.show_publish) }) menu['actions'].append({ "name": "Load ...", @@ -170,20 +167,17 @@ class FlameMenuTimeline(_FlameMenuApp): if not self.flame: return [] - flame_project_name = self.flame_project_name - self.log.info("______ {} ______".format(flame_project_name)) - menu = deepcopy(self.menu) menu['actions'].append({ "name": "Create ...", - "isVisible": send_selection, - "execute": lambda x: self.tools_helper.show_creator() + "execute": lambda x: callback_selection( + x, self.tools_helper.show_creator) }) menu['actions'].append({ "name": "Publish ...", - "isVisible": send_selection, - "execute": lambda x: self.tools_helper.show_publish() + "execute": lambda x: callback_selection( + x, self.tools_helper.show_publish) }) menu['actions'].append({ "name": "Load ...", From b46a200ac81967469efe9a1ead789439511c07b9 Mon Sep 17 00:00:00 2001 From: OpenPype Date: Tue, 4 Jan 2022 12:51:18 +0000 Subject: [PATCH 329/341] [Automated] Bump version --- CHANGELOG.md | 12 ++++++------ openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef6c04c06f..36e5672c3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [3.7.0-nightly.13](https://github.com/pypeclub/OpenPype/tree/HEAD) +## [3.7.0-nightly.14](https://github.com/pypeclub/OpenPype/tree/HEAD) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...HEAD) @@ -10,12 +10,15 @@ **🚀 Enhancements** +- General: Workdir extra folders [\#2462](https://github.com/pypeclub/OpenPype/pull/2462) +- Harmony: Added new style validations for New Publisher [\#2434](https://github.com/pypeclub/OpenPype/pull/2434) - Photoshop: New style validations for New publisher [\#2429](https://github.com/pypeclub/OpenPype/pull/2429) - General: Environment variables groups [\#2424](https://github.com/pypeclub/OpenPype/pull/2424) - Unreal: Dynamic menu created in Python [\#2422](https://github.com/pypeclub/OpenPype/pull/2422) - Settings UI: Hyperlinks to settings [\#2420](https://github.com/pypeclub/OpenPype/pull/2420) - Modules: JobQueue module moved one hierarchy level higher [\#2419](https://github.com/pypeclub/OpenPype/pull/2419) - TimersManager: Start timer post launch hook [\#2418](https://github.com/pypeclub/OpenPype/pull/2418) +- General: Run applications as separate processes under linux [\#2408](https://github.com/pypeclub/OpenPype/pull/2408) - Ftrack: Check existence of object type on recreation [\#2404](https://github.com/pypeclub/OpenPype/pull/2404) - Enhancement: Global cleanup plugin that explicitly remove paths from context [\#2402](https://github.com/pypeclub/OpenPype/pull/2402) - General: MongoDB ability to specify replica set groups [\#2401](https://github.com/pypeclub/OpenPype/pull/2401) @@ -24,13 +27,13 @@ - Enhancement: Settings: Use project settings values from another project [\#2382](https://github.com/pypeclub/OpenPype/pull/2382) - Blender 3: Support auto install for new blender version [\#2377](https://github.com/pypeclub/OpenPype/pull/2377) - Maya add render image path to settings [\#2375](https://github.com/pypeclub/OpenPype/pull/2375) -- Settings: Webpublisher in hosts enum [\#2367](https://github.com/pypeclub/OpenPype/pull/2367) - Hiero: python3 compatibility [\#2365](https://github.com/pypeclub/OpenPype/pull/2365) -- Burnins: Be able recognize mxf OPAtom format [\#2361](https://github.com/pypeclub/OpenPype/pull/2361) - Maya: Add is\_static\_image\_plane and is\_in\_all\_views option in imagePlaneLoader [\#2356](https://github.com/pypeclub/OpenPype/pull/2356) +- TVPaint: Move implementation to OpenPype [\#2336](https://github.com/pypeclub/OpenPype/pull/2336) **🐛 Bug fixes** +- TVPaint: Create render layer dialog is in front [\#2471](https://github.com/pypeclub/OpenPype/pull/2471) - Short Pyblish plugin path [\#2428](https://github.com/pypeclub/OpenPype/pull/2428) - PS: Introduced settings for invalid characters to use in ValidateNaming plugin [\#2417](https://github.com/pypeclub/OpenPype/pull/2417) - Settings UI: Breadcrumbs path does not create new entities [\#2416](https://github.com/pypeclub/OpenPype/pull/2416) @@ -45,10 +48,7 @@ - Nuke: fixing menu re-drawing during context change [\#2374](https://github.com/pypeclub/OpenPype/pull/2374) - Webpublisher: Fix assignment of families of TVpaint instances [\#2373](https://github.com/pypeclub/OpenPype/pull/2373) - Nuke: fixing node name based on switched asset name [\#2369](https://github.com/pypeclub/OpenPype/pull/2369) -- JobQueue: Fix loading of settings [\#2362](https://github.com/pypeclub/OpenPype/pull/2362) -- Tools: Placeholder color [\#2359](https://github.com/pypeclub/OpenPype/pull/2359) - Houdini: Fix HDA creation [\#2350](https://github.com/pypeclub/OpenPype/pull/2350) -- Flame: Fix default argument value in custom dictionary [\#2339](https://github.com/pypeclub/OpenPype/pull/2339) **Merged pull requests:** diff --git a/openpype/version.py b/openpype/version.py index 891cd4fd52..2d238f68b6 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.7.0-nightly.13" +__version__ = "3.7.0-nightly.14" diff --git a/pyproject.toml b/pyproject.toml index adf3e3a25d..d027f3f735 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.7.0-nightly.13" # OpenPype +version = "3.7.0-nightly.14" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From b8a5b1636e5bfdb1d494d63b4734b5ccbda7fa9c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 4 Jan 2022 13:57:05 +0100 Subject: [PATCH 330/341] removed unused avalon_mongo_url from module --- openpype/modules/avalon_apps/avalon_app.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/openpype/modules/avalon_apps/avalon_app.py b/openpype/modules/avalon_apps/avalon_app.py index 9e650a097e..347fcf11a6 100644 --- a/openpype/modules/avalon_apps/avalon_app.py +++ b/openpype/modules/avalon_apps/avalon_app.py @@ -13,14 +13,6 @@ class AvalonModule(OpenPypeModule, ITrayModule): avalon_settings = modules_settings[self.name] - # Check if environment is already set - avalon_mongo_url = os.environ.get("AVALON_MONGO") - if not avalon_mongo_url: - avalon_mongo_url = avalon_settings["AVALON_MONGO"] - # Use pype mongo if Avalon's mongo not defined - if not avalon_mongo_url: - avalon_mongo_url = os.environ["OPENPYPE_MONGO"] - thumbnail_root = os.environ.get("AVALON_THUMBNAIL_ROOT") if not thumbnail_root: thumbnail_root = avalon_settings["AVALON_THUMBNAIL_ROOT"] @@ -31,7 +23,6 @@ class AvalonModule(OpenPypeModule, ITrayModule): avalon_mongo_timeout = avalon_settings["AVALON_TIMEOUT"] self.thumbnail_root = thumbnail_root - self.avalon_mongo_url = avalon_mongo_url self.avalon_mongo_timeout = avalon_mongo_timeout # Tray attributes From 4a2b1865bf6f11e1255d6cf0d19e67b0fe3dc773 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 4 Jan 2022 13:57:39 +0100 Subject: [PATCH 331/341] library loader is not always on top in tray --- openpype/modules/avalon_apps/avalon_app.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/openpype/modules/avalon_apps/avalon_app.py b/openpype/modules/avalon_apps/avalon_app.py index 347fcf11a6..51a22323f1 100644 --- a/openpype/modules/avalon_apps/avalon_app.py +++ b/openpype/modules/avalon_apps/avalon_app.py @@ -42,12 +42,20 @@ class AvalonModule(OpenPypeModule, ITrayModule): def tray_init(self): # Add library tool try: + from Qt import QtCore from openpype.tools.libraryloader import LibraryLoaderWindow - self.libraryloader = LibraryLoaderWindow( + libraryloader = LibraryLoaderWindow( show_projects=True, show_libraries=True ) + # Remove always on top flag for tray + window_flags = libraryloader.windowFlags() + if window_flags | QtCore.Qt.WindowStaysOnTopHint: + window_flags ^= QtCore.Qt.WindowStaysOnTopHint + libraryloader.setWindowFlags(window_flags) + self.libraryloader = libraryloader + except Exception: self.log.warning( "Couldn't load Library loader tool for tray.", From 80fd24fed5ad4ffcd99a6de8495b78efce6fc85d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 4 Jan 2022 13:57:55 +0100 Subject: [PATCH 332/341] use openpype style in delivery loader --- openpype/plugins/load/delivery.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/plugins/load/delivery.py b/openpype/plugins/load/delivery.py index a8cb0070ee..90f8e91571 100644 --- a/openpype/plugins/load/delivery.py +++ b/openpype/plugins/load/delivery.py @@ -3,11 +3,11 @@ import copy from Qt import QtWidgets, QtCore, QtGui -from avalon import api, style +from avalon import api from avalon.api import AvalonMongoDB from openpype.api import Anatomy, config -from openpype import resources +from openpype import resources, style from openpype.lib.delivery import ( sizeof_fmt, From d53b038b4abf928f07527139043143b2b831eaef Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 4 Jan 2022 13:58:14 +0100 Subject: [PATCH 333/341] modified flags of delivery dialog to be always on top --- openpype/plugins/load/delivery.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/openpype/plugins/load/delivery.py b/openpype/plugins/load/delivery.py index 90f8e91571..1037d6dc16 100644 --- a/openpype/plugins/load/delivery.py +++ b/openpype/plugins/load/delivery.py @@ -1,5 +1,5 @@ -from collections import defaultdict import copy +from collections import defaultdict from Qt import QtWidgets, QtCore, QtGui @@ -58,6 +58,18 @@ class DeliveryOptionsDialog(QtWidgets.QDialog): def __init__(self, contexts, log=None, parent=None): super(DeliveryOptionsDialog, self).__init__(parent=parent) + self.setWindowTitle("OpenPype - Deliver versions") + icon = QtGui.QIcon(resources.get_openpype_icon_filepath()) + self.setWindowIcon(icon) + + self.setWindowFlags( + QtCore.Qt.WindowStaysOnTopHint + | QtCore.Qt.WindowCloseButtonHint + | QtCore.Qt.WindowMinimizeButtonHint + ) + + self.setStyleSheet(style.load_stylesheet()) + project = contexts[0]["project"]["name"] self.anatomy = Anatomy(project) self._representations = None @@ -70,16 +82,6 @@ class DeliveryOptionsDialog(QtWidgets.QDialog): self._set_representations(contexts) - self.setWindowTitle("OpenPype - Deliver versions") - icon = QtGui.QIcon(resources.get_openpype_icon_filepath()) - self.setWindowIcon(icon) - - self.setWindowFlags( - QtCore.Qt.WindowCloseButtonHint | - QtCore.Qt.WindowMinimizeButtonHint - ) - self.setStyleSheet(style.load_stylesheet()) - dropdown = QtWidgets.QComboBox() self.templates = self._get_templates(self.anatomy) for name, _ in self.templates.items(): From 53971b55e3daf41867879fb0305ed70059166af2 Mon Sep 17 00:00:00 2001 From: OpenPype Date: Tue, 4 Jan 2022 13:39:41 +0000 Subject: [PATCH 334/341] [Automated] Release --- CHANGELOG.md | 9 ++------- openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36e5672c3f..fc14b5f507 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,17 +1,12 @@ # Changelog -## [3.7.0-nightly.14](https://github.com/pypeclub/OpenPype/tree/HEAD) +## [3.7.0](https://github.com/pypeclub/OpenPype/tree/3.7.0) (2022-01-04) -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...HEAD) - -**Deprecated:** - -- General: Default modules hierarchy n2 [\#2368](https://github.com/pypeclub/OpenPype/pull/2368) +[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...3.7.0) **🚀 Enhancements** - General: Workdir extra folders [\#2462](https://github.com/pypeclub/OpenPype/pull/2462) -- Harmony: Added new style validations for New Publisher [\#2434](https://github.com/pypeclub/OpenPype/pull/2434) - Photoshop: New style validations for New publisher [\#2429](https://github.com/pypeclub/OpenPype/pull/2429) - General: Environment variables groups [\#2424](https://github.com/pypeclub/OpenPype/pull/2424) - Unreal: Dynamic menu created in Python [\#2422](https://github.com/pypeclub/OpenPype/pull/2422) diff --git a/openpype/version.py b/openpype/version.py index 2d238f68b6..8fac77bcdf 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.7.0-nightly.14" +__version__ = "3.7.0" diff --git a/pyproject.toml b/pyproject.toml index d027f3f735..dd1f5c90b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.7.0-nightly.14" # OpenPype +version = "3.7.0" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From 31ab8e51f88e559fadade204c247682a0a7fbf3a Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 4 Jan 2022 15:31:28 +0100 Subject: [PATCH 335/341] marker colors picking correctly --- openpype/hosts/flame/otio/flame_export.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/openpype/hosts/flame/otio/flame_export.py b/openpype/hosts/flame/otio/flame_export.py index 356cf1b49e..aea1f387e8 100644 --- a/openpype/hosts/flame/otio/flame_export.py +++ b/openpype/hosts/flame/otio/flame_export.py @@ -3,7 +3,6 @@ import os import re -import sys import json import logging import opentimelineio as otio @@ -52,7 +51,7 @@ class CTX: @classmethod def get_fps(cls): - return cls._fps + return cls._fps @classmethod def set_tl_start_frame(cls, number): @@ -64,7 +63,7 @@ class CTX: @classmethod def get_tl_start_frame(cls): - return cls._tl_start_frame + return cls._tl_start_frame def flatten(_list): @@ -105,7 +104,6 @@ def _get_metadata(item): def create_time_effects(otio_clip, item): # todo #2426: add retiming effects to export - pass # get all subtrack items # subTrackItems = flatten(track_item.parent().subTrackItems()) # speed = track_item.playbackSpeed() @@ -174,11 +172,18 @@ def create_time_effects(otio_clip, item): # # add otio effect to clip effects # otio_clip.effects.append(otio_effect) + pass def _get_marker_color(flame_colour): - if flame_colour in MARKERS_COLOR_MAP: - return MARKERS_COLOR_MAP[flame_colour] + # clamp colors to closes half numbers + _flame_colour = [ + (lambda x: round(x * 2) / 2)(c) + for c in flame_colour] + + for color, otio_color_type in MARKERS_COLOR_MAP.items(): + if _flame_colour == list(color): + return otio_color_type return otio.schema.MarkerColor.RED From cd0ad34595286cd06fd48c970713f4beba0d8a86 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 4 Jan 2022 16:34:10 +0100 Subject: [PATCH 336/341] modify comment Co-authored-by: Petr Kalis --- openpype/settings/entities/op_version_entity.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/openpype/settings/entities/op_version_entity.py b/openpype/settings/entities/op_version_entity.py index 6f6243cfee..55f8450edf 100644 --- a/openpype/settings/entities/op_version_entity.py +++ b/openpype/settings/entities/op_version_entity.py @@ -14,10 +14,8 @@ from .exceptions import BaseInvalidValue class OpenPypeVersionInput(TextEntity): """Entity to store OpenPype version to use. - It is text input as creating of settings on different machines may - affect which versions are available so it must have option to set OpenPype - version which is not available for machine where settings entities are - loaded. + Settings created on another machine may affect available versions on current user's machine. + Text input element is provided to explicitly set version not yet showing up the user's machine. It is possible to enter empty string. In that case is used any latest version. Any other string must match regex of OpenPype version semantic. From 18104b6aed36ee490992e76fe11b0b02b8d7ef1f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 4 Jan 2022 16:54:48 +0100 Subject: [PATCH 337/341] fix docstring text length --- openpype/settings/entities/op_version_entity.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openpype/settings/entities/op_version_entity.py b/openpype/settings/entities/op_version_entity.py index 55f8450edf..1576173654 100644 --- a/openpype/settings/entities/op_version_entity.py +++ b/openpype/settings/entities/op_version_entity.py @@ -14,8 +14,9 @@ from .exceptions import BaseInvalidValue class OpenPypeVersionInput(TextEntity): """Entity to store OpenPype version to use. - Settings created on another machine may affect available versions on current user's machine. - Text input element is provided to explicitly set version not yet showing up the user's machine. + Settings created on another machine may affect available versions + on current user's machine. Text input element is provided to explicitly + set version not yet showing up the user's machine. It is possible to enter empty string. In that case is used any latest version. Any other string must match regex of OpenPype version semantic. From 07e151981c34e8cdb5710ce8a853be08530f0cb9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 4 Jan 2022 17:14:00 +0100 Subject: [PATCH 338/341] skip duplicated versions --- openpype/settings/entities/op_version_entity.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/openpype/settings/entities/op_version_entity.py b/openpype/settings/entities/op_version_entity.py index 1576173654..6184f7640a 100644 --- a/openpype/settings/entities/op_version_entity.py +++ b/openpype/settings/entities/op_version_entity.py @@ -38,9 +38,10 @@ class OpenPypeVersionInput(TextEntity): value_hints = [] if state is OverrideState.STUDIO: versions = self._get_openpype_versions() - if versions is not None: - for version in versions: - value_hints.append(str(version)) + for version in versions: + version_str = str(version) + if version_str not in value_hints: + value_hints.append(version_str) self.value_hints = value_hints From 571eef7cb374f87c62ed8d9be804994dde43624e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 4 Jan 2022 18:24:50 +0100 Subject: [PATCH 339/341] fix filtering criteria for profile selection --- openpype/lib/avalon_context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index cb5bca133d..8180e416a9 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -1560,7 +1560,7 @@ def get_custom_workfile_template_by_context( # get path from matching profile matching_item = filter_profiles( template_profiles, - {"task_type": current_task_type} + {"task_types": current_task_type} ) # when path is available try to format it in case # there are some anatomy template strings From eaeb96c92f4075f2719892d732ef842eb5f36fb3 Mon Sep 17 00:00:00 2001 From: OpenPype Date: Wed, 5 Jan 2022 03:41:51 +0000 Subject: [PATCH 340/341] [Automated] Bump version --- CHANGELOG.md | 28 +++++++++++++++++++++++++++- openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc14b5f507..c46b1f37e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,34 @@ # Changelog +## [3.8.0-nightly.1](https://github.com/pypeclub/OpenPype/tree/HEAD) + +[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.7.0...HEAD) + +**🆕 New features** + +- Flame: OpenTimelineIO Export Modul [\#2398](https://github.com/pypeclub/OpenPype/pull/2398) + +**🚀 Enhancements** + +- Tools: Be able to change models of tasks and assets widgets [\#2475](https://github.com/pypeclub/OpenPype/pull/2475) +- Publish pype: Reduce publish process defering [\#2464](https://github.com/pypeclub/OpenPype/pull/2464) +- Maya: Improve speed of Collect History logic [\#2460](https://github.com/pypeclub/OpenPype/pull/2460) +- Maya: Validate Rig Controllers - fix Error: in script editor [\#2459](https://github.com/pypeclub/OpenPype/pull/2459) +- Maya: Optimize Validate Locked Normals speed for dense polymeshes [\#2457](https://github.com/pypeclub/OpenPype/pull/2457) +- Maya : add option to not group reference in ReferenceLoader [\#2383](https://github.com/pypeclub/OpenPype/pull/2383) + +**🐛 Bug fixes** + +- General: Custom template paths filter fix [\#2483](https://github.com/pypeclub/OpenPype/pull/2483) +- Loader: Remove always on top flag in tray [\#2480](https://github.com/pypeclub/OpenPype/pull/2480) + ## [3.7.0](https://github.com/pypeclub/OpenPype/tree/3.7.0) (2022-01-04) -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...3.7.0) +[Full Changelog](https://github.com/pypeclub/OpenPype/compare/CI/3.7.0-nightly.14...3.7.0) + +**Deprecated:** + +- General: Default modules hierarchy n2 [\#2368](https://github.com/pypeclub/OpenPype/pull/2368) **🚀 Enhancements** diff --git a/openpype/version.py b/openpype/version.py index 8fac77bcdf..4f10deeae1 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.7.0" +__version__ = "3.8.0-nightly.1" diff --git a/pyproject.toml b/pyproject.toml index dd1f5c90b6..20aaf62d06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.7.0" # OpenPype +version = "3.8.0-nightly.1" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From 6b8b7f22e65aa964f0f9276672adcbabae8c392e Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 5 Jan 2022 10:30:31 +0100 Subject: [PATCH 341/341] Fix #2473 Update "Repair Context" label to "Repair" --- openpype/action.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/action.py b/openpype/action.py index 3fc6dd1a8f..50741875e4 100644 --- a/openpype/action.py +++ b/openpype/action.py @@ -72,7 +72,7 @@ class RepairContextAction(pyblish.api.Action): is available on the plugin. """ - label = "Repair Context" + label = "Repair" on = "failed" # This action is only available on a failed plug-in def process(self, context, plugin):

T?l+QGi$fkPR)FX&X7jjq1=NyC`9!-G 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≻eY57dL8+{AKtzjXxKp@;eV8t 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