Please review this at http://codereview.appspot.com/447041/show

Affected files:
  M trytond/backend/fields.py
  A trytond/protocols/datatype.py
  M trytond/protocols/jsonrpc.py
  M trytond/protocols/xmlrpc.py


Index: trytond/backend/fields.py
===================================================================
--- a/trytond/backend/fields.py
+++ b/trytond/backend/fields.py
@@ -79,8 +79,10 @@
     def sql_format(value):
         if not value:
             value = Decimal('0.0')
-        if isinstance(value, (int, long, float)):
+        if isinstance(value, (int, long)):
             value = Decimal(repr(value))
+        if isinstance(value, float) and hasattr(value, 'decimal'):
+            value = Decimal(value.decimal)
         assert isinstance(value, Decimal)
         return value

Index: trytond/protocols/datatype.py
===================================================================
new file mode 100644
--- /dev/null
+++ b/trytond/protocols/datatype.py
@@ -0,0 +1,18 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+class Float(float):
+
+    def __init__(self, value):
+        super(Float, self).__init__()
+        self.__decimal = value
+
+    @property
+    def decimal(self):
+        return self.__decimal
+
+    def __repr__(self):
+        return self.decimal
+
+    def __str__(self):
+        return self.decimal
Index: trytond/protocols/jsonrpc.py
===================================================================
--- a/trytond/protocols/jsonrpc.py
+++ b/trytond/protocols/jsonrpc.py
@@ -3,6 +3,7 @@
 from trytond.protocols.sslsocket import SSLSocket
 from trytond.protocols.dispatcher import dispatch
 from trytond.config import CONFIG
+from trytond.protocols.datatype import Float
 import SimpleXMLRPCServer
 import SimpleHTTPServer
 import SocketServer
@@ -77,7 +78,7 @@
         existing method through subclassing is the prefered means
         of changing method dispatch behavior.
         """
-        rawreq = json.loads(data, object_hook=object_hook)
+        rawreq = json.loads(data, object_hook=object_hook,
parse_float=Float)

         req_id = rawreq.get('id', 0)
         method = rawreq['method']
Index: trytond/protocols/xmlrpc.py
===================================================================
--- a/trytond/protocols/xmlrpc.py
+++ b/trytond/protocols/xmlrpc.py
@@ -3,6 +3,7 @@
 from trytond.protocols.sslsocket import SSLSocket
 from trytond.protocols.dispatcher import dispatch
 from trytond.config import CONFIG
+from trytond.protocols.datatype import Float
 import SimpleXMLRPCServer
 import SocketServer
 import xmlrpclib
@@ -21,6 +22,11 @@
 xmlrpclib.Marshaller.dispatch[type(None)] = \
         lambda self, value, write: self.dump_bool(bool(value), write)

+def _end_double(self, data):
+    self.append(Float(data))
+    self._value = 0
+xmlrpclib.Unmarshaller.dispatch["double"] = _end_double
+

 class GenericXMLRPCRequestHandler:




-- 
Cédric Krier

B2CK SPRL
Rue de Rotterdam, 4
4000 Liège
Belgium
Tel: +32 472 54 46 59
Email/Jabber: [email protected]
Website: http://www.b2ck.com/

Attachment: pgpn1c9ZqKblz.pgp
Description: PGP signature

Reply via email to