diff --git a/odoo/addons/test_new_api/models.py b/odoo/addons/test_new_api/models.py index a6ce5fe2e37..6d90119aba7 100644 --- a/odoo/addons/test_new_api/models.py +++ b/odoo/addons/test_new_api/models.py @@ -297,6 +297,7 @@ class MixedModel(models.Model): number = fields.Float(digits=(10, 2), default=3.14) number2 = fields.Float(digits='New API Precision') date = fields.Date() + moment = fields.Datetime() now = fields.Datetime(compute='_compute_now') lang = fields.Selection(string='Language', selection='_get_lang') reference = fields.Reference(string='Related Document', diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py index c485bb21252..692245c849c 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -577,9 +577,41 @@ class TestFields(common.TransactionCase): with self.assertRaises(ValueError): record.date = '12-5-1' + # check filtered_domain + self.assertTrue(record.filtered_domain([('date', '<', '2012-05-02')])) + self.assertTrue(record.filtered_domain([('date', '<', date(2012, 5, 2))])) + self.assertTrue(record.filtered_domain([('date', '<', datetime(2012, 5, 2, 12, 0, 0))])) + + def test_21_datetime(self): + """ test datetime fields """ for i in range(0, 10): self.assertEqual(fields.Datetime.now().microsecond, 0) + record = self.env['test_new_api.mixed'].create({}) + + # assign falsy value + record.moment = None + self.assertFalse(record.moment) + + # assign string + record.moment = '2012-05-01' + self.assertEqual(record.moment, datetime(2012, 5, 1)) + record.moment = '2012-05-01 06:00:00' + self.assertEqual(record.moment, datetime(2012, 5, 1, 6)) + with self.assertRaises(ValueError): + record.moment = '12-5-1' + + # assign date or datetime + record.moment = date(2012, 5, 1) + self.assertEqual(record.moment, datetime(2012, 5, 1)) + record.moment = datetime(2012, 5, 1, 6) + self.assertEqual(record.moment, datetime(2012, 5, 1, 6)) + + # check filtered_domain + self.assertTrue(record.filtered_domain([('moment', '<', '2012-05-02')])) + self.assertTrue(record.filtered_domain([('moment', '<', date(2012, 5, 2))])) + self.assertTrue(record.filtered_domain([('moment', '<', datetime(2012, 5, 1, 12, 0, 0))])) + def test_21_date_datetime_helpers(self): """ test date/datetime fields helpers """ _date = fields.Date.from_string("2077-10-23") diff --git a/odoo/models.py b/odoo/models.py index d917558c9e1..1ed5e515346 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -5133,9 +5133,15 @@ Record ids: %(records)s else: data = data and data.ids or [False] else: - data = [ - (isinstance(x, datetime.date) and x.strftime('%Y-%m-%d %H:%M:%S')) or - x for x in data] + true_data = next((d for d in data if d), None) + if isinstance(true_data, datetime.date): + # convert all date and datetime values to datetime + normalize = Datetime.to_datetime + if isinstance(value, (list, tuple)): + value = [normalize(v) for v in value] + else: + value = normalize(value) + data = [normalize(d) for d in data] if comparator in ('in', 'not in'): if not (isinstance(value, list) or isinstance(value, tuple)): value = [value] @@ -6100,4 +6106,4 @@ def lazy_name_get(self): # keep those imports here to avoid dependency cycle errors from .osv import expression -from .fields import Field +from .fields import Field, Datetime