diff --git a/pype/ftrack/actions/action_create_project_structure.py b/pype/ftrack/actions/action_create_project_structure.py index 6124ebe843..163ac4836e 100644 --- a/pype/ftrack/actions/action_create_project_structure.py +++ b/pype/ftrack/actions/action_create_project_structure.py @@ -1,36 +1,26 @@ import os -import sys import re -import argparse -import logging -import ftrack_api from pype.ftrack import BaseAction -from pypeapp import config +from pypeapp import config, Anatomy class CreateProjectFolders(BaseAction): - '''Edit meta data action.''' - #: Action identifier. - identifier = 'create.project.structure' - #: Action label. - label = 'Create Project Structure' - #: Action description. - description = 'Creates folder structure' - #: roles that are allowed to register this action - role_list = ['Pypeclub', 'Administrator', 'Project Manager'] - icon = '{}/ftrack/action_icons/CreateProjectFolders.svg'.format( - os.environ.get('PYPE_STATICS_SERVER', '') + identifier = "create.project.structure" + label = "Create Project Structure" + description = "Creates folder structure" + role_list = ["Pypeclub", "Administrator", "Project Manager"] + icon = "{}/ftrack/action_icons/CreateProjectFolders.svg".format( + os.environ.get("PYPE_STATICS_SERVER", "") ) - pattern_array = re.compile('\[.*\]') - pattern_ftrack = '.*\[[.]*ftrack[.]*' - pattern_ent_ftrack = 'ftrack\.[^.,\],\s,]*' - project_root_key = '__project_root__' + pattern_array = re.compile(r"\[.*\]") + pattern_ftrack = re.compile(r".*\[[.]*ftrack[.]*") + pattern_ent_ftrack = re.compile(r"ftrack\.[^.,\],\s,]*") + project_root_key = "__project_root__" def discover(self, session, entities, event): - ''' Validation ''' if len(entities) != 1: return False @@ -41,22 +31,19 @@ class CreateProjectFolders(BaseAction): def launch(self, session, entities, event): entity = entities[0] - if entity.entity_type.lower() == 'project': - project = entity - else: - project = entity['project'] - - presets = config.get_presets()['tools']['project_folder_structure'] + project = self.get_project_from_entity(entity) + presets = config.get_presets()["tools"]["project_folder_structure"] try: # Get paths based on presets basic_paths = self.get_path_items(presets) self.create_folders(basic_paths, entity) self.create_ftrack_entities(basic_paths, project) - except Exception as e: + + except Exception as exc: session.rollback() return { - 'success': False, - 'message': str(e) + "success": False, + "message": str(exc) } return True @@ -113,15 +100,15 @@ class CreateProjectFolders(BaseAction): def trigger_creation(self, separation, parent): for item, subvalues in separation.items(): matches = re.findall(self.pattern_array, item) - ent_type = 'Folder' + ent_type = "Folder" if len(matches) == 0: name = item else: match = matches[0] - name = item.replace(match, '') + name = item.replace(match, "") ent_type_match = re.findall(self.pattern_ent_ftrack, match) if len(ent_type_match) > 0: - ent_type_split = ent_type_match[0].split('.') + ent_type_split = ent_type_match[0].split(".") if len(ent_type_split) == 2: ent_type = ent_type_split[1] new_parent = self.create_ftrack_entity(name, ent_type, parent) @@ -130,22 +117,22 @@ class CreateProjectFolders(BaseAction): self.trigger_creation(subvalue, new_parent) def create_ftrack_entity(self, name, ent_type, parent): - for children in parent['children']: - if children['name'] == name: + for children in parent["children"]: + if children["name"] == name: return children data = { - 'name': name, - 'parent_id': parent['id'] + "name": name, + "parent_id": parent["id"] } - if parent.entity_type.lower() == 'project': - data['project_id'] = parent['id'] + if parent.entity_type.lower() == "project": + data["project_id"] = parent["id"] else: - data['project_id'] = parent['project']['id'] + data["project_id"] = parent["project"]["id"] existing_entity = self.session.query(( "TypedContext where name is \"{}\" and " "parent_id is \"{}\" and project_id is \"{}\"" - ).format(name, data['parent_id'], data['project_id'])).first() + ).format(name, data["parent_id"], data["project_id"])).first() if existing_entity: return existing_entity @@ -161,12 +148,11 @@ class CreateProjectFolders(BaseAction): else: paths = self.get_path_items(value) for path in paths: - if isinstance(path, str): - output.append([key, path]) - else: - p = [key] - p.extend(path) - output.append(p) + if not isinstance(path, (list, tuple)): + path = [path] + + output.append([key, *path]) + return output def compute_paths(self, basic_paths_items, project_root): @@ -176,7 +162,7 @@ class CreateProjectFolders(BaseAction): for path_item in path_items: matches = re.findall(self.pattern_array, path_item) if len(matches) > 0: - path_item = path_item.replace(matches[0], '') + path_item = path_item.replace(matches[0], "") if path_item == self.project_root_key: path_item = project_root clean_items.append(path_item) @@ -193,55 +179,12 @@ class CreateProjectFolders(BaseAction): project_root = os.path.sep.join(project_root_items) full_paths = self.compute_paths(basic_paths, project_root) - #Create folders + # Create folders for path in full_paths: if os.path.exists(path): continue os.makedirs(path.format(project_root=project_root)) - - def register(session, plugins_presets={}): - '''Register plugin. Called when used as an plugin.''' - CreateProjectFolders(session, plugins_presets).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:]))