diff --git a/trytond/trytond/model/fields/date.py b/trytond/trytond/model/fields/date.py index b934f6d66b..d2e9737915 100644 --- a/trytond/trytond/model/fields/date.py +++ b/trytond/trytond/model/fields/date.py @@ -46,6 +46,11 @@ class Date(Field): expression = AtTimeZone(expression, timezone) return super(Date, self).sql_cast(expression) + def __set__(self, inst, value): + if isinstance(value, str): + value = datetime.date.fromisoformat(value) + super().__set__(inst, value) + class FormatMixin(Field): @@ -86,6 +91,11 @@ class Timestamp(FormatMixin, Field): return SQLite_DateTime(expression) return super().sql_cast(expression) + def __set__(self, inst, value): + if isinstance(value, str): + value = datetime.datetime.fromisoformat(value) + super().__set__(inst, value) + class DateTime(Timestamp): ''' @@ -148,6 +158,11 @@ class Time(FormatMixin, Field): return SQLite_Time(expression) return super(Time, self).sql_cast(expression) + def __set__(self, inst, value): + if isinstance(value, str): + value = datetime.time.fromisoformat(value) + super().__set__(inst, value) + class TimeDelta(Field): _type = 'timedelta' @@ -172,14 +187,20 @@ class TimeDelta(Field): if isinstance(value, (int, float)): value = datetime.timedelta(seconds=value) elif isinstance(value, str): - if not value.find(':'): - raise ValueError( - "TimeDelta requires a string '%H:%M:%S.%f' or '%H:%M'") hours, minutes, seconds = (value.split(":") + ['00'])[:3] value = datetime.timedelta( hours=int(hours), minutes=int(minutes), seconds=float(seconds)) return super().sql_format(value) + def __set__(self, inst, value): + if isinstance(value, (int, float)): + value = datetime.timedelta(seconds=value) + elif isinstance(value, str): + hours, minutes, seconds = (value.split(":") + ['00'])[:3] + value = datetime.timedelta( + hours=int(hours), minutes=int(minutes), seconds=float(seconds)) + super().__set__(inst, value) + @classmethod def get(cls, ids, model, name, values=None): result = {} diff --git a/trytond/trytond/tests/test_field_date.py b/trytond/trytond/tests/test_field_date.py index 618bd9b918..242d194f2e 100644 --- a/trytond/trytond/tests/test_field_date.py +++ b/trytond/trytond/tests/test_field_date.py @@ -27,6 +27,17 @@ class FieldDateTestCase(TestCase): super().setUpClass() activate_module('tests') + @with_transaction() + def test_set_string(self): + "Test set string" + pool = Pool() + Model = pool.get('test.date') + + record = Model() + record.date = str(today) + + self.assertEqual(record.date, today) + @with_transaction() def test_create(self): "Test create date" diff --git a/trytond/trytond/tests/test_field_datetime.py b/trytond/trytond/tests/test_field_datetime.py index 8c0abdb971..db704bfb4c 100644 --- a/trytond/trytond/tests/test_field_datetime.py +++ b/trytond/trytond/tests/test_field_datetime.py @@ -24,6 +24,17 @@ class FieldDateTimeTestCase(TestCase): super().setUpClass() activate_module('tests') + @with_transaction() + def test_set_string(self): + "Test set string" + pool = Pool() + Model = pool.get('test.datetime') + + record = Model() + record.datetime = str(today) + + self.assertEqual(record.datetime, today) + @with_transaction() def test_create(self): "Test create datetime" diff --git a/trytond/trytond/tests/test_field_time.py b/trytond/trytond/tests/test_field_time.py index 5f088109c7..bddc90d950 100644 --- a/trytond/trytond/tests/test_field_time.py +++ b/trytond/trytond/tests/test_field_time.py @@ -24,6 +24,17 @@ class FieldTimeTestCase(TestCase): super().setUpClass() activate_module('tests') + @with_transaction() + def test_set_string(self): + "Test set string" + pool = Pool() + Model = pool.get('test.time') + + record = Model() + record.time = str(evening) + + self.assertEqual(record.time, evening) + @with_transaction() def test_create(self): "Test create time" diff --git a/trytond/trytond/tests/test_field_timedelta.py b/trytond/trytond/tests/test_field_timedelta.py index 209b67642d..9273b8e42a 100644 --- a/trytond/trytond/tests/test_field_timedelta.py +++ b/trytond/trytond/tests/test_field_timedelta.py @@ -21,6 +21,30 @@ class FieldTimeDeltaTestCase(TestCase): super().setUpClass() activate_module('tests') + @with_transaction() + def test_set_string(self): + "Test set string" + pool = Pool() + Model = pool.get('test.timedelta') + + record = Model() + record.timedelta = '1:20:30.5' + + self.assertEqual( + record.timedelta, + datetime.timedelta(hours=1, minutes=20, seconds=30.5)) + + @with_transaction() + def test_set_integer(self): + "Test set integer" + pool = Pool() + Model = pool.get('test.timedelta') + + record = Model() + record.timedelta = 42 + + self.assertEqual(record.timedelta, datetime.timedelta(seconds=42)) + @with_transaction() def test_create(self): "Test create timedelta"