Restore assignation of string and integer value for Date, DateTime, Time and Timedelta fields
Closes #13873
This commit is contained in:
1 parent
164aabda58
commit
efdda3a111
5 files changed
+81
-3
No files matched your search
@@ -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 = {}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in new issue
Block a user