From 0cf395c3bc2b2aa645c6c7c7b97d87d2227c10bf Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Tue, 4 Dec 2018 11:29:10 +0100 Subject: [PATCH 1/3] Created attributes are set to group and security roles are set for API only --- .../actions/action_createCustomAttributes.py | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/pype/ftrack/actions/action_createCustomAttributes.py b/pype/ftrack/actions/action_createCustomAttributes.py index 5f9dbd7381..13aad6e659 100644 --- a/pype/ftrack/actions/action_createCustomAttributes.py +++ b/pype/ftrack/actions/action_createCustomAttributes.py @@ -89,11 +89,25 @@ class AvalonIdAttribute(BaseAction): # Set session back to begin("session.query" raises error on commit) session.rollback() # Set security roles for attribute - custAttrSecuRole = session.query('SecurityRole').all() + role_api = session.query('SecurityRole where name is "API"').all() # Set Text type of Attribute custom_attribute_type = session.query( 'CustomAttributeType where name is "text"' ).one() + # Get/Set 'avalon' group + groups = session.query('CustomAttributeGroup where name is "avalon"').all() + if len(groups) > 1: + msg = "There are more Custom attribute groups with name 'avalon'" + self.log.warning(msg) + return { 'success': False, 'message':msg } + + elif len(groups) < 1: + group = session.create('CustomAttributeGroup', { + 'name': 'avalon', + }) + session.commit() + else: + group = groups[0] for entity_type in base: # Create a custom attribute configuration. @@ -103,8 +117,9 @@ class AvalonIdAttribute(BaseAction): 'label': custAttrLabel, 'key': custAttrName, 'default': '', - 'write_security_roles': custAttrSecuRole, - 'read_security_roles': custAttrSecuRole, + 'write_security_roles': role_api, + 'read_security_roles': role_api, + 'group':group, 'config': json.dumps({'markdown': False}) }) @@ -117,8 +132,9 @@ class AvalonIdAttribute(BaseAction): 'label': custAttrLabel, 'key': custAttrName, 'default': '', - 'write_security_roles': custAttrSecuRole, - 'read_security_roles': custAttrSecuRole, + 'write_security_roles': role_api, + 'read_security_roles': role_api, + 'group':group, 'config': json.dumps({'markdown': False}) }) From 06d473425d9afcdecf0ad5d4679a9af15b44725a Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Tue, 4 Dec 2018 13:39:42 +0100 Subject: [PATCH 2/3] Added action validation - only for admins, security role - for admins, Library removed from excepted entity type --- .../actions/action_createCustomAttributes.py | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/pype/ftrack/actions/action_createCustomAttributes.py b/pype/ftrack/actions/action_createCustomAttributes.py index 13aad6e659..ad1e1af5b9 100644 --- a/pype/ftrack/actions/action_createCustomAttributes.py +++ b/pype/ftrack/actions/action_createCustomAttributes.py @@ -24,14 +24,18 @@ class AvalonIdAttribute(BaseAction): def discover(self, session, entities, event): - ''' Validation ''' + ''' + Validation + - action is only for Administrators + ''' + success = False + userId = event['source']['user']['id'] + user = session.query('User where id is ' + userId).one() + for role in user['user_security_roles']: + if role['security_role']['name'] == 'Administrator': + success = True - # userId = event['source']['user']['id'] - # user = session.query('User where id is ' + userId).one() - # if user['user_security_roles'][0]['security_role']['name'] != 'Administrator': - # return False - - return True + return success def launch(self, session, entities, event): @@ -55,7 +59,7 @@ class AvalonIdAttribute(BaseAction): # Types that don't need object_type_id base = {'show'} # Don't create custom attribute on these entity types: - exceptions = ['task','milestone','library'] + exceptions = ['task', 'milestone'] exceptions.extend(base) # Get all possible object types all_obj_types = session.query('ObjectType').all() @@ -89,7 +93,10 @@ class AvalonIdAttribute(BaseAction): # Set session back to begin("session.query" raises error on commit) session.rollback() # Set security roles for attribute - role_api = session.query('SecurityRole where name is "API"').all() + role_api = session.query('SecurityRole where name is "API"').one() + role_admin = session.query('SecurityRole where name is "Administrator"').one() + roles = [role_api,role_admin] + # Set Text type of Attribute custom_attribute_type = session.query( 'CustomAttributeType where name is "text"' @@ -117,8 +124,8 @@ class AvalonIdAttribute(BaseAction): 'label': custAttrLabel, 'key': custAttrName, 'default': '', - 'write_security_roles': role_api, - 'read_security_roles': role_api, + 'write_security_roles': roles, + 'read_security_roles': roles, 'group':group, 'config': json.dumps({'markdown': False}) }) @@ -132,8 +139,8 @@ class AvalonIdAttribute(BaseAction): 'label': custAttrLabel, 'key': custAttrName, 'default': '', - 'write_security_roles': role_api, - 'read_security_roles': role_api, + 'write_security_roles': roles, + 'read_security_roles': roles, 'group':group, 'config': json.dumps({'markdown': False}) }) From 884ac36f25cf4c1e669da1dc98ccdce1aa9b9060 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Tue, 4 Dec 2018 16:35:04 +0100 Subject: [PATCH 3/3] Creates Checkbox for auto-sync event in Project. Action update roles and group on existing attributes --- .../actions/action_createCustomAttributes.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/pype/ftrack/actions/action_createCustomAttributes.py b/pype/ftrack/actions/action_createCustomAttributes.py index ad1e1af5b9..d45a92a01d 100644 --- a/pype/ftrack/actions/action_createCustomAttributes.py +++ b/pype/ftrack/actions/action_createCustomAttributes.py @@ -53,11 +53,19 @@ class AvalonIdAttribute(BaseAction): }) session.commit() try: + # Checkbox for event sync + cbxSyncName = 'avalon_auto_sync' + cbxSyncLabel = 'Avalon auto-sync' + cbxSyncExist = False + # Attribute Name and Label custAttrName = 'avalon_mongo_id' custAttrLabel = 'Avalon/Mongo Id' + + attrs_update = set() # Types that don't need object_type_id base = {'show'} + # Don't create custom attribute on these entity types: exceptions = ['task', 'milestone'] exceptions.extend(base) @@ -77,6 +85,7 @@ class AvalonIdAttribute(BaseAction): # Get IDs of filtered object types all_obj_types_id = set() + for obj in all_obj_types: all_obj_types_id.add(obj['id']) @@ -84,11 +93,16 @@ class AvalonIdAttribute(BaseAction): current_cust_attr = session.query('CustomAttributeConfiguration').all() # Filter already existing AvalonMongoID attr. for attr in current_cust_attr: + if attr['key'] == cbxSyncName: + cbxSyncExist = True + cbxAttribute = attr if attr['key'] == custAttrName: if attr['entity_type'] in base: base.remove(attr['entity_type']) + attrs_update.add(attr) if attr['object_type_id'] in all_obj_types_id: all_obj_types_id.remove(attr['object_type_id']) + attrs_update.add(attr) # Set session back to begin("session.query" raises error on commit) session.rollback() @@ -116,6 +130,24 @@ class AvalonIdAttribute(BaseAction): else: group = groups[0] + # Checkbox for auto-sync event / Create or Update(roles + group) + if cbxSyncExist is False: + cbxType = session.query('CustomAttributeType where name is "boolean"').first() + session.create('CustomAttributeConfiguration', { + 'entity_type': 'show', + 'type': cbxType, + 'label': cbxSyncLabel, + 'key': cbxSyncName, + 'default': False, + 'write_security_roles': roles, + 'read_security_roles': roles, + 'group':group, + }) + else: + cbxAttribute['write_security_roles'] = roles + cbxAttribute['read_security_roles'] = roles + cbxAttribute['group'] = group + for entity_type in base: # Create a custom attribute configuration. session.create('CustomAttributeConfiguration', { @@ -145,11 +177,18 @@ class AvalonIdAttribute(BaseAction): 'config': json.dumps({'markdown': False}) }) + for attr in attrs_update: + attr['write_security_roles'] = roles + attr['read_security_roles'] = roles + attr['group'] = group + job['status'] = 'done' session.commit() except Exception as e: + session.rollback() job['status'] = 'failed' + session.commit() self.log.error("Creating custom attributes failed ({})".format(e)) return True