[FIX] conversion and validation of date and datetime field imports
authorXavier Morel <xmo@openerp.com>
Mon, 1 Oct 2012 13:43:30 +0000 (15:43 +0200)
committerXavier Morel <xmo@openerp.com>
Mon, 1 Oct 2012 13:43:30 +0000 (15:43 +0200)
bzr revid: xmo@openerp.com-20121001134330-za8hqctrghmw08i4

openerp/addons/base/ir/ir_fields.py
openerp/tests/addons/test_impex/tests/test_load.py

index c701252..417fbc9 100644 (file)
@@ -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)
index 074b75a..7657709 100644 (file)
@@ -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