diff --git a/AUTHORS b/AUTHORS index 084c0129..b00b0692 100644 --- a/AUTHORS +++ b/AUTHORS @@ -139,6 +139,7 @@ that much better: * lraucy * hellysmile * Jaepil Jeong + * Daniil Sharou * Stefan Wójcik * Pete Campton * Martyn Smith diff --git a/docs/changelog.rst b/docs/changelog.rst index 01471461..45470000 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -51,6 +51,7 @@ Changes in 0.8.X Changes in 0.7.10 ================= +- Fix UnicodeEncodeError for dbref (#278) - Allow construction using positional parameters (#268) - Updated EmailField length to support long domains (#243) - Added 64-bit integer support (#251) diff --git a/mongoengine/dereference.py b/mongoengine/dereference.py index 1e220d47..e5e8886b 100644 --- a/mongoengine/dereference.py +++ b/mongoengine/dereference.py @@ -115,7 +115,7 @@ class DeReference(object): object_map = {} for col, dbrefs in self.reference_map.iteritems(): keys = object_map.keys() - refs = list(set([dbref for dbref in dbrefs if str(dbref) 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 references = col.objects.in_bulk(refs) for key, doc in references.iteritems(): diff --git a/tests/test_dereference.py b/tests/test_dereference.py index f8925238..10c3422c 100644 --- a/tests/test_dereference.py +++ b/tests/test_dereference.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import with_statement import sys sys.path[0:0] = [""] @@ -1153,5 +1154,29 @@ class FieldTest(unittest.TestCase): self.assertTrue(tuple(x.items[0]) in tuples) self.assertTrue(x.items[0] in tuples) + def test_non_ascii_pk(self): + """ + Ensure that dbref conversion to string does not fail when + non-ascii characters are used in primary key + """ + class Brand(Document): + title = StringField(max_length=255, primary_key=True) + + class BrandGroup(Document): + title = StringField(max_length=255, primary_key=True) + brands = SortedListField(ReferenceField("Brand", dbref=True)) + + Brand.drop_collection() + BrandGroup.drop_collection() + + brand1 = Brand(title="Moschino").save() + brand2 = Brand(title=u"Денис Симачёв").save() + + BrandGroup(title="top_brands", brands=[brand1, brand2]).save() + brand_groups = BrandGroup.objects().all() + + self.assertEqual(2, len([brand for bg in brand_groups for brand in bg.brands])) + if __name__ == '__main__': unittest.main() +