diff --git a/openerp/addons/test_new_api/demo_data.xml b/openerp/addons/test_new_api/demo_data.xml index 17ac07718b3..cf5adb950a7 100644 --- a/openerp/addons/test_new_api/demo_data.xml +++ b/openerp/addons/test_new_api/demo_data.xml @@ -26,8 +26,6 @@ This is a much longer message - - 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('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('
-