From eb3f8d80a2deae3428e1c3915ba0d0f8db2398f8 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Thu, 4 Apr 2019 16:55:40 +0200 Subject: [PATCH 1/3] added "app" into all template_data thath fill "work" dir --- pype/ftrack/lib/ftrack_app_handler.py | 3 +++ pype/nuke/lib.py | 4 +++- .../global/publish/collect_assumed_destination.py | 7 ++++--- pype/plugins/global/publish/integrate.py | 10 ++++++---- .../global/publish/integrate_rendered_frames.py | 10 ++++++---- pype/plugins/global/publish/validate_templates.py | 6 ++++-- pype/templates.py | 6 +++--- 7 files changed, 29 insertions(+), 17 deletions(-) diff --git a/pype/ftrack/lib/ftrack_app_handler.py b/pype/ftrack/lib/ftrack_app_handler.py index bd216ff6bf..30acd4d849 100644 --- a/pype/ftrack/lib/ftrack_app_handler.py +++ b/pype/ftrack/lib/ftrack_app_handler.py @@ -198,10 +198,13 @@ class AppAction(BaseHandler): if parents: hierarchy = os.path.join(*parents) + application = avalonlib.get_application(os.environ["AVALON_APP_NAME"]) + data = {"project": {"name": entity['project']['full_name'], "code": entity['project']['name']}, "task": entity['name'], "asset": entity['parent']['name'], + "app": application["application_dir"], "hierarchy": hierarchy} try: anatomy = anatomy.format(data) diff --git a/pype/nuke/lib.py b/pype/nuke/lib.py index 0f29484d9f..2b196db4b4 100644 --- a/pype/nuke/lib.py +++ b/pype/nuke/lib.py @@ -2,7 +2,7 @@ import sys from collections import OrderedDict from pprint import pprint from avalon.vendor.Qt import QtGui -from avalon import api, io +from avalon import api, io, lib import avalon.nuke import pype.api as pype import nuke @@ -88,6 +88,7 @@ def create_write_node(name, data): ) nuke_dataflow_writes = get_dataflow(**data) nuke_colorspace_writes = get_colorspace(**data) + application = lib.get_application(os.environ["AVALON_APP_NAME"]) try: anatomy_filled = format_anatomy({ "subset": data["avalon"]["subset"], @@ -97,6 +98,7 @@ def create_write_node(name, data): "project": {"name": pype.get_project_name(), "code": pype.get_project_code()}, "representation": nuke_dataflow_writes.file_type, + "app": application["application_dir"], }) except Exception as e: log.error("problem with resolving anatomy tepmlate: {}".format(e)) diff --git a/pype/plugins/global/publish/collect_assumed_destination.py b/pype/plugins/global/publish/collect_assumed_destination.py index 7de358b422..2f567ebbb2 100644 --- a/pype/plugins/global/publish/collect_assumed_destination.py +++ b/pype/plugins/global/publish/collect_assumed_destination.py @@ -1,7 +1,7 @@ import os import pyblish.api -from avalon import io, api +from avalon import io, api, lib class CollectAssumedDestination(pyblish.api.InstancePlugin): @@ -67,7 +67,7 @@ class CollectAssumedDestination(pyblish.api.InstancePlugin): if hierarchy: # hierarchy = os.path.sep.join(hierarchy) hierarchy = os.path.join(*hierarchy) - + application = lib.get_application(os.environ["AVALON_APP_NAME"]) template_data = {"root": api.Session["AVALON_PROJECTS"], "project": {"name": project_name, "code": project['data']['code']}, @@ -77,7 +77,8 @@ class CollectAssumedDestination(pyblish.api.InstancePlugin): "subset": subset_name, "version": version_number, "hierarchy": hierarchy, - "representation": "TEMP"} + "representation": "TEMP", + "app": application["application_dir"]} instance.data["template"] = template instance.data["assumedTemplateData"] = template_data diff --git a/pype/plugins/global/publish/integrate.py b/pype/plugins/global/publish/integrate.py index 00096a95ee..5fd8a13670 100644 --- a/pype/plugins/global/publish/integrate.py +++ b/pype/plugins/global/publish/integrate.py @@ -4,7 +4,7 @@ import shutil import errno import pyblish.api -from avalon import api, io +from avalon import api, io, lib from avalon.vendor import filelink @@ -160,7 +160,7 @@ class IntegrateAsset(pyblish.api.InstancePlugin): if parents and len(parents) > 0: # hierarchy = os.path.sep.join(hierarchy) hierarchy = os.path.join(*parents) - + application = lib.get_application(os.environ["AVALON_APP_NAME"]) template_data = {"root": root, "project": {"name": PROJECT, "code": project['data']['code']}, @@ -169,7 +169,8 @@ class IntegrateAsset(pyblish.api.InstancePlugin): "family": instance.data['family'], "subset": subset["name"], "version": int(version["name"]), - "hierarchy": hierarchy} + "hierarchy": hierarchy, + "app": application["application_dir"]} template_publish = project["config"]["template"]["publish"] anatomy = instance.context.data['anatomy'] @@ -260,7 +261,8 @@ class IntegrateAsset(pyblish.api.InstancePlugin): "subset": subset["name"], "version": version["name"], "hierarchy": hierarchy, - "representation": ext[1:] + "representation": ext[1:], + "app": application["application_dir"] } } diff --git a/pype/plugins/global/publish/integrate_rendered_frames.py b/pype/plugins/global/publish/integrate_rendered_frames.py index 8e7e2a59c4..3a0e89c328 100644 --- a/pype/plugins/global/publish/integrate_rendered_frames.py +++ b/pype/plugins/global/publish/integrate_rendered_frames.py @@ -5,7 +5,7 @@ import clique import errno import pyblish.api -from avalon import api, io +from avalon import api, io, lib log = logging.getLogger(__name__) @@ -148,7 +148,7 @@ class IntegrateFrames(pyblish.api.InstancePlugin): if parents and len(parents) > 0: # hierarchy = os.path.sep.join(hierarchy) hierarchy = os.path.join(*parents) - + application = lib.get_application(os.environ["AVALON_APP_NAME"]) template_data = {"root": root, "project": {"name": PROJECT, "code": project['data']['code']}, @@ -158,7 +158,8 @@ class IntegrateFrames(pyblish.api.InstancePlugin): "family": instance.data['family'], "subset": subset["name"], "version": int(version["name"]), - "hierarchy": hierarchy} + "hierarchy": hierarchy, + "app": application["application_dir"]} # template_publish = project["config"]["template"]["publish"] anatomy = instance.context.data['anatomy'] @@ -272,7 +273,8 @@ class IntegrateFrames(pyblish.api.InstancePlugin): "subset": subset["name"], "version": int(version["name"]), "hierarchy": hierarchy, - "representation": ext[1:] + "representation": ext[1:], + "app": application["application_dir"] } } diff --git a/pype/plugins/global/publish/validate_templates.py b/pype/plugins/global/publish/validate_templates.py index 8f8eb45686..19d70a197c 100644 --- a/pype/plugins/global/publish/validate_templates.py +++ b/pype/plugins/global/publish/validate_templates.py @@ -22,7 +22,8 @@ class ValidateTemplates(pyblish.api.ContextPlugin): "version": 3, "task": "animation", "asset": "sh001", - "hierarchy": "ep101/sq01/sh010"} + "hierarchy": "ep101/sq01/sh010", + "app": "nuke"} anatomy = context.data["anatomy"].format(data) @@ -34,7 +35,8 @@ class ValidateTemplates(pyblish.api.ContextPlugin): "version": 1, "task": "lookdev", "asset": "bob", - "hierarchy": "ep101/sq01/bob"} + "hierarchy": "ep101/sq01/bob", + "app": "nuke"} anatomy = context.data["anatomy"].format(data) self.log.info(anatomy.work.file) diff --git a/pype/templates.py b/pype/templates.py index 92a0e2c3c7..7157cb1399 100644 --- a/pype/templates.py +++ b/pype/templates.py @@ -1,8 +1,7 @@ import os import re import sys -from avalon import io -from avalon import api as avalon +from avalon import io, api as avalon, lib as avalonlib from . import lib from app.api import (Templates, Logger, format) log = Logger.getLogger(__name__, @@ -222,13 +221,14 @@ def get_context_data(project=None, dict: contextual data """ - + application = avalonlib.get_application(os.environ["AVALON_APP_NAME"]) data = { "task": task or get_task(), "asset": asset or get_asset(), "project": {"name": project or get_project_name(), "code": get_project_code()}, "hierarchy": hierarchy or get_hierarchy(), + "app": application["application_dir"] } return data From 88fff9fad1d64ee5f0630ca0ed84ed42a27d2bd5 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Thu, 4 Apr 2019 16:56:42 +0200 Subject: [PATCH 2/3] created action which creates sw folders in "work" path --- .../actions/action_create_sw_folders.py | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 pype/ftrack/actions/action_create_sw_folders.py diff --git a/pype/ftrack/actions/action_create_sw_folders.py b/pype/ftrack/actions/action_create_sw_folders.py new file mode 100644 index 0000000000..f6b14cb764 --- /dev/null +++ b/pype/ftrack/actions/action_create_sw_folders.py @@ -0,0 +1,155 @@ +import os +import sys +import json +import argparse +import logging + +import ftrack_api +from avalon import lib as avalonlib +from avalon.tools.libraryloader.io_nonsingleton import DbConnector +from pype import lib as pypelib +from pype.ftrack import BaseAction + + +class CreateSWFolders(BaseAction): + '''Edit meta data action.''' + + #: Action identifier. + identifier = 'create.sw.folders' + #: Action label. + label = 'Create SW Folders' + #: Action description. + description = 'Creates folders for all SW in project' + + + def __init__(self, session): + super().__init__(session) + self.avalon_db = DbConnector() + self.avalon_db.install() + + def discover(self, session, entities, event): + ''' Validation ''' + + return True + + def launch(self, session, entities, event): + if len(entities) != 1: + self.log.warning( + 'There are more entities in selection!' + ) + return False + entity = entities[0] + if entity.entity_type.lower() != 'task': + self.log.warning( + 'Selected entity is not Task!' + ) + return False + asset = entity['parent'] + project = asset['project'] + + project_name = project["full_name"] + self.avalon_db.Session['AVALON_PROJECT'] = project_name + av_project = self.avalon_db.find_one({'type': 'project'}) + av_asset = self.avalon_db.find_one({ + 'type': 'asset', + 'name': asset['name'] + }) + + templates = av_project["config"]["template"] + template = templates.get("work", None) + if template is None: + return False + + + data = { + "root": os.environ["AVALON_PROJECTS"], + "project": { + "name": project_name, + "code": project["name"] + }, + "hierarchy": av_asset['data']['hierarchy'], + "asset": asset['name'], + "task": entity['name'], + } + + apps = [] + if '{app}' in template: + # Apps in project + for app in av_project['data']['applications']: + app_data = avalonlib.get_application(app) + app_dir = app_data['application_dir'] + if app_dir not in apps: + apps.append(app_dir) + # Apps in presets + path_items = [pypelib.get_presets_path(), 'tools', 'sw_folders.json'] + filepath = os.path.sep.join(path_items) + + presets = dict() + try: + with open(filepath) as data_file: + presets = json.load(data_file) + except Exception as e: + self.log.warning('Wasn\'t able to load presets') + preset_apps = presets.get(project_name, presets.get('__default__', [])) + for app in preset_apps: + if app not in apps: + apps.append(app) + + # Create folders for apps + for app in apps: + data['app'] = app + self.log.info('Created folder for app {}'.format(app)) + path = os.path.normpath(template.format(**data)) + if os.path.exists(path): + continue + os.makedirs(path) + + return True + + +def register(session, **kw): + '''Register plugin. Called when used as an plugin.''' + + if not isinstance(session, ftrack_api.session.Session): + return + + CreateSWFolders(session).register() + + +def main(arguments=None): + '''Set up logging and register action.''' + if arguments is None: + arguments = [] + + 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:])) From a38b2968a574ed47aad6ad4cc9b851427f638a18 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Thu, 4 Apr 2019 18:26:51 +0200 Subject: [PATCH 3/3] removed app from publish plugins with template fill --- .../global/publish/collect_assumed_destination.py | 7 +++---- pype/plugins/global/publish/integrate.py | 10 ++++------ .../global/publish/integrate_rendered_frames.py | 10 ++++------ pype/plugins/global/publish/validate_templates.py | 6 ++---- 4 files changed, 13 insertions(+), 20 deletions(-) diff --git a/pype/plugins/global/publish/collect_assumed_destination.py b/pype/plugins/global/publish/collect_assumed_destination.py index 2f567ebbb2..7de358b422 100644 --- a/pype/plugins/global/publish/collect_assumed_destination.py +++ b/pype/plugins/global/publish/collect_assumed_destination.py @@ -1,7 +1,7 @@ import os import pyblish.api -from avalon import io, api, lib +from avalon import io, api class CollectAssumedDestination(pyblish.api.InstancePlugin): @@ -67,7 +67,7 @@ class CollectAssumedDestination(pyblish.api.InstancePlugin): if hierarchy: # hierarchy = os.path.sep.join(hierarchy) hierarchy = os.path.join(*hierarchy) - application = lib.get_application(os.environ["AVALON_APP_NAME"]) + template_data = {"root": api.Session["AVALON_PROJECTS"], "project": {"name": project_name, "code": project['data']['code']}, @@ -77,8 +77,7 @@ class CollectAssumedDestination(pyblish.api.InstancePlugin): "subset": subset_name, "version": version_number, "hierarchy": hierarchy, - "representation": "TEMP", - "app": application["application_dir"]} + "representation": "TEMP"} instance.data["template"] = template instance.data["assumedTemplateData"] = template_data diff --git a/pype/plugins/global/publish/integrate.py b/pype/plugins/global/publish/integrate.py index 5fd8a13670..00096a95ee 100644 --- a/pype/plugins/global/publish/integrate.py +++ b/pype/plugins/global/publish/integrate.py @@ -4,7 +4,7 @@ import shutil import errno import pyblish.api -from avalon import api, io, lib +from avalon import api, io from avalon.vendor import filelink @@ -160,7 +160,7 @@ class IntegrateAsset(pyblish.api.InstancePlugin): if parents and len(parents) > 0: # hierarchy = os.path.sep.join(hierarchy) hierarchy = os.path.join(*parents) - application = lib.get_application(os.environ["AVALON_APP_NAME"]) + template_data = {"root": root, "project": {"name": PROJECT, "code": project['data']['code']}, @@ -169,8 +169,7 @@ class IntegrateAsset(pyblish.api.InstancePlugin): "family": instance.data['family'], "subset": subset["name"], "version": int(version["name"]), - "hierarchy": hierarchy, - "app": application["application_dir"]} + "hierarchy": hierarchy} template_publish = project["config"]["template"]["publish"] anatomy = instance.context.data['anatomy'] @@ -261,8 +260,7 @@ class IntegrateAsset(pyblish.api.InstancePlugin): "subset": subset["name"], "version": version["name"], "hierarchy": hierarchy, - "representation": ext[1:], - "app": application["application_dir"] + "representation": ext[1:] } } diff --git a/pype/plugins/global/publish/integrate_rendered_frames.py b/pype/plugins/global/publish/integrate_rendered_frames.py index 3a0e89c328..8e7e2a59c4 100644 --- a/pype/plugins/global/publish/integrate_rendered_frames.py +++ b/pype/plugins/global/publish/integrate_rendered_frames.py @@ -5,7 +5,7 @@ import clique import errno import pyblish.api -from avalon import api, io, lib +from avalon import api, io log = logging.getLogger(__name__) @@ -148,7 +148,7 @@ class IntegrateFrames(pyblish.api.InstancePlugin): if parents and len(parents) > 0: # hierarchy = os.path.sep.join(hierarchy) hierarchy = os.path.join(*parents) - application = lib.get_application(os.environ["AVALON_APP_NAME"]) + template_data = {"root": root, "project": {"name": PROJECT, "code": project['data']['code']}, @@ -158,8 +158,7 @@ class IntegrateFrames(pyblish.api.InstancePlugin): "family": instance.data['family'], "subset": subset["name"], "version": int(version["name"]), - "hierarchy": hierarchy, - "app": application["application_dir"]} + "hierarchy": hierarchy} # template_publish = project["config"]["template"]["publish"] anatomy = instance.context.data['anatomy'] @@ -273,8 +272,7 @@ class IntegrateFrames(pyblish.api.InstancePlugin): "subset": subset["name"], "version": int(version["name"]), "hierarchy": hierarchy, - "representation": ext[1:], - "app": application["application_dir"] + "representation": ext[1:] } } diff --git a/pype/plugins/global/publish/validate_templates.py b/pype/plugins/global/publish/validate_templates.py index 19d70a197c..8f8eb45686 100644 --- a/pype/plugins/global/publish/validate_templates.py +++ b/pype/plugins/global/publish/validate_templates.py @@ -22,8 +22,7 @@ class ValidateTemplates(pyblish.api.ContextPlugin): "version": 3, "task": "animation", "asset": "sh001", - "hierarchy": "ep101/sq01/sh010", - "app": "nuke"} + "hierarchy": "ep101/sq01/sh010"} anatomy = context.data["anatomy"].format(data) @@ -35,8 +34,7 @@ class ValidateTemplates(pyblish.api.ContextPlugin): "version": 1, "task": "lookdev", "asset": "bob", - "hierarchy": "ep101/sq01/bob", - "app": "nuke"} + "hierarchy": "ep101/sq01/bob"} anatomy = context.data["anatomy"].format(data) self.log.info(anatomy.work.file)