Ticket #307: facorreia-ticket-307-with-test.patch

File facorreia-ticket-307-with-test.patch, 4.7 KB (added by facorreia, 6 months ago)

alternate patch with updated test

  • pyamf/adapters/_google_appengine_ext_db.py

     
    2626        remove = True 
    2727        self.context.class_aliases[obj.__class__] = pyamf.ClassAlias(obj.__class__, None) 
    2828 
    29     self.writeObject(obj, *args, **kwargs) 
     29    writeObjectAMF(self, obj, args, kwargs, remove) 
    3030 
    31     if remove: 
    32         self.context.class_aliases[obj.__class__] = None 
    33  
    3431def writeObjectAMF3(self, obj, *args, **kwargs): 
    3532    try: 
    3633        self.context.getClassDefinitionReference(obj) 
     
    4441            alias = pyamf.ClassAlias(obj.__class__, None) 
    4542            self.context.class_aliases[obj.__class__] = alias 
    4643 
     44    writeObjectAMF(self, obj, args, kwargs, remove) 
     45 
     46def writeObjectAMF(self, obj, args, kwargs, remove): 
     47    """ 
     48    Writes an object that has already been prepared by writeObjectAMF0 or writeObjectAMF3. 
     49    """ 
     50    try: 
     51        obj._key = str(obj.key()) 
     52    except: 
     53        obj._key = None 
    4754    self.writeObject(obj, *args, **kwargs) 
    48  
     55    del obj._key 
    4956    if remove: 
    5057        self.context.class_aliases[obj.__class__] = None 
    5158 
     
    5360    """ 
    5461    Returns a list of properties on an C{db.Model} instance. 
    5562    """ 
    56     return list(obj.__class__._properties) 
     63    return list(obj.__class__._properties) + ['_key'] 
    5764 
    5865def get_attrs_for_expando(obj): 
    5966    """ 
    6067    Returns a list of dynamic properties on a C{db.Expando} instance. 
    6168    """ 
    62     return obj.dynamic_properties() 
     69    return obj.dynamic_properties() + ['_key'] 
    6370 
    6471pyamf.register_class(db.Model, attr_func=get_attrs_for_model, metadata=['dynamic']) 
    6572pyamf.register_class(db.Expando, attr_func=get_attrs_for_expando, metadata=['dynamic']) 
  • pyamf/tests/adapters/test_google.py

     
    3232 
    3333        encoder.writeElement(jessica) 
    3434        self.assertEquals(encoder.stream.getvalue(), 
    35             '\x03\x00\x10weight_in_pounds\x00@\x14\x00\x00\x00\x00\x00\x00' 
    36             '\x00\x04type\x02\x00\x03cat\x00\x04name\x02\x00\x07Jessica\x00' 
    37             '\tbirthdate\x0bB^\xc4\xae\xaa\x00\x00\x00\x00\x00\x00\x12' 
    38             'spayed_or_neutered\x01\x00\x00\x00\t') 
     35            '\x03\x00\x04name\x02\x00\x07Jessica\x00\x04_key\x05\x00' 
     36            '\tbirthdate\x0bB^\xc4\xae\xaa\x00\x00\x00\x00\x00\x00\x10' 
     37            'weight_in_pounds\x00@\x14\x00\x00\x00\x00\x00\x00\x00\x04' 
     38            'type\x02\x00\x03cat\x00\x12spayed_or_neutered\x01\x00\x00\x00\t') 
    3939 
    4040        encoder = pyamf.get_encoder(pyamf.AMF3) 
    4141        encoder.writeElement(jessica) 
    4242        self.assertEquals(encoder.stream.getvalue(), 
    43             '\n\x0b\x01!weight_in_pounds\x04\x05\ttype\x06\x07cat\tname\x06' 
    44             '\x0fJessica\x13birthdate\x08\x01B^\xc4\xae\xaa\x00\x00\x00%' 
    45             'spayed_or_neutered\x02\x01') 
     43            '\n\x0b\x01\tname\x06\x0fJessica\t_key\x01\x13birthdate' 
     44            '\x08\x01B^\xc4\xae\xaa\x00\x00\x00!weight_in_pounds' 
     45            '\x04\x05\ttype\x06\x07cat%spayed_or_neutered\x02\x01') 
    4646 
    4747    def test_expando(self): 
    4848        # 'borrowed' from http://code.google.com/appengine/docs/datastore/entitiesandmodels.html 
     
    6363 
    6464        encoder.writeElement(jessica) 
    6565        self.assertEquals(encoder.stream.getvalue(), 
    66             '\x03\x00\x04name\x02\x00\x07Jessica\x00\tbirthdate\x0bB^\xc4\xae' 
    67             '\xaa\x00\x00\x00\x00\x00\x00\x10weight_in_pounds\x00@\x14\x00' 
    68             '\x00\x00\x00\x00\x00\x00\x03foo\x02\x00\x03bar\x00\x04type\x02' 
    69             '\x00\x03cat\x00\x12spayed_or_neutered\x01\x00\x00\x00\t') 
     66            '\x03\x00\x04name\x02\x00\x07Jessica\x00\x04_key\x05\x00' 
     67            '\tbirthdate\x0bB^\xc4\xae\xaa\x00\x00\x00\x00\x00\x00\x10' 
     68            'weight_in_pounds\x00@\x14\x00\x00\x00\x00\x00\x00\x00\x03' 
     69            'foo\x02\x00\x03bar\x00\x04type\x02\x00\x03cat\x00\x12' 
     70            'spayed_or_neutered\x01\x00\x00\x00\t') 
    7071 
    7172        encoder = pyamf.get_encoder(pyamf.AMF3) 
    7273        encoder.writeElement(jessica) 
    7374        self.assertEquals(encoder.stream.getvalue(), 
    74             '\n\x0b\x01\tname\x06\x0fJessica\x13birthdate\x08\x01B^\xc4\xae' 
    75             '\xaa\x00\x00\x00!weight_in_pounds\x04\x05\x07foo\x06\x07bar\t' 
    76             'type\x06\x07cat%spayed_or_neutered\x02\x01') 
     75            '\n\x0b\x01\tname\x06\x0fJessica\t_key\x01\x13birthdate' 
     76            '\x08\x01B^\xc4\xae\xaa\x00\x00\x00!weight_in_pounds' 
     77            '\x04\x05\x07foo\x06\x07bar\ttype\x06\x07' 
     78            'cat%spayed_or_neutered\x02\x01') 
    7779 
    7880 
    7981def suite():