Setting a default value for an integer that is greater than that allowed by a 32-bit integer raises an error when we save a new record so it isn't clear that the issue comes from the default value Steps to reproduce: 1. Install Contacts and Studio 2. Go to Contacts and open any contact 3. Toggle Studio and add an integer field in the view 4. In the Studio sidebar, set the default value to 3 000 000 000 5. Save and close Studio 6. Create a new contact, give it a name and try to save the record 7. An error is thrown Solution: Raise an error if we set an integer field's default value out of the bounds of a 32-bit integer opw-3360160 closes odoo/odoo#141339 X-original-commit: 85978e4c6fb1199f5e6ec4dce5c45b9f09be9b77 Signed-off-by: Guillaume Merlin (megu) <megu@odoo.com>
158 lines
8.0 KiB
Python
158 lines
8.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.exceptions import ValidationError
|
|
from odoo.tests.common import TransactionCase
|
|
|
|
|
|
class TestIrDefault(TransactionCase):
|
|
|
|
def test_defaults(self):
|
|
""" check the mechanism of user-defined defaults """
|
|
companyA = self.env.company
|
|
companyB = companyA.create({'name': 'CompanyB'})
|
|
user1 = self.env.user
|
|
user2 = user1.create({'name': 'u2', 'login': 'u2'})
|
|
user3 = user1.create({'name': 'u3', 'login': 'u3',
|
|
'company_id': companyB.id,
|
|
'company_ids': companyB.ids})
|
|
|
|
# create some default value for some model
|
|
IrDefault1 = self.env['ir.default']
|
|
IrDefault2 = IrDefault1.with_user(user2)
|
|
IrDefault3 = IrDefault1.with_user(user3)
|
|
|
|
# set a default value for all users
|
|
IrDefault1.search([('field_id.model', '=', 'res.partner')]).unlink()
|
|
IrDefault1.set('res.partner', 'ref', 'GLOBAL', user_id=False, company_id=False)
|
|
self.assertEqual(IrDefault1._get_model_defaults('res.partner'), {'ref': 'GLOBAL'},
|
|
"Can't retrieve the created default value for all users.")
|
|
self.assertEqual(IrDefault2._get_model_defaults('res.partner'), {'ref': 'GLOBAL'},
|
|
"Can't retrieve the created default value for all users.")
|
|
self.assertEqual(IrDefault3._get_model_defaults('res.partner'), {'ref': 'GLOBAL'},
|
|
"Can't retrieve the created default value for all users.")
|
|
|
|
# set a default value for current company (behavior of 'set default' from debug mode)
|
|
IrDefault1.set('res.partner', 'ref', 'COMPANY', user_id=False, company_id=True)
|
|
self.assertEqual(IrDefault1._get_model_defaults('res.partner'), {'ref': 'COMPANY'},
|
|
"Can't retrieve the created default value for company.")
|
|
self.assertEqual(IrDefault2._get_model_defaults('res.partner'), {'ref': 'COMPANY'},
|
|
"Can't retrieve the created default value for company.")
|
|
self.assertEqual(IrDefault3._get_model_defaults('res.partner'), {'ref': 'GLOBAL'},
|
|
"Unexpected default value for company.")
|
|
|
|
# set a default value for current user (behavior of 'set default' from debug mode)
|
|
IrDefault2.set('res.partner', 'ref', 'USER', user_id=True, company_id=True)
|
|
self.assertEqual(IrDefault1._get_model_defaults('res.partner'), {'ref': 'COMPANY'},
|
|
"Can't retrieve the created default value for user.")
|
|
self.assertEqual(IrDefault2._get_model_defaults('res.partner'), {'ref': 'USER'},
|
|
"Unexpected default value for user.")
|
|
self.assertEqual(IrDefault3._get_model_defaults('res.partner'), {'ref': 'GLOBAL'},
|
|
"Unexpected default value for company.")
|
|
|
|
# check default values on partners
|
|
default1 = IrDefault1.env['res.partner'].default_get(['ref']).get('ref')
|
|
self.assertEqual(default1, 'COMPANY', "Wrong default value.")
|
|
default2 = IrDefault2.env['res.partner'].default_get(['ref']).get('ref')
|
|
self.assertEqual(default2, 'USER', "Wrong default value.")
|
|
default3 = IrDefault3.env['res.partner'].default_get(['ref']).get('ref')
|
|
self.assertEqual(default3, 'GLOBAL', "Wrong default value.")
|
|
|
|
def test_conditions(self):
|
|
""" check user-defined defaults with condition """
|
|
IrDefault = self.env['ir.default']
|
|
|
|
# default without condition
|
|
IrDefault.search([('field_id.model', '=', 'res.partner')]).unlink()
|
|
IrDefault.set('res.partner', 'ref', 'X')
|
|
self.assertEqual(IrDefault._get_model_defaults('res.partner'),
|
|
{'ref': 'X'})
|
|
self.assertEqual(IrDefault._get_model_defaults('res.partner', condition='name=Agrolait'),
|
|
{})
|
|
|
|
# default with a condition
|
|
IrDefault.search([('field_id.model', '=', 'res.partner.title')]).unlink()
|
|
IrDefault.set('res.partner.title', 'shortcut', 'X')
|
|
IrDefault.set('res.partner.title', 'shortcut', 'Mr', condition='name=Mister')
|
|
self.assertEqual(IrDefault._get_model_defaults('res.partner.title'),
|
|
{'shortcut': 'X'})
|
|
self.assertEqual(IrDefault._get_model_defaults('res.partner.title', condition='name=Miss'),
|
|
{})
|
|
self.assertEqual(IrDefault._get_model_defaults('res.partner.title', condition='name=Mister'),
|
|
{'shortcut': 'Mr'})
|
|
|
|
def test_invalid(self):
|
|
""" check error cases with 'ir.default' """
|
|
IrDefault = self.env['ir.default']
|
|
with self.assertRaises(ValidationError):
|
|
IrDefault.set('unknown_model', 'unknown_field', 42)
|
|
with self.assertRaises(ValidationError):
|
|
IrDefault.set('res.partner', 'unknown_field', 42)
|
|
with self.assertRaises(ValidationError):
|
|
IrDefault.set('res.partner', 'lang', 'some_LANG')
|
|
with self.assertRaises(ValidationError):
|
|
IrDefault.set('res.partner', 'partner_latitude', 'foo')
|
|
with self.assertRaises(ValidationError):
|
|
IrDefault.set('res.partner', 'color', 2147483648)
|
|
|
|
def test_removal(self):
|
|
""" check defaults for many2one with their value being removed """
|
|
IrDefault = self.env['ir.default']
|
|
IrDefault.search([('field_id.model', '=', 'res.partner')]).unlink()
|
|
|
|
# set a record as a default value
|
|
title = self.env['res.partner.title'].create({'name': 'President'})
|
|
IrDefault.set('res.partner', 'title', title.id)
|
|
self.assertEqual(IrDefault._get_model_defaults('res.partner'), {'title': title.id})
|
|
|
|
# delete the record, and check the presence of the default value
|
|
title.unlink()
|
|
self.assertEqual(IrDefault._get_model_defaults('res.partner'), {})
|
|
|
|
def test_multi_company_defaults(self):
|
|
"""Check defaults in multi-company environment."""
|
|
company_a = self.env["res.company"].create({"name": "C_A"})
|
|
company_b = self.env["res.company"].create({"name": "C_B"})
|
|
company_a_b = (company_a + company_b)
|
|
company_b_a = (company_b + company_a)
|
|
multi_company_user = self.env['res.users'].create({
|
|
'name': 'u2', 'login': 'u2',
|
|
'company_id': company_a.id,
|
|
'company_ids': company_a_b.ids,
|
|
})
|
|
IrDefault = self.env["ir.default"].with_user(multi_company_user)
|
|
IrDefault.with_context(allowed_company_ids=company_a.ids).set(
|
|
'res.partner', 'ref', 'CADefault', user_id=True, company_id=True)
|
|
IrDefault.with_context(allowed_company_ids=company_b.ids).set(
|
|
'res.partner', 'ref', 'CBDefault', user_id=True, company_id=True)
|
|
self.assertEqual(
|
|
IrDefault._get_model_defaults('res.partner')['ref'],
|
|
'CADefault',
|
|
)
|
|
self.assertEqual(
|
|
IrDefault.with_context(allowed_company_ids=company_a.ids)._get_model_defaults('res.partner')['ref'],
|
|
'CADefault',
|
|
)
|
|
self.assertEqual(
|
|
IrDefault.with_context(allowed_company_ids=company_b.ids)._get_model_defaults('res.partner')['ref'],
|
|
'CBDefault',
|
|
)
|
|
self.assertEqual(
|
|
IrDefault.with_context(allowed_company_ids=company_a_b.ids)._get_model_defaults('res.partner')['ref'],
|
|
'CADefault',
|
|
)
|
|
self.assertEqual(
|
|
IrDefault.with_context(allowed_company_ids=company_b_a.ids)._get_model_defaults('res.partner')['ref'],
|
|
'CBDefault',
|
|
)
|
|
|
|
def test_json_format_invalid(self):
|
|
""" check the _check_json_format constraint """
|
|
IrDefault = self.env['ir.default']
|
|
field_id = self.env['ir.model.fields'].search([('model', '=', 'res.partner'), ('name', '=', 'ref')])
|
|
with self.assertRaises(ValidationError):
|
|
IrDefault.create({
|
|
'field_id': field_id.id,
|
|
'json_value': '{"name":"John", }',
|
|
})
|