From 2676c6def38ca352154004c1a796e2df979102c5 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Fri, 16 Oct 2020 12:53:09 +0200 Subject: [PATCH] [FIX] server_environmnet_ir_config_parameter. Do not allow users using restored database to see the production values --- .../default/base.conf | 2 + .../test/base.conf | 2 +- .../__manifest__.py | 2 +- .../models/ir_config_parameter.py | 49 +++++--------- .../readme/DESCRIPTION.rst | 7 +- .../description/ir_config_parameter_tree.png | Bin 0 -> 40650 bytes .../tests/config_param_test.xml | 12 +++- .../tests/test_server_environment_ircp.py | 60 ++++-------------- .../views/view_ir_config_parameter.xml | 9 ++- 9 files changed, 55 insertions(+), 88 deletions(-) create mode 100644 server_environment_ir_config_parameter/static/description/ir_config_parameter_tree.png diff --git a/server_environment_files_sample/default/base.conf b/server_environment_files_sample/default/base.conf index bf92248..6c89d11 100644 --- a/server_environment_files_sample/default/base.conf +++ b/server_environment_files_sample/default/base.conf @@ -8,3 +8,5 @@ ged_folder = /my_mounting_point/ged/ [wkhtml2pdf] lib_path = /xxx/xxx/lib/wkhtmltopdf-linux-i386-0-9-9 +[ir.config_parameter] +ircp_from_config=default_config_value diff --git a/server_environment_files_sample/test/base.conf b/server_environment_files_sample/test/base.conf index 036aea7..badd8b7 100644 --- a/server_environment_files_sample/test/base.conf +++ b/server_environment_files_sample/test/base.conf @@ -8,5 +8,5 @@ ged_folder = /tmp/ged/ lib_path = /myHome/lib/wkhtmltopdf-linux-i386-0-9-9 [ir.config_parameter] -ircp_from_config=config_value +ircp_from_config=test_config_value ircp_empty= diff --git a/server_environment_ir_config_parameter/__manifest__.py b/server_environment_ir_config_parameter/__manifest__.py index ccbc546..d4fcb0c 100644 --- a/server_environment_ir_config_parameter/__manifest__.py +++ b/server_environment_ir_config_parameter/__manifest__.py @@ -7,7 +7,7 @@ Override System Parameters from server environment file""", 'version': '12.0.1.0.0', 'license': 'AGPL-3', - 'author': 'ACSONE SA/NV, Odoo Community Association (OCA)', + 'author': 'ACSONE SA/NV, GRAP, Odoo Community Association (OCA)', 'website': 'https://github.com/OCA/server-env/', 'depends': [ 'server_environment', diff --git a/server_environment_ir_config_parameter/models/ir_config_parameter.py b/server_environment_ir_config_parameter/models/ir_config_parameter.py index 3097d77..4e52329 100644 --- a/server_environment_ir_config_parameter/models/ir_config_parameter.py +++ b/server_environment_ir_config_parameter/models/ir_config_parameter.py @@ -15,53 +15,36 @@ class IrConfigParameter(models.Model): is_environment = fields.Boolean( string="Defined by environment", - compute="_compute_is_environment", + compute="_compute_environment", help="If check, the value in the database will be ignored" " and alternatively, the system will use the key defined" " in your odoo.cfg environment file.") + value = fields.Text(string="Database Value") + + environment_value = fields.Text( + string="Environment Value", + compute="_compute_environment", + help="Alternative value, set in your odoo.cfg environment file.") + @api.multi - def _compute_is_environment(self): + def _compute_environment(self): for parameter in self: parameter.is_environment = serv_config.has_option( SECTION, parameter.key) + if parameter.is_environment: + parameter.environment_value = serv_config.get( + SECTION, parameter.key) + else: + parameter.environment_value = False @api.model def get_param(self, key, default=False): - value = super().get_param(key, default=None) if serv_config.has_option(SECTION, key): cvalue = serv_config.get(SECTION, key) if not cvalue: raise UserError(_("Key %s is empty in " "server_environment_file") % (key, )) - if cvalue != value: - # we write in db on first access; - # should we have preloaded values in database at, - # server startup, modules loading their parameters - # from data files would break on unique key error. - self.sudo().set_param(key, cvalue) - value = cvalue - if value is None: - return default - return value - - @api.model - def create(self, vals): - key = vals.get('key') - if serv_config.has_option(SECTION, key): - # enforce value from config file - vals = dict(vals, value=serv_config.get(SECTION, key)) - return super().create(vals) - - @api.multi - def write(self, vals): - for rec in self: - key = vals.get('key') or rec.key - if serv_config.has_option(SECTION, key): - # enforce value from config file - newvals = dict(vals, value=serv_config.get(SECTION, key)) - else: - newvals = vals - super().write(newvals) - return True + return cvalue + return super().get_param(key, default=default) diff --git a/server_environment_ir_config_parameter/readme/DESCRIPTION.rst b/server_environment_ir_config_parameter/readme/DESCRIPTION.rst index 141459e..36d8734 100644 --- a/server_environment_ir_config_parameter/readme/DESCRIPTION.rst +++ b/server_environment_ir_config_parameter/readme/DESCRIPTION.rst @@ -1 +1,6 @@ -Override System Parameters from server environment file. \ No newline at end of file +Override System Parameters from server environment file. + +Displays both columns in the ``ir.config_parameter`` form and tree views, +the "Database Value" and the "Environment Value", if set. + +.. figure:: ../static/description/ir_config_parameter_tree.png diff --git a/server_environment_ir_config_parameter/static/description/ir_config_parameter_tree.png b/server_environment_ir_config_parameter/static/description/ir_config_parameter_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..66618c5c2517957420c58c12be8fa4809216a4d0 GIT binary patch literal 40650 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 literal 0 HcmV?d00001 diff --git a/server_environment_ir_config_parameter/tests/config_param_test.xml b/server_environment_ir_config_parameter/tests/config_param_test.xml index 61303a8..bed8a67 100644 --- a/server_environment_ir_config_parameter/tests/config_param_test.xml +++ b/server_environment_ir_config_parameter/tests/config_param_test.xml @@ -1,6 +1,12 @@ - - ircp_from_config - value_from_xml + + ircp_from_xml + value_1_from_xml + + + ircp_from_config + value_2_from_xml + + diff --git a/server_environment_ir_config_parameter/tests/test_server_environment_ircp.py b/server_environment_ir_config_parameter/tests/test_server_environment_ircp.py index 8843f79..7196ee1 100644 --- a/server_environment_ir_config_parameter/tests/test_server_environment_ircp.py +++ b/server_environment_ir_config_parameter/tests/test_server_environment_ircp.py @@ -19,62 +19,28 @@ class TestEnv(common.TransactionCase): get_resource_path(module, filepath), {}, mode='init', noupdate=False, kind='test') - def test_get_param(self): - """ Get system parameter from config """ - # it's not in db - res = self.ICP.search([('key', '=', 'ircp_from_config')]) - self.assertFalse(res) - # read so it's created in db - value = self.ICP.get_param('ircp_from_config') - self.assertEqual(value, 'config_value') - # now it's in db - res = self.ICP.search([('key', '=', 'ircp_from_config')]) - self.assertEqual(len(res), 1) - self.assertEqual(res.value, 'config_value') - - def test_set_param_1(self): - """ We can't set parameters that are in config file """ - # when creating, the value is overridden by config file - self.ICP.set_param('ircp_from_config', 'new_value') - value = self.ICP.get_param('ircp_from_config') - self.assertEqual(value, 'config_value') - # when writing, the value is overridden by config file - res = self.ICP.search([('key', '=', 'ircp_from_config')]) - self.assertEqual(len(res), 1) - res.write({'value': 'new_value'}) - value = self.ICP.get_param('ircp_from_config') - self.assertEqual(value, 'config_value') - # unlink works normally... - res = self.ICP.search([('key', '=', 'ircp_from_config')]) - self.assertEqual(len(res), 1) - res.unlink() - res = self.ICP.search([('key', '=', 'ircp_from_config')]) - self.assertEqual(len(res), 0) - # but the value is recreated when getting param again - value = self.ICP.get_param('ircp_from_config') - self.assertEqual(value, 'config_value') - res = self.ICP.search([('key', '=', 'ircp_from_config')]) - self.assertEqual(len(res), 1) - - def test_set_param_2(self): - """ We can set parameters that are not in config file """ - self.ICP.set_param('some.param', 'new_value') - self.assertEqual(self.ICP.get_param('some.param'), 'new_value') - res = self.ICP.search([('key', '=', 'some.param')]) - res.unlink() - res = self.ICP.search([('key', '=', 'some.param')]) - self.assertFalse(res) - def test_empty(self): """ Empty config values cause error """ with self.assertRaises(UserError): self.ICP.get_param('ircp_empty') self.assertEqual(self.ICP.get_param('ircp_nonexistant'), False) + def test_regular_case(self): + """ if a parameter is set only in the ir_config_parameter it should + be returned""" + self._load_xml( + 'server_environment_ir_config_parameter', + 'tests/config_param_test.xml' + ) + value = self.ICP.get_param('ircp_from_xml') + self.assertEqual(value, 'value_1_from_xml') + def test_override_xmldata(self): + """ if a parameter is in ir_config_parameter table AND + in the odoo.cfg file, the file value should be used.""" self._load_xml( 'server_environment_ir_config_parameter', 'tests/config_param_test.xml' ) value = self.ICP.get_param('ircp_from_config') - self.assertEqual(value, 'config_value') + self.assertEqual(value, 'test_config_value') diff --git a/server_environment_ir_config_parameter/views/view_ir_config_parameter.xml b/server_environment_ir_config_parameter/views/view_ir_config_parameter.xml index 71e3550..78016f2 100644 --- a/server_environment_ir_config_parameter/views/view_ir_config_parameter.xml +++ b/server_environment_ir_config_parameter/views/view_ir_config_parameter.xml @@ -11,7 +11,11 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - + + + + + {'invisible': [('is_environment', '=', True)]} @@ -21,13 +25,14 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + {'readonly': [('is_environment', '=', True)]} - {'readonly': [('is_environment', '=', True)]} + {'invisible': [('is_environment', '=', True)]}