Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Commit

Permalink
Merge branch '2.x/develop' into feature/239-resolve_tagging_for_publish
Browse files Browse the repository at this point in the history
  • Loading branch information
jakubjezek001 committed Jul 13, 2020
2 parents e259a55 + 1c676d9 commit a26292b
Show file tree
Hide file tree
Showing 63 changed files with 294 additions and 221 deletions.
29 changes: 29 additions & 0 deletions pype/hooks/premiere/prelaunch.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os
import traceback
import winreg
from avalon import api, io, lib
from pype.lib import PypeHook
from pype.api import Logger, Anatomy
Expand All @@ -14,6 +15,12 @@ class PremierePrelaunch(PypeHook):
shell script.
"""
project_code = None
reg_string_value = [{
"path": r"Software\Adobe\CSXS.9",
"name": "PlayerDebugMode",
"type": winreg.REG_SZ,
"value": "1"
}]

def __init__(self, logger=None):
if not logger:
Expand Down Expand Up @@ -55,6 +62,10 @@ def execute(self, *args, env: dict = None) -> bool:
# adding project code to env
env["AVALON_PROJECT_CODE"] = self.project_code

# add keys to registry
self.modify_registry()

# start avalon
try:
__import__("pype.hosts.premiere")
__import__("pyblish")
Expand All @@ -69,6 +80,24 @@ def execute(self, *args, env: dict = None) -> bool:

return True

def modify_registry(self):
# adding key to registry
for key in self.reg_string_value:
winreg.CreateKey(winreg.HKEY_CURRENT_USER, key["path"])
rg_key = winreg.OpenKey(
key=winreg.HKEY_CURRENT_USER,
sub_key=key["path"],
reserved=0,
access=winreg.KEY_ALL_ACCESS)

winreg.SetValueEx(
rg_key,
key["name"],
0,
key["type"],
key["value"]
)

def get_anatomy_filled(self):
root_path = api.registered_root()
project_name = self._S["AVALON_PROJECT"]
Expand Down
4 changes: 2 additions & 2 deletions pype/hosts/celaction/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

from pype.api import Logger
import pype
import pype.celaction
from pype.hosts import celaction

log = Logger().get_logger("Celaction_cli_publisher")

Expand Down Expand Up @@ -49,7 +49,7 @@ def cli():
# parser.add_argument("--programDir",
# help=("Directory with celaction program installation"))

pype.celaction.kwargs = parser.parse_args(sys.argv[1:]).__dict__
celaction.kwargs = parser.parse_args(sys.argv[1:]).__dict__


def _prepare_publish_environments():
Expand Down
9 changes: 9 additions & 0 deletions pype/hosts/maya/expected_files.py
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,15 @@ def get_renderer_prefix(self):
prefix = "{}_<aov>".format(prefix)
return prefix

def _get_layer_data(self):
"""Override to get vray specific extension."""
layer_data = super(ExpectedFilesVray, self)._get_layer_data()
default_ext = cmds.getAttr("vraySettings.imageFormatStr")
if default_ext == "exr (multichannel)" or default_ext == "exr (deep)":
default_ext = "exr"
layer_data["defaultExt"] = default_ext
return layer_data

def get_files(self):
"""Get expected files.
Expand Down
2 changes: 1 addition & 1 deletion pype/modules/adobe_communicator/lib/publish.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def main(env):
# Register Host (and it's pyblish plugins)
host_name = env["AVALON_APP"]
# TODO not sure if use "pype." or "avalon." for host import
host_import_str = f"pype.{host_name}"
host_import_str = f"pype.hosts.{host_name}"

try:
host_module = importlib.import_module(host_import_str)
Expand Down
64 changes: 46 additions & 18 deletions pype/modules/ftrack/actions/action_delete_asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -497,9 +497,8 @@ def launch(self, session, entities, event):
for entity in entities:
ftrack_id = entity["id"]
ftrack_id_name_map[ftrack_id] = entity["name"]
if ftrack_id in ftrack_ids_to_delete:
continue
not_deleted_entities_id.append(ftrack_id)
if ftrack_id not in ftrack_ids_to_delete:
not_deleted_entities_id.append(ftrack_id)

mongo_proc_txt = "MongoProcessing: "
ftrack_proc_txt = "Ftrack processing: "
Expand Down Expand Up @@ -534,25 +533,20 @@ def launch(self, session, entities, event):
ftrack_proc_txt, ", ".join(ftrack_ids_to_delete)
))

joined_ids_to_delete = ", ".join(
["\"{}\"".format(id) for id in ftrack_ids_to_delete]
ftrack_ents_to_delete = (
self._filter_entities_to_delete(ftrack_ids_to_delete, session)
)
ftrack_ents_to_delete = self.session.query(
"select id, link from TypedContext where id in ({})".format(
joined_ids_to_delete
)
).all()
for entity in ftrack_ents_to_delete:
self.session.delete(entity)
session.delete(entity)
try:
self.session.commit()
session.commit()
except Exception:
ent_path = "/".join(
[ent["name"] for ent in entity["link"]]
)
msg = "Failed to delete entity"
report_messages[msg].append(ent_path)
self.session.rollback()
session.rollback()
self.log.warning(
"{} <{}>".format(msg, ent_path),
exc_info=True
Expand All @@ -568,7 +562,7 @@ def launch(self, session, entities, event):
for name in asset_names_to_delete
])
# Find assets of selected entities with names of checked subsets
assets = self.session.query((
assets = session.query((
"select id from Asset where"
" context_id in ({}) and name in ({})"
).format(joined_not_deleted, joined_asset_names)).all()
Expand All @@ -578,20 +572,54 @@ def launch(self, session, entities, event):
", ".join([asset["id"] for asset in assets])
))
for asset in assets:
self.session.delete(asset)
session.delete(asset)
try:
self.session.commit()
session.commit()
except Exception:
self.session.rollback()
session.rollback()
msg = "Failed to delete asset"
report_messages[msg].append(asset["id"])
self.log.warning(
"{} <{}>".format(asset["id"]),
"Asset: {} <{}>".format(asset["name"], asset["id"]),
exc_info=True
)

return self.report_handle(report_messages, project_name, event)

def _filter_entities_to_delete(self, ftrack_ids_to_delete, session):
"""Filter children entities to avoid CircularDependencyError."""
joined_ids_to_delete = ", ".join(
["\"{}\"".format(id) for id in ftrack_ids_to_delete]
)
to_delete_entities = session.query(
"select id, link from TypedContext where id in ({})".format(
joined_ids_to_delete
)
).all()
filtered = to_delete_entities[:]
while True:
changed = False
_filtered = filtered[:]
for entity in filtered:
entity_id = entity["id"]

for _entity in tuple(_filtered):
if entity_id == _entity["id"]:
continue

for _link in _entity["link"]:
if entity_id == _link["id"] and _entity in _filtered:
_filtered.remove(_entity)
changed = True
break

filtered = _filtered

if not changed:
break

return filtered

def report_handle(self, report_messages, project_name, event):
if not report_messages:
return {
Expand Down
71 changes: 11 additions & 60 deletions pype/modules/ftrack/actions/action_djvview.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
import os
import sys
import logging
import subprocess
from operator import itemgetter
import ftrack_api
from pype.modules.ftrack.lib import BaseAction, statics_icon
from pype.api import Logger, config

log = Logger().get_logger(__name__)


class DJVViewAction(BaseAction):
Expand All @@ -19,20 +13,18 @@ class DJVViewAction(BaseAction):

type = 'Application'

allowed_types = [
"cin", "dpx", "avi", "dv", "gif", "flv", "mkv", "mov", "mpg", "mpeg",
"mp4", "m4v", "mxf", "iff", "z", "ifl", "jpeg", "jpg", "jfif", "lut",
"1dl", "exr", "pic", "png", "ppm", "pnm", "pgm", "pbm", "rla", "rpf",
"sgi", "rgba", "rgb", "bw", "tga", "tiff", "tif", "img"
]

def __init__(self, session, plugins_presets):
'''Expects a ftrack_api.Session instance'''
super().__init__(session, plugins_presets)
self.djv_path = None

self.config_data = config.get_presets()['djv_view']['config']
self.set_djv_path()

if self.djv_path is None:
return

self.allowed_types = self.config_data.get(
'file_ext', ["img", "mov", "exr"]
)
self.djv_path = self.find_djv_path()

def preregister(self):
if self.djv_path is None:
Expand All @@ -53,11 +45,10 @@ def discover(self, session, entities, event):
return True
return False

def set_djv_path(self):
for path in self.config_data.get("djv_paths", []):
def find_djv_path(self):
for path in (os.environ.get("DJV_PATH") or "").split(os.pathsep):
if os.path.exists(path):
self.djv_path = path
break
return path

def interface(self, session, entities, event):
if event['data'].get('values', {}):
Expand Down Expand Up @@ -221,43 +212,3 @@ def register(session, plugins_presets={}):
"""Register hooks."""

DJVViewAction(session, plugins_presets).register()


def main(arguments=None):
'''Set up logging and register action.'''
if arguments is None:
arguments = []

import argparse
parser = argparse.ArgumentParser()
# Allow setting of logging level from arguments.
loggingLevels = {}
for level in (
logging.NOTSET, logging.DEBUG, logging.INFO, logging.WARNING,
logging.ERROR, logging.CRITICAL
):
loggingLevels[logging.getLevelName(level).lower()] = level

parser.add_argument(
'-v', '--verbosity',
help='Set the logging output verbosity.',
choices=loggingLevels.keys(),
default='info'
)
namespace = parser.parse_args(arguments)

# Set up basic logging
logging.basicConfig(level=loggingLevels[namespace.verbosity])

session = ftrack_api.Session()
register(session)

# Wait for events
logging.info(
'Registered actions and listening for events. Use Ctrl-C to abort.'
)
session.event_hub.wait()


if __name__ == '__main__':
raise SystemExit(main(sys.argv[1:]))
33 changes: 15 additions & 18 deletions pype/modules/ftrack/tray/login_tools.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib import parse
import os
import webbrowser
import functools
import pype
import inspect
from Qt import QtCore
from pype.api import resources


class LoginServerHandler(BaseHTTPRequestHandler):
'''Login server handler.'''

message_filepath = resources.get_resource("ftrack", "sign_in_message.html")

def __init__(self, login_callback, *args, **kw):
'''Initialise handler.'''
self.login_callback = login_callback
Expand All @@ -28,23 +28,21 @@ def do_GET(self):
login_credentials = parse.parse_qs(query)
api_user = login_credentials['api_user'][0]
api_key = login_credentials['api_key'][0]
# get path to resources
path_items = os.path.dirname(
inspect.getfile(pype)
).split(os.path.sep)
del path_items[-1]
path_items.extend(['res', 'ftrack', 'sign_in_message.html'])
message_filepath = os.path.sep.join(path_items)
message_file = open(message_filepath, 'r')
sign_in_message = message_file.read()
message_file.close()

with open(self.message_filepath, "r") as message_file:
sign_in_message = message_file.read()

# formatting html code for python
replacement = [('{', '{{'), ('}', '}}'), ('{{}}', '{}')]
for r in (replacement):
sign_in_message = sign_in_message.replace(*r)
replacements = (
("{", "{{"),
("}", "}}"),
("{{}}", "{}")
)
for replacement in (replacements):
sign_in_message = sign_in_message.replace(*replacement)
message = sign_in_message.format(api_user)
else:
message = '<h1>Failed to sign in</h1>'
message = "<h1>Failed to sign in</h1>"

self.send_response(200)
self.end_headers()
Expand Down Expand Up @@ -74,7 +72,6 @@ def _handle_login(self, api_user, api_key):

def run(self):
'''Listen for events.'''
# self._server = BaseHTTPServer.HTTPServer(
self._server = HTTPServer(
('localhost', 0),
functools.partial(
Expand Down
2 changes: 2 additions & 0 deletions pype/modules/rest_api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from .base_class import RestApi, abort, route, register_statics
from .lib import RestMethods, CallbackResult

CLASS_DEFINIION = RestApiServer


def tray_init(tray_widget, main_widget):
return RestApiServer()
Loading

0 comments on commit a26292b

Please sign in to comment.