diff --git a/CHANGELOG b/CHANGELOG index a0eace7480..dbafa9c84d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Support import of native numeric, date and datetime data * Add day view on calendar * Raise NotImplementedError when setting Function field without setter * Add exports in view_toolbar_get diff --git a/trytond/model/modelstorage.py b/trytond/model/modelstorage.py index 504b41f6bf..3d2d50bc6d 100644 --- a/trytond/model/modelstorage.py +++ b/trytond/model/modelstorage.py @@ -834,13 +834,21 @@ class ModelStorage(Model): elif field_type == 'numeric': res = Decimal(value) if value else None elif field_type == 'date': - res = (datetime.datetime.strptime(value, - '%Y-%m-%d').date() - if value else None) + if isinstance(value, datetime.date): + res = value + elif value: + res = datetime.datetime.strptime( + value, '%Y-%m-%d').date() + else: + res = None elif field_type == 'datetime': - res = (datetime.datetime.strptime(value, - '%Y-%m-%d %H:%M:%S') - if value else None) + if isinstance(value, datetime.datetime): + res = value + elif value: + res = datetime.datetime.strptime( + value, '%Y-%m-%d %H:%M:%S') + else: + res = None elif field_type == 'many2one': res = get_many2one(this_field_def['relation'], value) elif field_type == 'many2many': diff --git a/trytond/tests/test_importdata.py b/trytond/tests/test_importdata.py index d40fd91695..b68dfc11ac 100644 --- a/trytond/tests/test_importdata.py +++ b/trytond/tests/test_importdata.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- # This file is part of Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. +import datetime import unittest -from decimal import InvalidOperation +from decimal import InvalidOperation, Decimal from trytond.model.exceptions import ( RequiredValidationError, SelectionValidationError, ImportDataError) @@ -54,6 +55,9 @@ class ImportDataTestCase(unittest.TestCase): self.assertEqual(Integer.import_data(['integer'], [['1']]), 1) + self.assertEqual(Integer.import_data(['integer'], + [[1]]), 1) + self.assertEqual(Integer.import_data(['integer'], [['-1']]), 1) @@ -116,6 +120,9 @@ class ImportDataTestCase(unittest.TestCase): self.assertEqual(Float.import_data(['float'], [['1.1']]), 1) + self.assertEqual(Float.import_data(['float'], + [[1.1]]), 1) + self.assertEqual(Float.import_data(['float'], [['-1.1']]), 1) @@ -178,6 +185,9 @@ class ImportDataTestCase(unittest.TestCase): self.assertEqual(Numeric.import_data(['numeric'], [['1.1']]), 1) + self.assertEqual(Numeric.import_data(['numeric'], + [[Decimal('1.1')]]), 1) + self.assertEqual(Numeric.import_data(['numeric'], [['-1.1']]), 1) @@ -270,6 +280,9 @@ class ImportDataTestCase(unittest.TestCase): self.assertEqual(Date.import_data(['date'], [['2010-01-01']]), 1) + self.assertEqual(Date.import_data(['date'], + [[datetime.date(2019, 3, 13)]]), 1) + self.assertEqual(Date.import_data(['date'], [['']]), 1) @@ -288,6 +301,9 @@ class ImportDataTestCase(unittest.TestCase): self.assertEqual(Datetime.import_data(['datetime'], [['2010-01-01 12:00:00']]), 1) + self.assertEqual(Datetime.import_data(['datetime'], + [[datetime.datetime(2019, 3, 13, 12, 0)]]), 1) + self.assertEqual(Datetime.import_data(['datetime'], [['']]), 1)