def __init__(self, dct=None, fromSerialized=False, key=None): self.key = None if dct is None: dct = {} self.properties = {} if fromSerialized: for ky, vl in dct.get('properties', {}).iteritems(): # queries can result in entity with only a key property if 'indexed' in vl: indexed = vl['indexed'] vl = vl.copy() # take a copy so that we can remove 'indexed' del vl['indexed'] else: indexed = None if vl: firstKey = next(iter(vl)) self.properties[ky] = PropertyValue(vl[firstKey], valueKind=firstKey, indexed=indexed, fromSerialized=fromSerialized) else: self.properties[ky] = PropertyValue(None, valueKind='None', indexed=indexed, fromSerialized=fromSerialized) if 'key' in dct: self.key = Key(dct['key']) else: if 'ks' in dct: ks = dct.pop('ks') if ks: self.key = Key(ks) for ky, vl in dct.iteritems(): if not isinstance(vl, PropertyValue): # it is better to create property values in advance, this way you can force properties to be indexed or not vl = PropertyValue(vl, valueKind=None, fromSerialized=fromSerialized) self.properties[ky] = vl if key: self.key = key
def xtest_load_and_write_entity(self): key = Key('Customer', '01fee69e075f', 'Label', 220004) ent = yield key.get() self.assertIsInstance(ent, Entity, 'Expected Label') dfd = ent.put() dfd.addErrback(self._failEb) wait = yield dfd ent2 = yield key.get() for propName, value in ent.iteritems(): if isinstance(value, list): self.assertLessEqual(value, ent2[propName], 'Entities differ') else: self.assertEqual(value, ent2[propName], 'Entities differ')
def _loadValues(self, valueDcts): for dct in valueDcts: if 'entity' in dct: try: yield Entity(dct['entity'], fromSerialized=True) except: log.err() yield 'Failed to load entity' if 'key' in dct: yield Key(dct['key'])
def _loadEntity(self, entity=None, ks=None, key=None, isNew=None): if isinstance(entity, Entity): ent = entity elif isinstance(entity, dict): entity = simpleDeepCopy(entity) if 'ks' in entity: if ks is not None: raise Exception('Duplicate key inputs') ks = entity.pop('ks') if ks: if key is not None: raise Exception('Duplicate key inputs') key = Key(ks) for propertyName, mapping in self.__class__.ormProperties.iteritems(): if propertyName in entity: entity[propertyName] = PropertyValue(mapping.onUnloadValue(entity[propertyName]), indexed=mapping.indexed) ent = Entity(entity, key=key) else: raise NotImplementedError() return ent
def xtest_Key_exists(self): key = Key('Customer', 'e6b3265a8031') bl = yield key.exists() self.assertTrue(bl, 'Expected Customer to exists')
def xtest_KeyWithId_get(self): key = Key('Customer', 'sysadmin', 'Label', 5) lbl = yield key.get() self.assertIsInstance(lbl, Entity, 'Expected Label')
def xtest_Key_get(self): key = Key('Customer', 'e6b3265a8031') cust = yield key.get() self.assertIsInstance(cust, Entity, 'Expected Customer')
def xtest_Key_getDescendants(self): key = Key('Customer', 'e6b3265a8031') hosts = yield key.getDescendants('Host') self.assert_(len(hosts) > 0, 'Expected hosts')
def test_urlSafe(self): ks1 = 'agxzfm92ZXItc2lnaHRyJgsSCEN1c3RvbWVyIghzeXNhZG1pbgwLEglDb25kaXRpb24Ylk4M' key1 = Key(ks1) self.assert_(len(key1) == 2) self.assertEqual(key1.ks, ks1)
self._scopes = self._DEFAULT_SCOPES conn.registerScopes(self._scopes) kwargs['responseCls'] = GcdResponseHandler super(Datastore, self).__init__(conn, *args, **kwargs) self.datasets = DatasetsWrapper(self, conn, *args, **kwargs) self.batchOperations = BatchOperations(self, conn, looptimes, projectId, *args, **kwargs) if __name__ == '__main__': from twisted.internet import reactor from txGoogle.wrappers.gcd import QueryFilter from txGoogle.wrappers.gcd import setGlobalGcdServiceAndProjectId from txGoogle.asyncUtils import printCb conn = SharedOauthConnection('785509043543.apps.googleusercontent.com', 'Mhx2IjJLk78U9VyErHHIVbnw', 'apiFiles/GcdCredentials.json') gcd = DatastoreWrapper(conn) conn.connect() # getEntities(kind='Host', keysOnly=True, parentCore_eq=coreUuid) setGlobalGcdServiceAndProjectId(gcd, 'over-sight') #dfd = gcd.datasets.query('over-sight', kinds=['Host'], queryFilter=QueryFilter().equal('parentCore', 'e6b3265a8031-f5885503208d')) dfd = gcd.datasets.query('over-sight', queryFilter=QueryFilter().equal( '__key__', Key('Customer', 'e6b3265a8031', 'Host', 'e6b3265a8031-f5885503208d'))) dfd.addCallback(printCb) dfd.addErrback(printCb) reactor.run()
class Entity(GcdObjectWithApiBackReference): def __init__(self, dct=None, fromSerialized=False, key=None): self.key = None if dct is None: dct = {} self.properties = {} if fromSerialized: for ky, vl in dct.get('properties', {}).iteritems(): # queries can result in entity with only a key property if 'indexed' in vl: indexed = vl['indexed'] vl = vl.copy() # take a copy so that we can remove 'indexed' del vl['indexed'] else: indexed = None if vl: firstKey = next(iter(vl)) self.properties[ky] = PropertyValue(vl[firstKey], valueKind=firstKey, indexed=indexed, fromSerialized=fromSerialized) else: self.properties[ky] = PropertyValue(None, valueKind='None', indexed=indexed, fromSerialized=fromSerialized) if 'key' in dct: self.key = Key(dct['key']) else: if 'ks' in dct: ks = dct.pop('ks') if ks: self.key = Key(ks) for ky, vl in dct.iteritems(): if not isinstance(vl, PropertyValue): # it is better to create property values in advance, this way you can force properties to be indexed or not vl = PropertyValue(vl, valueKind=None, fromSerialized=fromSerialized) self.properties[ky] = vl if key: self.key = key @property def kind(self): if self.key.path: return self.key.path[-1].kind @property def name(self): if self.key.path: return self.key.path[-1].name @property def id(self): if self.key.path: return self.key.path[-1].id def toValue(self): dct = {ky: vl.toValue() for ky, vl in self.properties.iteritems()} if self.key and len(self.key) > 0: dct['ks'] = self.ks return dct def toDict(self): raise Exception('Deprecated') def __getitem__(self, key): return self.getProperty(key) def iteritems(self): for ky, vl in self.properties.iteritems(): yield ky, vl.toValue() def __setitem__(self, key, value): return self.setProperty(key, value) def setProperty(self, key, value, valueKind=None, indexed=None): self.properties[key] = PropertyValue(value, valueKind=valueKind, indexed=indexed) def getProperty(self, key, default=None): if key in self.properties: return self.properties[key].toValue() else: return default get = getProperty def __contains__(self, key): return key in self.properties def serialize(self, outputKey=True): properties = {} output = { 'properties': properties } if outputKey: if self.key: output['key'] = self.key.serialize() else: print 'Im keyless' for propName, propValue in self.properties.iteritems(): valDct = propValue.serialize() if valDct: properties[propName] = valDct return output def getKeyLen(self): if self.key: return len(self.key) return 0 def hasKey(self): if not self.key: return False return len(self.key) > 0 def __str__(self, *args, **kwargs): return str(self.toValue()) def __repr__(self, *args, **kwargs): return str(self.toValue()) @property def ks(self): if self.key: return self.key.ks def put(self): if self.getKeyLen() == 0: raise Exception('Cannot save entity without key') dfd = self._globalGcdWrapper.datasets.commit(self.key.datasetId or self._defaultProjectId, upsert=[self]) dfd.addErrback(logError) return dfd