def getConnectionObj( baseObj, linkedObj, attribute ): """ return the connection obj of two connected entities :param baseObj: entity that has the given attribute :param linkedObj: entity that is linked in the given attribute :param attribute: attribute name of baseObj-parameter """ connEntityName = entityNaming.getConnectionEntityName( baseObj.getType(), attribute ) if connEntityName: ( baseAttrName, linkedAttrName ) = entityNaming.getConnectionEntityAttrName( baseObj.getType(), linkedObj.getType(), connEntityName ) filters = "%s=%s and %s=%s" % ( baseAttrName, "%s", linkedAttrName, "%s" ) filterValues = [ baseObj.getPgObj(), linkedObj.getPgObj() ] objs = getObjects( connEntityName, filters, filterValues ) if len( objs ) == 1: return objs[0] elif len( objs ) > 1: return objs return None
def testConnectionEntityName( self ): testPairs = [ ( "Asset", "assets", "AssetAssetConnection" ), ( "Asset", "sg_linked_assets", "Asset_sg_linked_assets_Connection" ), ( "Asset", "sg_linked_shots", "Asset_sg_linked_shots_Connection" ), ( "Asset", "shoot_days", "AssetShootDayConnection" ) ] for ( entityType, attrName, connectionEntityName ) in testPairs: connEntityNameTesting = entityNaming.getConnectionEntityName( entityType, attrName ) self.assertEqual( connEntityNameTesting, connectionEntityName )
def testConnectionEntityName(self): testPairs = [ ("Asset", "assets", "AssetAssetConnection"), ("Asset", "sg_linked_assets", "Asset_sg_linked_assets_Connection"), ("Asset", "sg_linked_shots", "Asset_sg_linked_shots_Connection"), ("Asset", "shoot_days", "AssetShootDayConnection") ] for (entityType, attrName, connectionEntityName) in testPairs: connEntityNameTesting = entityNaming.getConnectionEntityName( entityType, attrName) self.assertEqual(connEntityNameTesting, connectionEntityName)
def changeEntity( myObj, changes ): """change entity in local database and add corresponding change-events for shotgun-sync""" # myObj.reload() src = connectors.DatabaseModificator() src.changeInDB( myObj, changes = changes ) for ( key, value ) in changes.iteritems(): if type( value ) == datetime.datetime: changes[key] = value.strftime( "%Y-%m-%d %H:%M:%S" ) if type( value ) == datetime.date: changes[key] = value.strftime( "%Y-%m-%d" ) elif type( value ) == datetime.timedelta: changes[key] = float( value.days ) * 24 + float( value.seconds ) / 3600 elif type( value ) == connectors.PostgresEntityType: changes[key] = value.getShortDict() elif isinstance( value, base_entity.ShotgunBaseEntity ): changes[key] = value.getShortDict() elif type( value ) == type( [] ): changes[key] = [] for entry in value: if isinstance( entry, base_entity.ShotgunBaseEntity ) or type( entry ) == connectors.PostgresEntityType: changes[key].append( entry.getShortDict() ) else: changes[key].append( entry ) attributeName = key fieldValues = value entityType = myObj.getType() connEntityName = entityNaming.getConnectionEntityName( entityType, attributeName ) if connEntityName != None: reverseAttribute = entityNaming.getReverseAttributeName( entityType, attributeName ) linkedEntityType = myObj.shotgun_fields[attributeName]["properties"]["valid_types"]["value"][0] baseEntityType = entityType ( baseAttrName, linkedAttrName ) = entityNaming.getConnectionEntityAttrName( baseEntityType, linkedEntityType, connEntityName ) basePgObj = myObj.getPgObj() # get connections filters = "%s=%s" % ( baseAttrName, "%s" ) filterValues = [ basePgObj ] connections = factories.getObjects( connEntityName, filters, filterValues ) # create new connection entities for linkedDict in changes[key]: linkedPostgresObj = getPgObj( linkedDict ) fieldNames = [ baseAttrName, linkedAttrName ] fieldValues = [ basePgObj, linkedPostgresObj ] # check if existing first connectionExists = False for i in range( len( connections ) ): connection = connections[i] if connection.getRawField( linkedAttrName ) == linkedPostgresObj: connections.remove( connection ) connectionExists = True break if not connectionExists: debug.debug( dict( zip( fieldNames, fieldValues ) ), prefix = "OOOOOOOOO" ) src._addToDatabase( connEntityName, fieldValues, fieldNames ) # setting reverse attribute as well linkedObj = factories.getObject( linkedDict["type"], local_id = linkedDict["__local_id"], remote_id = linkedDict["id"] ) retValues = linkedObj.getRawField( reverseAttribute ) if retValues == None: retValues = [] if basePgObj not in retValues: retValues.append( basePgObj ) src.changeInDB( linkedObj, reverseAttribute, retValues ) # delete unused connection entities for connection in connections: linkedObj = connection.getField( linkedAttrName ) retValues = linkedObj.getRawField( reverseAttribute ) retValues.remove( basePgObj ) src.changeInDB( linkedObj, reverseAttribute, retValues ) src.delete( connection ) _createChangeEvent( src, "change", corr_entity = myObj.getPgObj(), changed_values = json.dumps( changes ) ) return myObj