Beispiel #1
0
 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
Beispiel #2
0
 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')
Beispiel #3
0
 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')
Beispiel #4
0
 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'])
Beispiel #5
0
 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
Beispiel #6
0
 def xtest_Key_exists(self):
     key = Key('Customer', 'e6b3265a8031')
     bl = yield key.exists()
     self.assertTrue(bl, 'Expected Customer to exists')
Beispiel #7
0
 def xtest_KeyWithId_get(self):
     key = Key('Customer', 'sysadmin', 'Label', 5)
     lbl = yield key.get()
     self.assertIsInstance(lbl, Entity, 'Expected Label')
Beispiel #8
0
 def xtest_Key_get(self):
     key = Key('Customer', 'e6b3265a8031')
     cust = yield key.get()
     self.assertIsInstance(cust, Entity, 'Expected Customer')
Beispiel #9
0
 def xtest_Key_getDescendants(self):
     key = Key('Customer', 'e6b3265a8031')
     hosts = yield key.getDescendants('Host')
     self.assert_(len(hosts) > 0, 'Expected hosts')
Beispiel #10
0
 def xtest_Key_exists(self):
     key = Key('Customer', 'e6b3265a8031')
     bl = yield key.exists()
     self.assertTrue(bl, 'Expected Customer to exists')
Beispiel #11
0
 def xtest_KeyWithId_get(self):
     key = Key('Customer', 'sysadmin', 'Label', 5)
     lbl = yield key.get()
     self.assertIsInstance(lbl, Entity, 'Expected Label')
Beispiel #12
0
 def xtest_Key_get(self):
     key = Key('Customer', 'e6b3265a8031')
     cust = yield key.get()
     self.assertIsInstance(cust, Entity, 'Expected Customer')
Beispiel #13
0
 def xtest_Key_getDescendants(self):
     key = Key('Customer', 'e6b3265a8031')
     hosts = yield key.getDescendants('Host')
     self.assert_(len(hosts) > 0, 'Expected hosts')
Beispiel #14
0
 def test_urlSafe(self):
     ks1 = 'agxzfm92ZXItc2lnaHRyJgsSCEN1c3RvbWVyIghzeXNhZG1pbgwLEglDb25kaXRpb24Ylk4M'
     key1 = Key(ks1)
     self.assert_(len(key1) == 2)
     self.assertEqual(key1.ks, ks1)
Beispiel #15
0
            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()
Beispiel #16
0
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