diff --git a/openerp/addons/test_new_api/ir.model.access.csv b/openerp/addons/test_new_api/ir.model.access.csv
index a8d921c30ae..c39eea77611 100644
--- a/openerp/addons/test_new_api/ir.model.access.csv
+++ b/openerp/addons/test_new_api/ir.model.access.csv
@@ -1,6 +1,4 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-access_test_new_api_alpha,access_test_new_api_alpha,model_test_new_api_alpha,,1,0,0,0
-access_test_new_api_bravo,access_test_new_api_bravo,model_test_new_api_bravo,,1,0,0,0
access_category,test_new_api_category,test_new_api.model_test_new_api_category,,1,1,1,1
access_discussion,test_new_api_discussion,test_new_api.model_test_new_api_discussion,,1,1,1,1
access_message,test_new_api_message,test_new_api.model_test_new_api_message,,1,1,1,1
@@ -8,8 +6,8 @@ access_emailmessage,test_new_api_emailmessage,test_new_api.model_test_new_api_em
access_multi,test_new_api_multi,test_new_api.model_test_new_api_multi,,1,1,1,1
access_multi_line,test_new_api_multi_line,test_new_api.model_test_new_api_multi_line,,1,1,1,1
access_mixed,test_new_api_mixed,test_new_api.model_test_new_api_mixed,,1,1,1,1
-access_test_function_noinfiniterecursion,access_test_function_noinfiniterecursion,model_test_old_api_function_noinfiniterecursion,,1,1,1,1
-access_test_function_counter,access_test_function_counter,model_test_old_api_function_counter,,1,1,1,1
access_domain_bool,access_domain_bool,model_domain_bool,,1,1,1,1
access_test_new_api_foo,access_test_new_api_foo,model_test_new_api_foo,,1,1,1,1
access_test_new_api_bar,access_test_new_api_bar,model_test_new_api_bar,,1,1,1,1
+access_test_new_api_related,access_test_new_api_related,model_test_new_api_related,,1,1,1,1
+access_test_new_api_company,access_test_new_api_company,model_test_new_api_company,,1,1,1,1
diff --git a/openerp/addons/test_new_api/models.py b/openerp/addons/test_new_api/models.py
index 7023b2c8d1b..bd0c9b250cb 100644
--- a/openerp/addons/test_new_api/models.py
+++ b/openerp/addons/test_new_api/models.py
@@ -2,78 +2,9 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import datetime
-from openerp.exceptions import AccessError
-##############################################################################
-#
-# OLD API
-#
-##############################################################################
-from openerp.osv import osv, fields
-
-
-class Alpha(osv.Model):
- _name = 'test_new_api.alpha'
- _columns = {
- 'name': fields.char(),
- }
-
-class Bravo(osv.Model):
- _name = 'test_new_api.bravo'
- _columns = {
- 'alpha_id': fields.many2one('test_new_api.alpha'),
- # a related field with a non-trivial path
- 'alpha_name': fields.related('alpha_id', 'name', type='char'),
- # a related field with a single field
- 'related_alpha_id': fields.related('alpha_id', type='many2one', obj='test_new_api.alpha'),
- # a related field with a single field that is also a related field!
- 'related_related_alpha_id': fields.related('related_alpha_id', type='many2one', obj='test_new_api.alpha'),
- }
-
-
-class TestFunctionCounter(osv.Model):
- _name = 'test_old_api.function_counter'
-
- def _compute_cnt(self, cr, uid, ids, fname, arg, context=None):
- res = {}
- for cnt in self.browse(cr, uid, ids, context=context):
- res[cnt.id] = cnt.access and cnt.cnt + 1 or 0
- return res
-
- _columns = {
- 'access': fields.datetime('Datetime Field'),
- 'cnt': fields.function(
- _compute_cnt, type='integer', string='Function Field', store=True),
- }
-
-
-class TestFunctionNoInfiniteRecursion(osv.Model):
- _name = 'test_old_api.function_noinfiniterecursion'
-
- def _compute_f1(self, cr, uid, ids, fname, arg, context=None):
- res = {}
- for tf in self.browse(cr, uid, ids, context=context):
- res[tf.id] = 'create' in tf.f0 and 'create' or 'write'
- cntobj = self.pool['test_old_api.function_counter']
- cnt_id = self.pool['ir.model.data'].xmlid_to_res_id(
- cr, uid, 'test_new_api.c1')
- cntobj.write(
- cr, uid, cnt_id, {'access': datetime.datetime.now()},
- context=context)
- return res
-
- _columns = {
- 'f0': fields.char('Char Field'),
- 'f1': fields.function(
- _compute_f1, type='char', string='Function Field', store=True),
- }
-
-##############################################################################
-#
-# NEW API
-#
-##############################################################################
from openerp import models, fields, api, _
+from openerp.exceptions import AccessError
class Category(models.Model):
@@ -117,6 +48,7 @@ class Category(models.Model):
raise AccessError('Sorry')
return super(Category, self).read(fields=fields, load=load)
+
class Discussion(models.Model):
_name = 'test_new_api.discussion'
@@ -221,6 +153,7 @@ class EmailMessage(models.Model):
required=True, ondelete='cascade')
email_to = fields.Char('To')
+
class Multi(models.Model):
""" Model for testing multiple onchange methods in cascade that modify a
one2many field several times.
@@ -314,6 +247,15 @@ class Bar(models.Model):
bar.foo = self.env['test_new_api.foo'].search([('name', '=', bar.name)], limit=1)
+class Related(models.Model):
+ _name = 'test_new_api.related'
+
+ name = fields.Char()
+ # related fields with a single field
+ related_name = fields.Char(related='name')
+ related_related_name = fields.Char(related='related_name')
+
+
class ComputeInverse(models.Model):
_name = 'test_new_api.compute.inverse'
@@ -332,3 +274,9 @@ class ComputeInverse(models.Model):
self.counts['inverse'] += 1
for record in self:
record.foo = record.bar
+
+
+class CompanyDependent(models.Model):
+ _name = 'test_new_api.company'
+
+ foo = fields.Char(company_dependent=True)
diff --git a/openerp/addons/test_new_api/tests/__init__.py b/openerp/addons/test_new_api/tests/__init__.py
index 81aead1b05d..eef5f0f4aea 100644
--- a/openerp/addons/test_new_api/tests/__init__.py
+++ b/openerp/addons/test_new_api/tests/__init__.py
@@ -1,10 +1,8 @@
# -*- coding: utf-8 -*-
-from . import test_related
from . import test_new_fields
from . import test_onchange
from . import test_field_conversions
from . import test_attributes
from . import test_ui
-from . import test_no_infinite_recursion
from . import test_domain
diff --git a/openerp/addons/test_new_api/tests/test_new_fields.py b/openerp/addons/test_new_api/tests/test_new_fields.py
index 6b3778bee52..7cc018744f8 100644
--- a/openerp/addons/test_new_api/tests/test_new_fields.py
+++ b/openerp/addons/test_new_api/tests/test_new_fields.py
@@ -8,7 +8,7 @@ from openerp.tests import common
from openerp.tools import mute_logger
-class TestNewFields(common.TransactionCase):
+class TestFields(common.TransactionCase):
def test_00_basics(self):
""" test accessing new fields """
@@ -405,6 +405,26 @@ class TestNewFields(common.TransactionCase):
discussion_field = discussion.fields_get(['name'])['name']
self.assertEqual(message_field['help'], discussion_field['help'])
+ def test_25_related_single(self):
+ """ test related fields with a single field in the path. """
+ record = self.env['test_new_api.related'].create({'name': 'A'})
+ self.assertEqual(record.related_name, record.name)
+ self.assertEqual(record.related_related_name, record.name)
+
+ # check searching on related fields
+ records0 = record.search([('name', '=', 'A')])
+ self.assertIn(record, records0)
+ records1 = record.search([('related_name', '=', 'A')])
+ self.assertEqual(records1, records0)
+ records2 = record.search([('related_related_name', '=', 'A')])
+ self.assertEqual(records2, records0)
+
+ # check writing on related fields
+ record.write({'related_name': 'B'})
+ self.assertEqual(record.name, 'B')
+ record.write({'related_related_name': 'C'})
+ self.assertEqual(record.name, 'C')
+
def test_25_related_multi(self):
""" test write() on several related fields based on a common computed field. """
foo = self.env['test_new_api.foo'].create({'name': 'A', 'value1': 1, 'value2': 2})
@@ -427,6 +447,38 @@ class TestNewFields(common.TransactionCase):
self.assertEqual(getattr(user, field), getattr(partner, field))
self.assertEqual(user[field], partner[field])
+ def test_27_company_dependent(self):
+ """ test company-dependent fields. """
+ # consider three companies
+ company0 = self.env.ref('base.main_company')
+ company1 = self.env['res.company'].create({'name': 'A', 'parent_id': company0.id})
+ company2 = self.env['res.company'].create({'name': 'B', 'parent_id': company1.id})
+ # create one user per company
+ user0 = self.env['res.users'].create({'name': 'Foo', 'login': 'foo',
+ 'company_id': company0.id, 'company_ids': []})
+ user1 = self.env['res.users'].create({'name': 'Bar', 'login': 'bar',
+ 'company_id': company1.id, 'company_ids': []})
+ user2 = self.env['res.users'].create({'name': 'Baz', 'login': 'baz',
+ 'company_id': company2.id, 'company_ids': []})
+ # create a default value for the company-dependent field
+ field = self.env['ir.model.fields'].search([('model', '=', 'test_new_api.company'),
+ ('name', '=', 'foo')])
+ self.env['ir.property'].create({'name': 'foo', 'fields_id': field.id,
+ 'value': 'default', 'type': 'char'})
+
+ # create/modify a record, and check the value for each user
+ record = self.env['test_new_api.company'].create({'foo': 'main'})
+ record.invalidate_cache()
+ self.assertEqual(record.sudo(user0).foo, 'main')
+ self.assertEqual(record.sudo(user1).foo, 'default')
+ self.assertEqual(record.sudo(user2).foo, 'default')
+
+ record.sudo(user1).foo = 'alpha'
+ record.invalidate_cache()
+ self.assertEqual(record.sudo(user0).foo, 'main')
+ self.assertEqual(record.sudo(user1).foo, 'alpha')
+ self.assertEqual(record.sudo(user2).foo, 'default')
+
def test_30_read(self):
""" test computed fields as returned by read(). """
discussion = self.env.ref('test_new_api.discussion_0')
@@ -545,6 +597,57 @@ class TestNewFields(common.TransactionCase):
self.assertIn(message, discussion.important_messages)
+class TestHtmlField(common.TransactionCase):
+
+ def setUp(self):
+ super(TestHtmlField, self).setUp()
+ self.model = self.env['test_new_api.mixed']
+
+ def test_00_sanitize(self):
+ self.assertEqual(self.model._fields['comment1'].sanitize, False)
+ self.assertEqual(self.model._fields['comment2'].sanitize, True)
+ self.assertEqual(self.model._fields['comment2'].strip_classes, False)
+ self.assertEqual(self.model._fields['comment3'].sanitize, True)
+ self.assertEqual(self.model._fields['comment3'].strip_classes, True)
+
+ some_ugly_html = """Oops this should maybe be sanitized
+% if object.some_field and not object.oriented:
+
+ % if object.other_field:
+
+ ${object.mako_thing}
+ |
+ |
+
+ This is some html.
+
+ % endif
+
+%if object.dummy_field:
+ Youpie
+%endif"""
+
+ record = self.model.create({
+ 'comment1': some_ugly_html,
+ 'comment2': some_ugly_html,
+ 'comment3': some_ugly_html,
+ 'comment4': some_ugly_html,
+ })
+
+ self.assertEqual(record.comment1, some_ugly_html, 'Error in HTML field: content was sanitized but field has sanitize=False')
+
+ self.assertIn('