Skip to content

Commit

Permalink
Handle serializing promises to some extent in Django 1.4
Browse files Browse the repository at this point in the history
  • Loading branch information
dcramer committed Sep 3, 2012
1 parent cc2a30d commit 8c1ede6
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 12 deletions.
18 changes: 14 additions & 4 deletions raven/contrib/django/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,24 @@
class PromiseSerializer(Serializer):
types = (Promise,)

def can(self, value):
if not super(PromiseSerializer, self).can(value):
return False

pre = value.__class__.__name__[1:]
if not (hasattr(value, '%s__func' % pre) or hasattr(value, '%s__unicode_cast' % pre)):
return False

return True

def serialize(self, value):
# EPIC HACK
# handles lazy model instances (which are proxy values that dont easily give you the actual function)
pre = value.__class__.__name__[1:]
if not hasattr(value, '%s__func' % pre):
return value

value = getattr(value, '%s__func' % pre)(*getattr(value, '%s__args' % pre), **getattr(value, '%s__kw' % pre))
if hasattr(value, '%s__func' % pre):
value = getattr(value, '%s__func' % pre)(*getattr(value, '%s__args' % pre), **getattr(value, '%s__kw' % pre))
else:
return unicode(value)
return self.recurse(value)


Expand Down
16 changes: 8 additions & 8 deletions tests/contrib/django/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -607,30 +607,30 @@ def test_basic(self):
self.assertEquals(res, 'bar')

def test_handles_gettext_lazy(self):
import pickle
from django.utils.functional import lazy

def fake_gettext(to_translate):
return u'Igpay Atinlay'

fake_gettext_lazy = lazy(fake_gettext, str)

self.assertEquals(
pickle.loads(pickle.dumps(
transform(fake_gettext_lazy("something")))),
u'Igpay Atinlay')
result = transform(fake_gettext_lazy("something"))
self.assertTrue(isinstance(result, basestring))
self.assertEquals(result, u'Igpay Atinlay')


class QuerySetSerializerTestCase(TestCase):
def test_model_instance(self):
instance = TestModel()

result = transform(instance)
self.assertEquals(result, '<TestModel: TestModel object>')
self.assertTrue(isinstance(result, basestring))
self.assertEquals(result, u'<TestModel: TestModel object>')

def test_basic(self):
from django.db.models.query import QuerySet
obj = QuerySet(model=TestModel)

res = transform(obj)
self.assertEquals(res, '<QuerySet: model=TestModel>')
result = transform(obj)
self.assertTrue(isinstance(result, basestring))
self.assertEquals(result, u'<QuerySet: model=TestModel>')

0 comments on commit 8c1ede6

Please sign in to comment.