Merge pull request #181 from flashingpumpkin/master

Maintain a reference to the parent/root serializer
This commit is contained in:
Tom Christie 2012-08-23 04:15:41 -07:00
commit db7d15d5d1
2 changed files with 16 additions and 6 deletions

View File

@ -169,8 +169,9 @@ class FormResource(Resource):
) )
# Add any unknown field errors # Add any unknown field errors
for key in unknown_fields: if not self.allow_unknown_form_fields:
field_errors[key] = [u'This field does not exist.'] for key in unknown_fields:
field_errors[key] = [u'This field does not exist.']
if field_errors: if field_errors:
detail[u'field_errors'] = field_errors detail[u'field_errors'] = field_errors

View File

@ -96,6 +96,11 @@ class Serializer(object):
""" """
The maximum depth to serialize to, or `None`. The maximum depth to serialize to, or `None`.
""" """
parent = None
"""
A reference to the root serializer when descending down into fields.
"""
def __init__(self, depth=None, stack=[], **kwargs): def __init__(self, depth=None, stack=[], **kwargs):
if depth is not None: if depth is not None:
@ -130,9 +135,12 @@ class Serializer(object):
# If an element in `fields` is a 2-tuple of (str, tuple) # If an element in `fields` is a 2-tuple of (str, tuple)
# then the second element of the tuple is the fields to # then the second element of the tuple is the fields to
# set on the related serializer # set on the related serializer
class OnTheFlySerializer(self.__class__):
fields = info
parent = getattr(self, 'parent') or self
if isinstance(info, (list, tuple)): if isinstance(info, (list, tuple)):
class OnTheFlySerializer(self.__class__):
fields = info
return OnTheFlySerializer return OnTheFlySerializer
# If an element in `fields` is a 2-tuple of (str, Serializer) # If an element in `fields` is a 2-tuple of (str, Serializer)
@ -150,8 +158,9 @@ class Serializer(object):
elif isinstance(info, str) and info in _serializers: elif isinstance(info, str) and info in _serializers:
return _serializers[info] return _serializers[info]
# Otherwise use `related_serializer` or fall back to `Serializer` # Otherwise use `related_serializer` or fall back to
return getattr(self, 'related_serializer') or Serializer # `OnTheFlySerializer` preserve custom serialization methods.
return getattr(self, 'related_serializer') or OnTheFlySerializer
def serialize_key(self, key): def serialize_key(self, key):
""" """