Files
odoo_source/odoo/addons/base/tests/test_ir_values.py
T
Simon Lejeune fcbfe47695 [FIX] base: lighten default values validation in ir.values
Rev acd8c4de18 prevents the creation of default values for fields that
are not defined. This is too restrictive because of the following
points:
    - one may want to create default values for fields that are yet to be
      defined
    - "fake" default fields used in res.config that do not point to real
      fields

The initial scenario this revision was trying to fix is the creation of
wrong default values through studio. This scenario is still fixed, as it
concerns the last `except` branch.

The tests have been updated to reflect these changes.
2017-03-22 12:48:56 +01:00

100 lines
5.9 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import tools
from odoo.exceptions import ValidationError
from odoo.tests.common import TransactionCase
class TestIrValues(TransactionCase):
def test_defaults(self):
# Create some default value for some model, for all users.
ir_values = self.env['ir.values']
ir_values.set_default('res.partner', 'ref', 'X11')
ir_values.set_default('res.partner.title', 'shortcut', 'Mr', condition='name=Mister')
# Retrieve them: ds is a list of triplets (id, name, value)
ds = ir_values.get_defaults('res.partner')
d = next((d for d in ds if d[1] == 'ref'), None)
self.assertTrue(d, "At least one value should be retrieved for this model.")
self.assertEqual(d[2], 'X11', "Can't retrieve the created default value.")
ds = ir_values.get_defaults('res.partner.title')
d = next((d for d in ds if d[1] == 'shortcut'), None)
self.assertFalse(d, "No value should be retrieved, the condition is not met.")
ds = ir_values.get_defaults('res.partner.title', condition="name=Miss")
d = next((d for d in ds if d[1] == 'shortcut'), None)
self.assertFalse(d, "No value should be retrieved, the condition is not met.")
ds = ir_values.get_defaults('res.partner.title', condition="name=Mister")
d = next((d for d in ds if d[1] == 'shortcut'), None)
self.assertTrue(d, "At least one value should be retrieved.")
self.assertEqual(d[2], 'Mr', "Can't retrieve the created default value.")
# Do it again but for a specific user.
ir_values.set_default('res.partner', 'ref', '007', for_all_users=False)
# Retrieve it and check it is the one for the current user.
ds = ir_values.get_defaults('res.partner')
d = next((d for d in ds if d[1] == 'ref'), None)
self.assertTrue(d, "At least one value should be retrieved for this model.")
self.assertEqual(d[2], '007', "Can't retrieve the created default value.")
# create valid but unusable defaults, a ValidationError should not be thrown
with tools.mute_logger('odoo.addons.base.ir.ir_values'):
ir_values.set_default('unknown_model', 'unknown_field', 42)
ir_values.set_default('res.partner', 'unknown_field', 42)
# create invalid defaults
with self.assertRaises(ValidationError):
ir_values.set_default('res.partner', 'lang', 'some_LANG')
with self.assertRaises(ValidationError):
ir_values.set_default('res.partner', 'credit_limit', 'foo')
def test_actions(self):
# Create some action bindings for a model.
act_id_1 = self.ref('base.act_values_form_action')
act_id_2 = self.ref('base.act_values_form_defaults')
act_id_3 = self.ref('base.action_res_company_form')
ir_values = self.env['ir.values']
ir_values.set_action('OnDblClick Action', action_slot='tree_but_open', model='res.partner', action='ir.actions.act_window,%d' % act_id_1, res_id=False)
ir_values.set_action('OnDblClick Action 2', action_slot='tree_but_open', model='res.partner', action='ir.actions.act_window,%d' % act_id_2, res_id=False)
ir_values.set_action('Side Wizard', action_slot='client_action_multi', model='res.partner', action='ir.actions.act_window,%d' % act_id_3, res_id=False)
reports = self.env['ir.actions.report.xml'].search([])
report_id = next(report.id for report in reports if not report.groups_id)
ir_values.set_action('Nice Report', action_slot='client_print_multi', model='res.partner', action='ir.actions.report.xml,%d' % report_id, res_id=False)
# Replace one action binding to set a new name.
ir_values.set_action('OnDblClick Action New', action_slot='tree_but_open', model='res.partner', action='ir.actions.act_window,%d' % act_id_1, res_id=False)
# Retrieve the action bindings and check they're correct
actions = ir_values.get_actions(action_slot='tree_but_open', model='res.partner', res_id=False)
self.assertEqual(len(actions), 2, "Mismatching number of bound actions")
# first action
self.assertEqual(len(actions[0]), 3, "Malformed action definition")
self.assertEqual(actions[0][1], 'OnDblClick Action 2', 'Bound action does not match definition')
self.assertTrue(isinstance(actions[0][2], dict) and actions[0][2]['id'] == act_id_2,
'Bound action does not match definition')
# second action - this ones comes last because it was re-created with a different name
self.assertEqual(len(actions[1]), 3, "Malformed action definition")
self.assertEqual(actions[1][1], 'OnDblClick Action New', 'Re-Registering an action should replace it')
self.assertTrue(isinstance(actions[1][2], dict) and actions[1][2]['id'] == act_id_1,
'Bound action does not match definition')
actions = ir_values.get_actions(action_slot='client_action_multi', model='res.partner', res_id=False)
self.assertEqual(len(actions), 1, "Mismatching number of bound actions")
self.assertEqual(len(actions[0]), 3, "Malformed action definition")
self.assertEqual(actions[0][1], 'Side Wizard', 'Bound action does not match definition')
self.assertTrue(isinstance(actions[0][2], dict) and actions[0][2]['id'] == act_id_3,
'Bound action does not match definition')
actions = ir_values.get_actions(action_slot='client_print_multi', model='res.partner', res_id=False)
self.assertEqual(len(actions), 1, "Mismatching number of bound actions")
self.assertEqual(len(actions[0]), 3, "Malformed action definition")
self.assertEqual(actions[0][1], 'Nice Report', 'Bound action does not match definition')
self.assertTrue(isinstance(actions[0][2], dict) and actions[0][2]['id'] == report_id,
'Bound action does not match definition')