From 2df994f96c50ac85032a0e552d64a7ba4a3b6550 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Fri, 22 Jan 2021 22:35:21 +0100 Subject: [PATCH] add photoshop template copying (port from 2.x) --- pype/hooks/photoshop/prelaunch.py | 131 ++++++++++++++++++++++++++++++ pype/hosts/photoshop/template.psd | Bin 0 -> 159710 bytes 2 files changed, 131 insertions(+) create mode 100644 pype/hooks/photoshop/prelaunch.py create mode 100644 pype/hosts/photoshop/template.psd diff --git a/pype/hooks/photoshop/prelaunch.py b/pype/hooks/photoshop/prelaunch.py new file mode 100644 index 0000000000..bcd842736e --- /dev/null +++ b/pype/hooks/photoshop/prelaunch.py @@ -0,0 +1,131 @@ +import os +import pype.lib +from pype.api import Logger, Anatomy +import shutil +import getpass +import avalon.api + + +class PhotoshopPrelaunch(pype.lib.PypeHook): + """This hook will check for the existence of PyWin + + PyWin is a requirement for the Photoshop integration. + """ + project_code = None + host_name = "photoshop" + + def __init__(self, logger=None): + if not logger: + self.log = Logger().get_logger(self.__class__.__name__) + else: + self.log = logger + + self.signature = "( {} )".format(self.__class__.__name__) + + def execute(self, *args, env: dict = None) -> bool: + output = pype.lib._subprocess(["pip", "install", "pywin32==227"]) + self.log.info(output) + + workfile_path = self.get_workfile_plath(env, self.host_name) + + # adding compulsory environment var for openting file + env["PYPE_WORKFILE_PATH"] = workfile_path + + return True + + def get_anatomy_filled(self, workdir, project_name, asset_name, + task_name, host_name, extension): + dbcon = avalon.api.AvalonMongoDB() + dbcon.install() + dbcon.Session["AVALON_PROJECT"] = project_name + project_document = dbcon.find_one({"type": "project"}) + asset_document = dbcon.find_one({ + "type": "asset", + "name": asset_name + }) + dbcon.uninstall() + + asset_doc_parents = asset_document["data"].get("parents") + hierarchy = "/".join(asset_doc_parents) + + data = { + "project": { + "name": project_document["name"], + "code": project_document["data"].get("code") + }, + "task": task_name, + "asset": asset_name, + "app": host_name, + "hierarchy": hierarchy + } + anatomy = Anatomy(project_name) + file_template = anatomy.templates["work"]["file"] + data.update({ + "version": 1, + "user": os.environ.get("PYPE_USERNAME") or getpass.getuser(), + "ext": extension + }) + + return avalon.api.last_workfile( + workdir, file_template, data, + avalon.api.HOST_WORKFILE_EXTENSIONS[host_name], True + ) + + def get_workfile_plath(self, env, host_name): + # get context variables + project_name = env["AVALON_PROJECT"] + asset_name = env["AVALON_ASSET"] + task_name = env["AVALON_TASK"] + workdir = env["AVALON_WORKDIR"] + extension = avalon.api.HOST_WORKFILE_EXTENSIONS[host_name][0] + template_env_key = "{}_TEMPLATE".format(host_name.upper()) + + # get workfile path + workfile_path = self.get_anatomy_filled( + workdir, project_name, asset_name, task_name, host_name, extension) + + # create workdir if doesn't exist + os.makedirs(workdir, exist_ok=True) + self.log.info("Work dir is: `{}`".format(workdir)) + + # get last version of workfile + workfile_last = env.get("AVALON_LAST_WORKFILE") + self.log.debug("_ workfile_last: `{}`".format(workfile_last)) + + if workfile_last: + workfile = workfile_last + workfile_path = os.path.join(workdir, workfile) + + # copy workfile from template if doesnt exist any on path + if not os.path.isfile(workfile_path): + # try to get path from environment or use default + # from `pype.hosts.` dir + template_path = env.get(template_env_key) or os.path.join( + env.get("PYPE_MODULE_ROOT"), + "pype/hosts/{}/template{}".format(host_name, extension) + ) + + # try to get template from project config folder + proj_config_path = os.path.join( + env["PYPE_PROJECT_CONFIGS"], project_name) + if os.path.exists(proj_config_path): + + template_file = None + for f in os.listdir(proj_config_path): + if extension in os.path.splitext(f): + template_file = f + + if template_file: + template_path = os.path.join( + proj_config_path, template_file) + self.log.info( + "Creating workfile from template: `{}`".format(template_path)) + + # copy template to new destinantion + shutil.copy2( + os.path.normpath(template_path), + os.path.normpath(workfile_path) + ) + + self.log.info("Workfile to open: `{}`".format(workfile_path)) + return workfile_path diff --git a/pype/hosts/photoshop/template.psd b/pype/hosts/photoshop/template.psd new file mode 100644 index 0000000000000000000000000000000000000000..4c731771bac895ff672a86c1281cded9bfa0c049 GIT binary patch literal 159710 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 Z009U<00Izz00bZa0SG_<0{;gE{tFxEb}Ik? literal 0 HcmV?d00001