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

Closes #13873
This commit is contained in:
Cédric Krier committed 2025-02-15 01:38:51 +01:00
1 parent 164aabda58
commit efdda3a111
5 files changed
+81 -3

No files matched your search

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