From 17dc705107f9325f7b24399893777a13e9be1008 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Fri, 11 Jan 2019 14:39:28 +0100 Subject: [PATCH] get_data fill visualParent to all assets instead of silo asset --- pype/ftrack/events/event_sync_to_avalon.py | 113 ++++++++++----------- pype/ftrack/ftrack_utils.py | 39 ++++--- 2 files changed, 83 insertions(+), 69 deletions(-) diff --git a/pype/ftrack/events/event_sync_to_avalon.py b/pype/ftrack/events/event_sync_to_avalon.py index ebf901ff72..f9e76b4853 100644 --- a/pype/ftrack/events/event_sync_to_avalon.py +++ b/pype/ftrack/events/event_sync_to_avalon.py @@ -1,11 +1,9 @@ import os import sys -import re import ftrack_api from ftrack_event_handler import BaseEvent from pype import lib from avalon import io, inventory -from avalon.vendor import toml from bson.objectid import ObjectId from pype.ftrack import ftrack_utils @@ -46,7 +44,10 @@ class Sync_to_Avalon(BaseEvent): # check if project have Custom Attribute 'avalon_mongo_id' if self.ca_mongoid not in self.proj['custom_attributes']: - message = "Custom attribute '{}' for 'Project' is not created or don't have set permissions for API".format(self.ca_mongoid) + message = ( + "Custom attribute '{}' for 'Project' is not created" + " or don't have set permissions for API" + ).format(self.ca_mongoid) self.log.warning(message) self.show_message(event, message, False) return @@ -85,7 +86,11 @@ class Sync_to_Avalon(BaseEvent): 'custom_attributes' not in entity or self.ca_mongoid not in entity['custom_attributes'] ): - message = "Custom attribute '{}' for '{}' is not created or don't have set permissions for API".format(self.ca_mongoid, entity.entity_type) + message = ( + "Custom attribute '{}' for '{}' is not created" + " or don't have set permissions for API" + ).format(self.ca_mongoid, entity.entity_type) + self.log.warning(message) self.show_message(event, message, False) return @@ -119,7 +124,10 @@ class Sync_to_Avalon(BaseEvent): except Exception as e: message = str(e) - ftrack_message = "SyncToAvalon event ended with unexpected error please check log file for more information." + ftrack_message = ( + 'SyncToAvalon event ended with unexpected error' + ' please check log file for more information.' + ) items = [{ 'label': 'Error', 'type': 'textarea', @@ -135,7 +143,11 @@ class Sync_to_Avalon(BaseEvent): def importToAvalon(self, session, event, entity): if self.ca_mongoid not in entity['custom_attributes']: - raise ValueError("Custom attribute '{}' for '{}' is not created or don't have set permissions for API".format(self.ca_mongoid, entity['name'])) + msg = ( + "Custom attribute '{}' for '{}' is not created" + " or don't have set permissions for API" + ).format(self.ca_mongoid, entity['name']) + raise ValueError(msg) ftrack_utils.avalon_check_name(entity) @@ -155,13 +167,19 @@ class Sync_to_Avalon(BaseEvent): entity['name'] = self.avalon_project['name'] session.commit() - msg = 'You can\'t change name {} to {}, avalon wouldn\'t work properly!\nName was changed back!'.format(self.avalon_project['name'], name) + msg = ( + 'You can\'t change name {} to {}' + ', avalon wouldn\'t work properly!' + '\nName was changed back!' + ).format(self.avalon_project['name'], name) self.errors.append(msg) return self.projectId = self.avalon_project['_id'] - data = ftrack_utils.get_data(self, entity, session, self.custom_attributes) + data = ftrack_utils.get_data( + self, entity, session, self.custom_attributes + ) io.update_many( {"_id": ObjectId(self.projectId)}, @@ -178,14 +196,13 @@ class Sync_to_Avalon(BaseEvent): if self.avalon_project is None: self.importToAvalon(session, event, self.proj) - data = ftrack_utils.get_data(self, entity, session, self.custom_attributes) + data = ftrack_utils.get_data( + self, entity, session, self.custom_attributes + ) # only check name if entity is silo if len(data['parents']) == 0: silo = None - # if self.checkSilo(entity, event, session) is False: - # raise ExpectedError - # return else: silo = data['parents'][0] @@ -204,27 +221,44 @@ class Sync_to_Avalon(BaseEvent): if avalon_asset is None: avalon_asset = io.find_one({'type': 'asset', 'name': name}) if avalon_asset is None: - mongo_id = inventory.create_asset(name, silo, data, ObjectId(self.projectId)) + mongo_id = inventory.create_asset( + name, silo, data, ObjectId(self.projectId) + ) # Raise error if it seems to be different ent. with same name elif ( avalon_asset['data']['parents'] != data['parents'] or avalon_asset['silo'] != silo ): - msg = 'In Avalon DB already exists entity with name "{0}"'.format(name) + msg = ( + 'In Avalon DB already exists entity with name "{0}"' + ).format(name) self.errors.append(msg) return else: if avalon_asset['name'] != entity['name']: - if self.checkChilds(entity) is False: - msg = 'You can\'t change name {} to {}, avalon wouldn\'t work properly!\n\nName was changed back!\n\nCreate new entity if you want to change name.'.format(avalon_asset['name'], entity['name']) + if silo is None or self.checkChilds(entity) is False: + msg = ( + 'You can\'t change name {} to {}' + ', avalon wouldn\'t work properly!' + '\n\nName was changed back!' + '\n\nCreate new entity if you want to change name.' + ).format(avalon_asset['name'], entity['name']) entity['name'] = avalon_asset['name'] session.commit() self.errors.append(msg) - if avalon_asset['silo'] != silo or avalon_asset['data']['parents'] != data['parents']: + if ( + avalon_asset['silo'] != silo or + avalon_asset['data']['parents'] != data['parents'] + ): old_path = "/".join(avalon_asset['data']['parents']) new_path = "/".join(data['parents']) - msg = 'You can\'t move with entities.\nEntity "{}" was moved from "{}" to "{}"\n\nAvalon won\'t work properly, please move them back!'.format(avalon_asset['name'], old_path, new_path) + msg = ( + 'You can\'t move with entities.' + '\nEntity "{}" was moved from "{}" to "{}"' + '\n\nAvalon won\'t work properly, please move them back!' + ).format(avalon_asset['name'], old_path, new_path) + self.errors.append(msg) if len(self.errors) > 0: @@ -262,44 +296,6 @@ class Sync_to_Avalon(BaseEvent): # If everything is allright return True - def checkSilo(self, entity, event, session): - changes = event['data']['entities'][0]['changes'] - if 'name' not in changes: - return True - new_name = changes['name']['new'] - old_name = changes['name']['old'] - - if 'children' not in entity or len(entity['children']) < 1: - return True - - if self.checkChilds(entity) is True: - self.updateSilo(old_name, new_name) - return True - - new_found = 0 - old_found = 0 - for asset in io.find({'silo': new_name}): - new_found += 1 - for asset in io.find({'silo': old_name}): - old_found += 1 - - if new_found > 0 or old_found == 0: - return True - - # If any condition is possible, show error to user and change name back - msg = 'You can\'t change name {} to {}, avalon wouldn\'t work properly!\n\nName was changed back!\n\nCreate new entity if you want to change name.'.format(old_name, new_name) - self.errors.append(msg) - entity['name'] = old_name - session.commit() - - return False - - def updateSilo(self, old, new): - io.update_many( - {'silo': old}, - {'$set': {'silo': new}} - ) - def setAvalonAttributes(self): self.custom_attributes = [] query = 'CustomAttributeGroup where name is "avalon"' @@ -333,7 +329,10 @@ class Sync_to_Avalon(BaseEvent): continue _entities.append( ( - session.get(self._get_entity_type(entity), entity.get('entityId')) + session.get( + self._get_entity_type(entity), + entity.get('entityId') + ) ) ) diff --git a/pype/ftrack/ftrack_utils.py b/pype/ftrack/ftrack_utils.py index 2177b3f8c3..d5cd9a4482 100644 --- a/pype/ftrack/ftrack_utils.py +++ b/pype/ftrack/ftrack_utils.py @@ -25,11 +25,16 @@ def get_config_data(): data = json.load(data_file) except Exception as e: - msg = 'Loading "Ftrack Config file" Failed. Please check log for more information. Times are set to default.' + msg = ( + 'Loading "Ftrack Config file" Failed.' + ' Please check log for more information.' + ' Times are set to default.' + ) log.warning("{} - {}".format(msg, str(e))) return data + def get_data(parent, entity, session, custom_attributes): entity_type = entity.entity_type @@ -42,14 +47,21 @@ def get_data(parent, entity, session, custom_attributes): if cust_attr['entity_type'].lower() in ['asset']: data[key] = entity['custom_attributes'][key] - elif cust_attr['entity_type'].lower() in ['show'] and entity_type.lower() == 'project': + elif ( + cust_attr['entity_type'].lower() in ['show'] and + entity_type.lower() == 'project' + ): data[key] = entity['custom_attributes'][key] - elif cust_attr['entity_type'].lower() in ['task'] and entity_type.lower() != 'project': + elif ( + cust_attr['entity_type'].lower() in ['task'] and + entity_type.lower() != 'project' + ): # Put space between capitals (e.g. 'AssetBuild' -> 'Asset Build') entity_type_full = re.sub(r"(\w)([A-Z])", r"\1 \2", entity_type) # Get object id of entity type - ent_obj_type_id = session.query('ObjectType where name is "{}"'.format(entity_type_full)).one()['id'] + query = 'ObjectType where name is "{}"'.format(entity_type_full) + ent_obj_type_id = session.query(query).one()['id'] if cust_attr['object_type_id'] == ent_obj_type_id: data[key] = entity['custom_attributes'][key] @@ -68,11 +80,13 @@ def get_data(parent, entity, session, custom_attributes): parents = [] folderStruct = [] for i in range(1, len(entity['link'])-1): - parEnt = session.get(entity['link'][i]['type'], entity['link'][i]['id']) + parEnt = session.get( + entity['link'][i]['type'], + entity['link'][i]['id'] + ) parName = parEnt['name'] folderStruct.append(parName) - if i > 1: - parents.append(parEnt) + parents.append(parEnt) parentId = None @@ -91,7 +105,8 @@ def get_data(parent, entity, session, custom_attributes): return data -def avalon_check_name(entity, inSchema = None): + +def avalon_check_name(entity, inSchema=None): ValidationError = jsonschema.ValidationError alright = True name = entity['name'] @@ -123,8 +138,8 @@ def avalon_check_name(entity, inSchema = None): alright = False if alright is False: - raise ValueError("{} includes unsupported symbols like 'dash' or 'space'".format(name)) - + msg = "{} includes unsupported symbols like 'dash' or 'space'" + raise ValueError(msg.format(name)) def get_apps(entity): @@ -149,6 +164,7 @@ def get_apps(entity): log.warning('Error with application {0} - {1}'.format(app, e)) return apps + def get_config(entity): config = {} config['schema'] = lib.get_avalon_project_config_schema() @@ -158,6 +174,7 @@ def get_config(entity): return config + def checkRegex(): # _handle_result -> would be solution? # """ TODO Check if name of entities match REGEX""" @@ -186,7 +203,6 @@ def checkRegex(): def get_context(entity): - parents = [] item = entity while True: @@ -209,7 +225,6 @@ def get_context(entity): ctx[entity['object_type']['name']] = entityDic - # add all parents to the context for parent in parents: tempdic = {}