From da0773ddbf3502fdd9d1b8c4439fcfb5419c0486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sat, 15 Feb 2025 01:38:51 +0100 Subject: [PATCH] Restore assignation of string and integer value for Date, DateTime, Time and Timedelta fields Closes #13873 (grafted from d85a062b9a32e4c8770791bd18e6df2d4ca28ae8) --HG-- branch : 7.0 --- trytond/trytond/model/fields/date.py | 27 ++++++++++++++++--- trytond/trytond/tests/test_field_date.py | 11 ++++++++ trytond/trytond/tests/test_field_datetime.py | 11 ++++++++ trytond/trytond/tests/test_field_time.py | 11 ++++++++ trytond/trytond/tests/test_field_timedelta.py | 24 +++++++++++++++++ 5 files changed, 81 insertions(+), 3 deletions(-) diff --git a/trytond/trytond/model/fields/date.py b/trytond/trytond/model/fields/date.py index 966eecb531..731df0c14c 100644 --- a/trytond/trytond/model/fields/date.py +++ b/trytond/trytond/model/fields/date.py @@ -50,6 +50,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): @@ -93,6 +98,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): ''' @@ -157,6 +167,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): ''' @@ -184,14 +199,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 294eb50a20..dd18495b19 100644 --- a/trytond/trytond/tests/test_field_date.py +++ b/trytond/trytond/tests/test_field_date.py @@ -25,6 +25,17 @@ class FieldDateTestCase(unittest.TestCase): def setUpClass(cls): 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 a73589e9b5..924a77dd06 100644 --- a/trytond/trytond/tests/test_field_datetime.py +++ b/trytond/trytond/tests/test_field_datetime.py @@ -23,6 +23,17 @@ class FieldDateTimeTestCase(unittest.TestCase): def setUpClass(cls): 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 be69e6b4da..f37fda1b98 100644 --- a/trytond/trytond/tests/test_field_time.py +++ b/trytond/trytond/tests/test_field_time.py @@ -23,6 +23,17 @@ class FieldTimeTestCase(unittest.TestCase): def setUpClass(cls): 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 765878d3bb..4815797c89 100644 --- a/trytond/trytond/tests/test_field_timedelta.py +++ b/trytond/trytond/tests/test_field_timedelta.py @@ -20,6 +20,30 @@ class FieldTimeDeltaTestCase(unittest.TestCase): def setUpClass(cls): 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"