summaryrefslogtreecommitdiff
path: root/odoo/addons
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-08-20 12:17:04 +0200
committerChristophe Simonis <chs@odoo.com>2019-08-20 12:17:04 +0200
commitf26de445e5579913e27ea6a630bcee6d40eefc7d (patch)
tree8b8e06be8a9d5fd3c1e5c31634611127446b9948 /odoo/addons
parentbc6accc5688d3c38a35949751779f808e9c2063f (diff)
parent6f55fd65da8c50d36ca97654a920fb075076f125 (diff)
[MERGE] forward port branch saas-12.3 up to 6f55fd65da8
Diffstat (limited to 'odoo/addons')
-rw-r--r--odoo/addons/base/data/res.lang.csv1
-rw-r--r--odoo/addons/base/models/ir_rule.py4
-rw-r--r--odoo/addons/base/models/res_users.py2
-rw-r--r--odoo/addons/base/tests/test_float.py2
-rw-r--r--odoo/addons/base/views/ir_module_views.xml2
-rw-r--r--odoo/addons/test_access_rights/ir.model.access.csv1
-rw-r--r--odoo/addons/test_access_rights/models.py12
-rw-r--r--odoo/addons/test_access_rights/tests/test_ir_rules.py38
8 files changed, 55 insertions, 7 deletions
diff --git a/odoo/addons/base/data/res.lang.csv b/odoo/addons/base/data/res.lang.csv
index 57b42390723..0d7ce5905b9 100644
--- a/odoo/addons/base/data/res.lang.csv
+++ b/odoo/addons/base/data/res.lang.csv
@@ -51,6 +51,7 @@ base.lang_my,"Burmese / ဗမာစာ",my_MM,my,"Left-to-Right","[3,3]",".",",
"base.lang_nb_NO","Norwegian Bokmål / Norsk bokmål","nb_NO","nb_NO","Left-to-Right","[3,0]",","," ","%d. %b %Y","%H:%M:%S","True","1"
"base.lang_fa_IR","Persian / فارس","fa_IR","fa","Right-to-Left","[3,0]",".",",","%Y/%m/%d","%H:%M:%S","True","6"
"base.lang_pl","Polish / Język polski","pl_PL","pl","Left-to-Right","[]",",",,"%d.%m.%Y","%H:%M:%S","True","1"
+"base.lang_pt_AO","Portuguese (AO) / Português (AO)","pt_AO","pt_AO","Left-to-Right","[]",",",,"%d-%m-%Y","%H:%M:%S","True","1"
"base.lang_pt_BR","Portuguese (BR) / Português (BR)","pt_BR","pt_BR","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True","7"
"base.lang_pt","Portuguese / Português","pt_PT","pt","Left-to-Right","[]",",",,"%d-%m-%Y","%H:%M:%S","True","1"
"base.lang_ro","Romanian / română","ro_RO","ro","Left-to-Right","[3,0]",",",".","%d.%m.%Y","%H:%M:%S","True","1"
diff --git a/odoo/addons/base/models/ir_rule.py b/odoo/addons/base/models/ir_rule.py
index 6f6a0d9863f..4ce37aedd18 100644
--- a/odoo/addons/base/models/ir_rule.py
+++ b/odoo/addons/base/models/ir_rule.py
@@ -48,8 +48,10 @@ class IrRule(models.Model):
by the user with the switch company menu. These companies are
filtered and trusted.
"""
+ # use an empty context for 'user' to make the domain evaluation
+ # independent from the context
return {
- 'user': self.env.user,
+ 'user': self.env.user.with_context({}),
'time': time,
'company_ids': self.env.companies.ids,
}
diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py
index 1df7c1ca38b..204ce97f6fe 100644
--- a/odoo/addons/base/models/res_users.py
+++ b/odoo/addons/base/models/res_users.py
@@ -883,7 +883,7 @@ class Users(models.Model):
cfg = self.env['ir.config_parameter'].sudo()
min_failures = int(cfg.get_param('base.login_cooldown_after', 5))
if min_failures == 0:
- return True
+ return False
delay = int(cfg.get_param('base.login_cooldown_duration', 60))
return failures >= min_failures and (datetime.datetime.now() - previous) < datetime.timedelta(seconds=delay)
diff --git a/odoo/addons/base/tests/test_float.py b/odoo/addons/base/tests/test_float.py
index 4dbf1f5f139..5bfdbea0a92 100644
--- a/odoo/addons/base/tests/test_float.py
+++ b/odoo/addons/base/tests/test_float.py
@@ -27,6 +27,8 @@ class TestFloatPrecision(TransactionCase):
try_round(0.0049,'0.00') # 0.0049 is closer to 0 than to 0.01, so should round down
try_round(0.005,'0.01') # the rule is to round half away from zero
try_round(-0.005,'-0.01') # the rule is to round half away from zero
+ try_round(6.6 * 0.175, '1.16') # 6.6 * 0.175 is rounded to 1.15 with epsilon = 53
+ try_round(-6.6 * 0.175, '-1.16')
def try_zero(amount, expected):
self.assertEqual(currency.is_zero(amount), expected,
diff --git a/odoo/addons/base/views/ir_module_views.xml b/odoo/addons/base/views/ir_module_views.xml
index d1b84b6e39a..afddfa1f825 100644
--- a/odoo/addons/base/views/ir_module_views.xml
+++ b/odoo/addons/base/views/ir_module_views.xml
@@ -165,7 +165,7 @@
<div class="oe_module_vignette">
<t t-set="installed" t-value="record.state.raw_value == 'installed'"/>
<div class="o_dropdown_kanban dropdown" tabindex="-1">
- <a class="dropdown-toggle o-no-caret btn" data-toggle="dropdown" href="#" role="button" aria-label="Dropdown menu" title="Dropdown menu">
+ <a class="dropdown-toggle o-no-caret btn" data-toggle="dropdown" data-display="static" href="#" role="button" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu" aria-labelledby="dLabel">
diff --git a/odoo/addons/test_access_rights/ir.model.access.csv b/odoo/addons/test_access_rights/ir.model.access.csv
index 20310a5d0da..9edd8503b72 100644
--- a/odoo/addons/test_access_rights/ir.model.access.csv
+++ b/odoo/addons/test_access_rights/ir.model.access.csv
@@ -2,3 +2,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_test_access_right_some_obj,access_test_access_right_some_obj,model_test_access_right_some_obj,,1,1,1,1
access_test_access_right_container,access_test_access_right_container,model_test_access_right_container,,1,1,1,1
access_test_access_right_parent,access_test_access_right_parent,model_test_access_right_parent,,1,1,1,1
+access_test_access_right_obj_categ,access_test_access_right_obj_categ,model_test_access_right_obj_categ,,1,1,1,1
diff --git a/odoo/addons/test_access_rights/models.py b/odoo/addons/test_access_rights/models.py
index 4dd8c034bac..bef14bad2c2 100644
--- a/odoo/addons/test_access_rights/models.py
+++ b/odoo/addons/test_access_rights/models.py
@@ -8,6 +8,7 @@ class SomeObj(models.Model):
_description = 'Object For Test Access Right'
val = fields.Integer()
+ categ_id = fields.Many2one('test_access_right.obj_categ')
company_id = fields.Many2one('res.company')
forbidden = fields.Integer(
groups='test_access_rights.test_group,!base.group_no_one,base.group_user,!base.group_public',
@@ -28,3 +29,14 @@ class Parent(models.Model):
_inherits = {'test_access_right.some_obj': 'obj_id'}
obj_id = fields.Many2one('test_access_right.some_obj', required=True, ondelete='restrict')
+
+class ObjCateg(models.Model):
+ _name = 'test_access_right.obj_categ'
+ _description = "Context dependent searchable model"
+
+ name = fields.Char(required=True)
+
+ def search(self, args, **kwargs):
+ if self.env.context.get('only_media'):
+ args += [('name', '=', 'Media')]
+ return super(ObjCateg, self).search(args, **kwargs)
diff --git a/odoo/addons/test_access_rights/tests/test_ir_rules.py b/odoo/addons/test_access_rights/tests/test_ir_rules.py
index 9cb2f3ebda2..b10d6c22200 100644
--- a/odoo/addons/test_access_rights/tests/test_ir_rules.py
+++ b/odoo/addons/test_access_rights/tests/test_ir_rules.py
@@ -8,10 +8,11 @@ class TestRules(TransactionCase):
def setUp(self):
super(TestRules, self).setUp()
- self.id1 = self.env['test_access_right.some_obj']\
- .create({'val': 1}).id
- self.id2 = self.env['test_access_right.some_obj']\
- .create({'val': -1}).id
+ ObjCateg = self.env['test_access_right.obj_categ']
+ SomeObj = self.env['test_access_right.some_obj']
+ self.categ1 = ObjCateg.create({'name': 'Food'}).id
+ self.id1 = SomeObj.create({'val': 1, 'categ_id': self.categ1}).id
+ self.id2 = SomeObj.create({'val': -1, 'categ_id': self.categ1}).id
# create a global rule forbidding access to records with a negative
# (or zero) val
self.env['ir.rule'].create({
@@ -19,6 +20,13 @@ class TestRules(TransactionCase):
'model_id': self.browse_ref('test_access_rights.model_test_access_right_some_obj').id,
'domain_force': "[('val', '>', 0)]"
})
+ # create a global rule that forbid access to records without
+ # categories, the search is part of the test
+ self.env['ir.rule'].create({
+ 'name': 'See all categories',
+ 'model_id': self.browse_ref('test_access_rights.model_test_access_right_some_obj').id,
+ 'domain_force': "[('categ_id', 'in', user.env['test_access_right.obj_categ'].search([]).ids)]"
+ })
def test_basic_access(self):
env = self.env(user=self.browse_ref('base.public_user'))
@@ -82,3 +90,25 @@ class TestRules(TransactionCase):
Model = env['test_access_right.some_obj']
with self.assertQueryCount(0):
Model._filter_access_rules('read')
+
+ def test_no_context_in_ir_rules(self):
+ """ The context should not impact the ir rules. """
+ env = self.env(user=self.browse_ref('base.public_user'))
+ ObjCateg = self.env['test_access_right.obj_categ']
+ SomeObj = self.env['test_access_right.some_obj']
+
+ # validate the effect of context on category search, there are
+ # no existing media category
+ self.assertTrue(ObjCateg.search([]))
+ self.assertFalse(ObjCateg.with_context(only_media=True).search([]))
+
+ # record1 is food and is accessible with an empy context
+ ObjCateg.clear_caches()
+ records = SomeObj.search([('id', '=', self.id1)])
+ self.assertTrue(records)
+
+ # it should also be accessible as the context is not used when
+ # searching for SomeObjs
+ ObjCateg.clear_caches()
+ records = SomeObj.with_context(only_media=True).search([('id', '=', self.id1)])
+ self.assertTrue(records)