Please review this at http://codereview.tryton.org/221011/
Affected files:
M CHANGELOG
M proteus/__init__.py
M proteus/config.py
Index: CHANGELOG
===================================================================
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,5 @@
+* Add support of Time fields
+
Version 2.2.0 - 2011-10-25
* Bug fixes (see mercurial logs for details)
* Change license to LGPL-3
Index: proteus/__init__.py
===================================================================
--- a/proteus/__init__.py
+++ b/proteus/__init__.py
@@ -173,6 +173,12 @@
super(DateTimeDescriptor, self).__set__(instance, value)
+class TimeDescriptor(FieldDescriptor):
+ def __set__(self, instance, value):
+ assert isinstance(value, datetime.time) or value in (None, False)
+ super(TimeDescriptor, self).__set__(instance, value)
+
+
class Many2OneDescriptor(FieldDescriptor):
def __get__(self, instance, owner):
relation = Model.get(self.definition['relation'], instance._config)
@@ -323,6 +329,7 @@
'reference': ReferenceDescriptor,
'date': DateDescriptor,
'datetime': DateTimeDescriptor,
+ 'time': TimeDescriptor,
'many2one': Many2OneDescriptor,
'one2many': One2ManyDescriptor,
'many2many': Many2ManyDescriptor,
Index: proteus/config.py
===================================================================
--- a/proteus/config.py
+++ b/proteus/config.py
@@ -32,8 +32,18 @@
}
self.dump_struct(value, write)
+
+def dump_time(self, value, write):
+ value = {'__class__': 'time',
+ 'hour': value.hour,
+ 'minute': value.minute,
+ 'second': value.second,
+ }
+ self.dump_struct(value, write)
+
xmlrpclib.Marshaller.dispatch[Decimal] = dump_decimal
xmlrpclib.Marshaller.dispatch[datetime.date] = dump_date
+xmlrpclib.Marshaller.dispatch[datetime.time] = dump_time
xmlrpclib.Marshaller.dispatch[buffer] = dump_buffer
def end_struct(self, data):
@@ -46,6 +56,8 @@
if '__class__' in dct:
if dct['__class__'] == 'date':
dct = datetime.date(dct['year'], dct['month'], dct['day'])
+ elif dct['__class__'] == 'time':
+ dct = datetime.time(dct['hour'], dct['minute'], dct['second'])
elif dct['__class__'] == 'Decimal':
dct = Decimal(dct['decimal'])
self._stack[mark:] = [dct]