From 82af31c5fa5a24713f98a4339ab5eba3d418371f Mon Sep 17 00:00:00 2001
From: Őry Máté <ory.mate@cloud.bme.hu>
Date: Wed, 16 Jul 2014 09:49:11 +0200
Subject: [PATCH] common: force unicode() on nonserializable objs for HROs

---
 circle/common/models.py | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/circle/common/models.py b/circle/common/models.py
index aa2f97e..5938be6 100644
--- a/circle/common/models.py
+++ b/circle/common/models.py
@@ -15,6 +15,7 @@
 # You should have received a copy of the GNU General Public License along
 # with CIRCLE.  If not, see <http://www.gnu.org/licenses/>.
 
+from __future__ import unicode_literals
 from collections import deque
 from contextlib import contextmanager
 from hashlib import sha224
@@ -25,10 +26,13 @@ from warnings import warn
 
 from django.contrib.auth.models import User
 from django.core.cache import cache
+from django.core.serializers.json import DjangoJSONEncoder
 from django.db.models import (
     CharField, DateTimeField, ForeignKey, NullBooleanField
 )
 from django.utils import timezone
+from django.utils.encoding import force_text
+from django.utils.functional import Promise
 from django.utils.translation import ugettext_lazy as _, ugettext_noop
 from jsonfield import JSONField
 
@@ -110,9 +114,20 @@ def split_activity_code(activity_code):
     return activity_code.split(activity_code_separator)
 
 
+class Encoder(DjangoJSONEncoder):
+    def default(self, obj):
+        if isinstance(obj, Promise):
+            obj = force_text(obj)
+        try:
+            return super(Encoder, self).default(obj)
+        except TypeError:
+            return unicode(obj)
+
+
 class ActivityModel(TimeStampedModel):
     activity_code = CharField(max_length=100, verbose_name=_('activity code'))
     readable_name_data = JSONField(blank=True, null=True,
+                                   dump_kwargs={"cls": Encoder},
                                    verbose_name=_('human readable name'),
                                    help_text=_('Human readable name of '
                                                'activity.'))
@@ -132,6 +147,7 @@ class ActivityModel(TimeStampedModel):
                                  help_text=_('True, if the activity has '
                                              'finished successfully.'))
     result_data = JSONField(verbose_name=_('result'), blank=True, null=True,
+                            dump_kwargs={"cls": Encoder},
                             help_text=_('Human readable result of activity.'))
 
     def __unicode__(self):
--
libgit2 0.26.0