diff --git a/trytond/backend/fields.py b/trytond/backend/fields.py index 6fa95c10cf..f250fabb49 100644 --- a/trytond/backend/fields.py +++ b/trytond/backend/fields.py @@ -98,9 +98,11 @@ class Date(Field): return datetime.date(year, month, day) assert(isinstance(value, datetime.date)) - # datetime must be tested separately because datetime is a - # subclass of date: - assert(not isinstance(value, datetime.datetime)) + # Allow datetime with min time for XML-RPC + if value.time() != datetime.time(): + # datetime must be tested separately because datetime is a + # subclass of date: + assert(not isinstance(value, datetime.datetime)) return value diff --git a/trytond/protocols/xmlrpc.py b/trytond/protocols/xmlrpc.py index 41bfae69a4..1e370f7c15 100644 --- a/trytond/protocols/xmlrpc.py +++ b/trytond/protocols/xmlrpc.py @@ -16,6 +16,7 @@ import os import gzip import StringIO import base64 +import datetime # convert decimal to float before marshalling: from decimal import Decimal @@ -23,11 +24,20 @@ xmlrpclib.Marshaller.dispatch[Decimal] = \ lambda self, value, write: self.dump_double(float(value), write) xmlrpclib.Marshaller.dispatch[type(None)] = \ lambda self, value, write: self.dump_bool(bool(value), write) +xmlrpclib.Marshaller.dispatch[datetime.date] = \ + lambda self, value, write: self.dump_datetime( + datetime.datetime.combine(value, datetime.time()), write) def _end_double(self, data): self.append(Float(data)) self._value = 0 xmlrpclib.Unmarshaller.dispatch["double"] = _end_double +def _end_dateTime(self, data): + value = xmlrpclib.DateTime() + value.decode(data) + value = xmlrpclib._datetime_type(data) + self.append(value) +xmlrpclib.Unmarshaller.dispatch["dateTime.iso8601"] = _end_dateTime class GenericXMLRPCRequestHandler: