Restore assignation of string and integer value for Date, DateTime, Time and Timedelta fields

Closes #13873
(grafted from d85a062b9a32e4c8770791bd18e6df2d4ca28ae8)

--HG--
branch : 7.0
This commit is contained in:
Cédric Krier committed 2025-02-15 01:38:51 +01:00
1 parent 7a364be2ed
commit da0773ddbf
5 files changed
+81 -3

No files matched your search

+24 -3
View File
@@ -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 = {}
+11
View File
@@ -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"
@@ -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"
+11
View File
@@ -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"
@@ -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"