From aed20ca5d7a19fb5497c65245f5a801723c2c91e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 1 Oct 2012 15:43:30 +0200 Subject: [PATCH] [FIX] conversion and validation of date and datetime field imports bzr revid: xmo@openerp.com-20121001134330-za8hqctrghmw08i4 --- openerp/addons/base/ir/ir_fields.py | 24 +++++++-- .../addons/test_impex/tests/test_load.py | 49 ++++++++++++++++--- 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/openerp/addons/base/ir/ir_fields.py b/openerp/addons/base/ir/ir_fields.py index c7012525961..417fbc9b4db 100644 --- a/openerp/addons/base/ir/ir_fields.py +++ b/openerp/addons/base/ir/ir_fields.py @@ -3,8 +3,11 @@ import functools import operator import itertools import psycopg2 +import time from openerp.osv import orm, fields from openerp.tools.translate import _ +from openerp.tools.misc import DEFAULT_SERVER_DATE_FORMAT,\ + DEFAULT_SERVER_DATETIME_FORMAT REFERENCING_FIELDS = set([None, 'id', '.id']) def only_ref_fields(record): @@ -114,14 +117,25 @@ class ir_fields_converter(orm.Model): _(u"'%s' does not seem to be a number for field '%%(field)s'") % value) - def _str_to_char(self, cr, uid, model, column, value, context=None): + def _str_id(self, cr, uid, model, column, value, context=None): return value, [] + _str_to_char = _str_to_text = _str_to_binary = _str_id - def _str_to_text(self, cr, uid, model, column, value, context=None): - return value, [] + def _str_to_date(self, cr, uid, model, column, value, context=None): + try: + time.strptime(value, DEFAULT_SERVER_DATE_FORMAT) + return value, [] + except ValueError: + raise ValueError( + _(u"'%s' does not seem to be a valid date for field '%%(field)s'") % value) - def _str_to_binary(self, cr, uid, model, column, value, context=None): - return value, [] + def _str_to_datetime(self, cr, uid, model, column, value, context=None): + try: + time.strptime(value, DEFAULT_SERVER_DATETIME_FORMAT) + return value, [] + except ValueError: + raise ValueError( + _(u"'%s' does not seem to be a valid datetime for field '%%(field)s'") % value) def _get_translations(self, cr, uid, types, src, context): types = tuple(types) diff --git a/openerp/tests/addons/test_impex/tests/test_load.py b/openerp/tests/addons/test_impex/tests/test_load.py index 074b75a9fb3..7657709d24a 100644 --- a/openerp/tests/addons/test_impex/tests/test_load.py +++ b/openerp/tests/addons/test_impex/tests/test_load.py @@ -339,13 +339,8 @@ class test_float_field(ImporterCase): def test_nonsense(self): result = self.import_(['value'], [['foobar']]) self.assertIs(result['ids'], False) - self.assertEqual(result['messages'], [{ - 'type': 'error', - 'rows': {'from': 0, 'to': 0}, - 'record': 0, - 'field': 'value', - 'message': u"'foobar' does not seem to be a number for field 'unknown'", - }]) + self.assertEqual(result['messages'], [ + message(u"'foobar' does not seem to be a number for field 'unknown'")]) class test_string_field(ImporterCase): model_name = 'export.string.bounded' @@ -981,5 +976,45 @@ class test_realworld(common.TransactionCase): self.assertFalse(result['messages']) self.assertEqual(len(result['ids']), len(data)) +class test_date(ImporterCase): + model_name = 'export.date' + + def test_empty(self): + self.assertEqual( + self.import_(['value'], []), + {'ids': [], 'messages': []}) + + def test_basic(self): + result = self.import_(['value'], [['2012-02-03']]) + self.assertFalse(result['messages']) + self.assertEqual(len(result['ids']), 1) + + def test_invalid(self): + result = self.import_(['value'], [['not really a date']]) + self.assertEqual(result['messages'], [ + message(u"'not really a date' does not seem to be a valid date " + u"for field 'unknown'")]) + self.assertIs(result['ids'], False) + +class test_datetime(ImporterCase): + model_name = 'export.datetime' + + def test_empty(self): + self.assertEqual( + self.import_(['value'], []), + {'ids': [], 'messages': []}) + + def test_basic(self): + result = self.import_(['value'], [['2012-02-03 11:11:11']]) + self.assertFalse(result['messages']) + self.assertEqual(len(result['ids']), 1) + + def test_invalid(self): + result = self.import_(['value'], [['not really a datetime']]) + self.assertEqual(result['messages'], [ + message(u"'not really a datetime' does not seem to be a valid " + u"datetime for field 'unknown'")]) + self.assertIs(result['ids'], False) + # function, related, reference: written to db as-is... # => function uses @type for value coercion/conversion