potential fix for dereferencing nested lists

This commit is contained in:
Stefan Wojcik 2013-06-11 15:36:35 -07:00
parent e0dd33e6be
commit a7ca9950fc

View File

@ -35,7 +35,7 @@ class DeReference(object):
if instance and isinstance(instance, (Document, TopLevelDocumentMetaclass)): if instance and isinstance(instance, (Document, TopLevelDocumentMetaclass)):
doc_type = instance._fields.get(name) doc_type = instance._fields.get(name)
if hasattr(doc_type, 'field'): while hasattr(doc_type, 'field'):
doc_type = doc_type.field doc_type = doc_type.field
if isinstance(doc_type, ReferenceField): if isinstance(doc_type, ReferenceField):
@ -50,9 +50,19 @@ class DeReference(object):
return items return items
elif not field.dbref: elif not field.dbref:
if not hasattr(items, 'items'): if not hasattr(items, 'items'):
items = [field.to_python(v)
if not isinstance(v, (DBRef, Document)) else v def _get_items(items):
for v in items] new_items = []
for v in items:
if isinstance(v, list):
new_items.append(_get_items(v))
elif not isinstance(v, (DBRef, Document)):
new_items.append(field.to_python(v))
else:
new_items.append(v)
return new_items
items = _get_items(items)
else: else:
items = dict([ items = dict([
(k, field.to_python(v)) (k, field.to_python(v))
@ -113,11 +123,11 @@ class DeReference(object):
"""Fetch all references and convert to their document objects """Fetch all references and convert to their document objects
""" """
object_map = {} object_map = {}
for col, dbrefs in self.reference_map.iteritems(): for collection, dbrefs in self.reference_map.iteritems():
keys = object_map.keys() keys = object_map.keys()
refs = list(set([dbref for dbref in dbrefs if unicode(dbref).encode('utf-8') not in keys])) refs = list(set([dbref for dbref in dbrefs if unicode(dbref).encode('utf-8') not in keys]))
if hasattr(col, 'objects'): # We have a document class for the refs if hasattr(collection, 'objects'): # We have a document class for the refs
references = col.objects.in_bulk(refs) references = collection.objects.in_bulk(refs)
for key, doc in references.iteritems(): for key, doc in references.iteritems():
object_map[key] = doc object_map[key] = doc
else: # Generic reference: use the refs data to convert to document else: # Generic reference: use the refs data to convert to document
@ -125,19 +135,19 @@ class DeReference(object):
continue continue
if doc_type: if doc_type:
references = doc_type._get_db()[col].find({'_id': {'$in': refs}}) references = doc_type._get_db()[collection].find({'_id': {'$in': refs}})
for ref in references: for ref in references:
doc = doc_type._from_son(ref) doc = doc_type._from_son(ref)
object_map[doc.id] = doc object_map[doc.id] = doc
else: else:
references = get_db()[col].find({'_id': {'$in': refs}}) references = get_db()[collection].find({'_id': {'$in': refs}})
for ref in references: for ref in references:
if '_cls' in ref: if '_cls' in ref:
doc = get_document(ref["_cls"])._from_son(ref) doc = get_document(ref["_cls"])._from_son(ref)
elif doc_type is None: elif doc_type is None:
doc = get_document( doc = get_document(
''.join(x.capitalize() ''.join(x.capitalize()
for x in col.split('_')))._from_son(ref) for x in collection.split('_')))._from_son(ref)
else: else:
doc = doc_type._from_son(ref) doc = doc_type._from_son(ref)
object_map[doc.id] = doc object_map[doc.id] = doc