diff options
| author | Raphael Collet <rco@openerp.com> | 2014-07-06 16:44:26 +0200 |
|---|---|---|
| committer | Antony Lesuisse <al@openerp.com> | 2014-07-06 17:05:41 +0200 |
| commit | cbe2dbb672a6c55d86f2e515f9d1cdfee426ef80 (patch) | |
| tree | d6ff62b719fce32392397783c961b734b1e4c50e /addons/base_import | |
| parent | d78192c489d3be66cd6487b39f5ce7ba4733a187 (diff) | |
[MERGE] new v8 api by rco
A squashed merge is required as the conversion of the apiculture branch from
bzr to git was not correctly done. The git history contains irrelevant blobs
and commits. This branch brings a lot of changes and fixes, too many to list
exhaustively.
- New orm api, objects are now used instead of ids
- Environements to encapsulates cr uid context while maintaining backward compatibility
- Field compute attribute is a new object oriented way to define function fields
- Shared browse record cache
- New onchange protocol
- Optional copy flag on fields
- Documentation update
- Dead code cleanup
- Lots of fixes
Diffstat (limited to 'addons/base_import')
| -rw-r--r-- | addons/base_import/models.py | 6 | ||||
| -rw-r--r-- | addons/base_import/tests/test_cases.py | 54 |
2 files changed, 45 insertions, 15 deletions
diff --git a/addons/base_import/models.py b/addons/base_import/models.py index 2b683bd8927..bc4bb0a268f 100644 --- a/addons/base_import/models.py +++ b/addons/base_import/models.py @@ -74,6 +74,7 @@ class ir_import(orm.TransientModel): :param str model: name of the model to get fields form :param int landing: depth of recursion into o2m fields """ + model_obj = self.pool[model] fields = [{ 'id': 'id', 'name': 'id', @@ -81,8 +82,11 @@ class ir_import(orm.TransientModel): 'required': False, 'fields': [], }] - fields_got = self.pool[model].fields_get(cr, uid, context=context) + fields_got = model_obj.fields_get(cr, uid, context=context) + blacklist = orm.MAGIC_COLUMNS + [model_obj.CONCURRENCY_CHECK_FIELD] for name, field in fields_got.iteritems(): + if name in blacklist: + continue # an empty string means the field is deprecated, @deprecated must # be absent or False to mean not-deprecated if field.get('deprecated', False) is not False: diff --git a/addons/base_import/tests/test_cases.py b/addons/base_import/tests/test_cases.py index 5479ae94428..ac5a4440523 100644 --- a/addons/base_import/tests/test_cases.py +++ b/addons/base_import/tests/test_cases.py @@ -4,48 +4,72 @@ from openerp.tests.common import TransactionCase from .. import models -ID_FIELD = {'id': 'id', 'name': 'id', 'string': "External ID", 'required': False, 'fields': []} +ID_FIELD = { + 'id': 'id', + 'name': 'id', + 'string': "External ID", + 'required': False, + 'fields': [], +} +DISPLAY_NAME_FIELD = { + 'id': 'display_name', + 'name': 'display_name', + 'string': "Name", + 'required': False, + 'fields': [], +} + def make_field(name='value', string='unknown', required=False, fields=[]): return [ ID_FIELD, + DISPLAY_NAME_FIELD, {'id': name, 'name': name, 'string': string, 'required': required, 'fields': fields}, ] -class test_basic_fields(TransactionCase): +def sorted_fields(fields): + """ recursively sort field lists to ease comparison """ + recursed = [dict(field, fields=sorted_fields(field['fields'])) for field in fields] + return sorted(recursed, key=lambda field: field['id']) + +class BaseImportCase(TransactionCase): + def assertEqualFields(self, fields1, fields2): + self.assertEqual(sorted_fields(fields1), sorted_fields(fields2)) + +class test_basic_fields(BaseImportCase): def get_fields(self, field): return self.registry('base_import.import')\ .get_fields(self.cr, self.uid, 'base_import.tests.models.' + field) def test_base(self): """ A basic field is not required """ - self.assertEqual(self.get_fields('char'), make_field()) + self.assertEqualFields(self.get_fields('char'), make_field()) def test_required(self): """ Required fields should be flagged (so they can be fill-required) """ - self.assertEqual(self.get_fields('char.required'), make_field(required=True)) + self.assertEqualFields(self.get_fields('char.required'), make_field(required=True)) def test_readonly(self): """ Readonly fields should be filtered out""" - self.assertEqual(self.get_fields('char.readonly'), [ID_FIELD]) + self.assertEqualFields(self.get_fields('char.readonly'), [ID_FIELD, DISPLAY_NAME_FIELD]) def test_readonly_states(self): """ Readonly fields with states should not be filtered out""" - self.assertEqual(self.get_fields('char.states'), make_field()) + self.assertEqualFields(self.get_fields('char.states'), make_field()) def test_readonly_states_noreadonly(self): """ Readonly fields with states having nothing to do with readonly should still be filtered out""" - self.assertEqual(self.get_fields('char.noreadonly'), [ID_FIELD]) + self.assertEqualFields(self.get_fields('char.noreadonly'), [ID_FIELD, DISPLAY_NAME_FIELD]) def test_readonly_states_stillreadonly(self): """ Readonly fields with readonly states leaving them readonly always... filtered out""" - self.assertEqual(self.get_fields('char.stillreadonly'), [ID_FIELD]) + self.assertEqualFields(self.get_fields('char.stillreadonly'), [ID_FIELD, DISPLAY_NAME_FIELD]) def test_m2o(self): """ M2O fields should allow import of themselves (name_get), their id and their xid""" - self.assertEqual(self.get_fields('m2o'), make_field(fields=[ + self.assertEqualFields(self.get_fields('m2o'), make_field(fields=[ {'id': 'value', 'name': 'id', 'string': 'External ID', 'required': False, 'fields': []}, {'id': 'value', 'name': '.id', 'string': 'Database ID', 'required': False, 'fields': []}, ])) @@ -55,19 +79,20 @@ class test_basic_fields(TransactionCase): required as well (the client has to handle that: requiredness is id-based) """ - self.assertEqual(self.get_fields('m2o.required'), make_field(required=True, fields=[ + self.assertEqualFields(self.get_fields('m2o.required'), make_field(required=True, fields=[ {'id': 'value', 'name': 'id', 'string': 'External ID', 'required': True, 'fields': []}, {'id': 'value', 'name': '.id', 'string': 'Database ID', 'required': True, 'fields': []}, ])) -class test_o2m(TransactionCase): +class test_o2m(BaseImportCase): def get_fields(self, field): return self.registry('base_import.import')\ .get_fields(self.cr, self.uid, 'base_import.tests.models.' + field) def test_shallow(self): - self.assertEqual(self.get_fields('o2m'), make_field(fields=[ - {'id': 'id', 'name': 'id', 'string': 'External ID', 'required': False, 'fields': []}, + self.assertEqualFields(self.get_fields('o2m'), make_field(fields=[ + ID_FIELD, + DISPLAY_NAME_FIELD, # FIXME: should reverse field be ignored? {'id': 'parent_id', 'name': 'parent_id', 'string': 'unknown', 'required': False, 'fields': [ {'id': 'parent_id', 'name': 'id', 'string': 'External ID', 'required': False, 'fields': []}, @@ -224,7 +249,8 @@ class test_preview(TransactionCase): self.assertEqual(result['headers'], ['name', 'Some Value', 'Counter']) # Order depends on iteration order of fields_get self.assertItemsEqual(result['fields'], [ - {'id': 'id', 'name': 'id', 'string': 'External ID', 'required':False, 'fields': []}, + ID_FIELD, + DISPLAY_NAME_FIELD, {'id': 'name', 'name': 'name', 'string': 'Name', 'required':False, 'fields': []}, {'id': 'somevalue', 'name': 'somevalue', 'string': 'Some Value', 'required':True, 'fields': []}, {'id': 'othervalue', 'name': 'othervalue', 'string': 'Other Variable', 'required':False, 'fields': []}, |
