Reviewers: ,


Please review this at http://codereview.tryton.org/211001/

Affected files:
  M proteus/config.py


Index: proteus/config.py
===================================================================

--- a/proteus/config.py
+++ b/proteus/config.py
@@ -13,9 +13,10 @@


 def dump_decimal(self, value, write):
-    write("<value><double>")
-    write(str(value))
-    write("</double></value>\n")
+    value = {'__class__': 'Decimal',
+        'decimal': str(value),
+        }
+    self.dump_struct(value, write)

 def dump_buffer(self, value, write):
     self.write = write
@@ -23,17 +24,34 @@
     value.encode(self)
     del self.write

+def dump_date(self, value, write):
+    value = {'__class__': 'date',
+        'year': value.year,
+        'month': value.month,
+        'day': value.day,
+        }
+    self.dump_struct(value, write)
+
 xmlrpclib.Marshaller.dispatch[Decimal] = dump_decimal
-xmlrpclib.Marshaller.dispatch[datetime.date] = \
-        lambda self, value, write: self.dump_datetime(
-                datetime.datetime.combine(value, datetime.time()), write)
+xmlrpclib.Marshaller.dispatch[datetime.date] = dump_date
 xmlrpclib.Marshaller.dispatch[buffer] = dump_buffer

+def end_struct(self, data):
+    mark = self._marks.pop()
+    # map structs to Python dictionaries
+    dct = {}
+    items = self._stack[mark:]
+    for i in range(0, len(items), 2):
+        dct[xmlrpclib._stringify(items[i])] = items[i+1]
+    if '__class__' in dct:
+        if dct['__class__'] == 'date':
+            dct = datetime.date(dct['year'], dct['month'], dct['day'])
+        elif dct['__class__'] == 'Decimal':
+            dct = Decimal(dct['decimal'])
+    self._stack[mark:] = [dct]
+    self._value = 0

-def _end_double(self, data):
-    self.append(Decimal(data))
-    self._value = 0
-xmlrpclib.Unmarshaller.dispatch["double"] = _end_double
+xmlrpclib.Unmarshaller.dispatch['struct'] = end_struct

 _CONFIG = threading.local()
 _CONFIG.current = None



--
[email protected] mailing list

Reply via email to