changeset 2152:e14ae8437548 beta

extended JSON encoder to use __json__ method if available
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 21 Mar 2012 21:54:30 +0200
parents 12ceeda33339
children fa637dc3e029
files rhodecode/lib/compat.py rhodecode/model/db.py
diffstat 2 files changed, 16 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/lib/compat.py	Wed Mar 21 21:00:55 2012 +0200
+++ b/rhodecode/lib/compat.py	Wed Mar 21 21:54:30 2012 +0200
@@ -34,7 +34,12 @@
 #==============================================================================
 
 
-def __obj_dump(obj):
+def _obj_dump(obj):
+    """
+    Custom function for dumping objects to JSON
+
+    :param obj:
+    """
     DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S"
     DATE_FORMAT = "%Y-%m-%d"
     if isinstance(obj, complex):
@@ -47,6 +52,11 @@
         return list(obj)
     elif isinstance(obj, OrderedDict):
         return obj.as_dict()
+    elif hasattr(obj, '__json__'):
+        if callable(obj.__json__):
+            return obj.__json__()
+        else:
+            return obj.__json__
     else:
         raise NotImplementedError
 
@@ -57,7 +67,7 @@
     class ExtendedEncoder(json.JSONEncoder):
         def default(self, obj):
             try:
-                return __obj_dump(obj)
+                return _obj_dump(obj)
             except NotImplementedError:
                 pass
             return json.JSONEncoder.default(self, obj)
@@ -68,7 +78,7 @@
 
     def extended_encode(obj):
         try:
-            return __obj_dump(obj)
+            return _obj_dump(obj)
         except NotImplementedError:
             pass
         raise TypeError("%r is not JSON serializable" % (obj,))
--- a/rhodecode/model/db.py	Wed Mar 21 21:00:55 2012 +0200
+++ b/rhodecode/model/db.py	Wed Mar 21 21:54:30 2012 +0200
@@ -381,6 +381,9 @@
 
     def __json__(self):
         return dict(
+            user_id=self.user_id,
+            first_name=self.name,
+            last_name=self.lastname,
             email=self.email,
             full_name=self.full_name,
             full_name_or_username=self.full_name_or_username,