diff --git a/remoteobjects/dataobject.py b/remoteobjects/dataobject.py index 6c9d764..3b11b78 100644 --- a/remoteobjects/dataobject.py +++ b/remoteobjects/dataobject.py @@ -207,9 +207,11 @@ def to_dict(self): return data @classmethod - def from_dict(cls, data): + def from_dict(cls, data, client=None): """Decodes a dictionary into a new `DataObject` instance.""" self = cls() + if client: + self._http = client self.update_from_dict(data) return self diff --git a/remoteobjects/fields.py b/remoteobjects/fields.py index a291816..93e8c40 100644 --- a/remoteobjects/fields.py +++ b/remoteobjects/fields.py @@ -145,7 +145,7 @@ def __get__(self, obj, cls): else: value = self.default else: - value = self.decode(value) + value = self.decode(value, client=getattr(obj, "_http", None)) # Store the value so we need decode it only once. obj.__dict__[self.attrname] = value @@ -167,7 +167,7 @@ def __delete__(self, obj): except KeyError: pass - def decode(self, value): + def decode(self, value, client=None): """Decodes a dictionary value into a `DataObject` attribute value. This implementation returns the `value` parameter unchanged. This is @@ -239,7 +239,7 @@ def __set__(self, obj, value): raise ValueError('Value %r is not expected value %r' % (value, self.value)) - def decode(self, value): + def decode(self, value, client=None): if value != self.value: raise ValueError('Value %r is not expected value %r' % (value, self.value)) @@ -276,10 +276,10 @@ def install(self, attrname, cls): # Make sure our content field knows its owner too. self.fld.install(attrname, cls) - def decode(self, value): + def decode(self, value, client=None): """Decodes the dictionary value (a list of dictionary values) into a `DataObject` attribute (a list of `DataObject` attribute values).""" - return [self.fld.decode(v) for v in value] + return [self.fld.decode(v, client=client) for v in value] def encode(self, value): """Encodes a `DataObject` attribute (a list of `DataObject` attribute @@ -296,11 +296,11 @@ class Dict(List): """ - def decode(self, value): + def decode(self, value, client=None): """Decodes the dictionary value (a dictionary with dictionary values for values) into a `DataObject` attribute (a dictionary with `DataObject` attributes for values).""" - return dict((k, self.fld.decode(v)) for k, v in value.iteritems()) + return dict((k, self.fld.decode(v, client=client)) for k, v in value.iteritems()) def encode(self, value): """Encodes a `DataObject` attribute (a dictionary with decoded @@ -346,14 +346,14 @@ class is the leafmost `DataObject` subclass declared with that name. super(Object, self).__init__(**kwargs) self.cls = cls - def decode(self, value): + def decode(self, value, client=None): """Decodes the dictionary value into an instance of the `DataObject` class the field references.""" if value is None: if callable(self.default): return self.default() return self.default - return self.cls.from_dict(value) + return self.cls.from_dict(value, client=client) def encode(self, value): """Encodes an instance of the field's DataObject class into its @@ -387,7 +387,7 @@ def __init__(self, dateformat=None, **kwargs): if dateformat is not None: self.dateformat = dateformat - def decode(self, value): + def decode(self, value, client=None): """Decodes a timestamp string into a `DataObject` attribute (a Python `datetime` instance). @@ -475,4 +475,4 @@ def __get__(self, instance, owner): if instance._location is None: raise AttributeError('Cannot find URL of %s relative to URL-less %s' % (self.cls.__name__, owner.__name__)) newurl = urlparse.urljoin(instance._location, self.api_name) - return self.cls.get(newurl) + return self.cls.get(newurl, http=instance._http) diff --git a/remoteobjects/promise.py b/remoteobjects/promise.py index 8ff03ea..2cf33db 100644 --- a/remoteobjects/promise.py +++ b/remoteobjects/promise.py @@ -183,6 +183,12 @@ def options(self, http=None, **kwargs): resp._method = 'OPTIONS' return resp + def post(self, obj, http=None): + if http is None: + http = self._http + + return super(PromiseObject, self).post(obj, http=http) + def __setattr__(self, name, value): if name is not '_delivered' and not self._delivered and name in self.fields: self.deliver() diff --git a/setup.py b/setup.py index 23206c4..e92177f 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,7 @@ setup( name='remoteobjects', - version='1.2.1', + version='1.2.1.post1', description='an Object RESTational Model', author='SAY Media Ltd.', author_email='python@saymedia.com',