diff --git a/server_environment_files_sample/dev/base.conf b/server_environment_files_sample/dev/base.conf index 72f754176..036aea7a1 100644 --- a/server_environment_files_sample/dev/base.conf +++ b/server_environment_files_sample/dev/base.conf @@ -6,3 +6,7 @@ ged_folder = /tmp/ged/ [wkhtml2pdf] lib_path = /myHome/lib/wkhtmltopdf-linux-i386-0-9-9 + +[ir.config_parameter] +ircp_from_config=config_value +ircp_empty= diff --git a/server_environment_ir_config_parameter/README.rst b/server_environment_ir_config_parameter/README.rst new file mode 100644 index 000000000..e457f88f0 --- /dev/null +++ b/server_environment_ir_config_parameter/README.rst @@ -0,0 +1,85 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +====================================== +Server Environment Ir Config Parameter +====================================== + +Override System Parameters from server environment file. +Before using this module, you must be familiar with the +server_environment module. + +Installation +============ + +There is no specific installation instruction for this module. + +Configuration +============= + +To configure this module, you need to add a section ``[ir.config_parameter]`` to +you server_environment_files configurations, where the keys are the same +as would normally be set in the Systems Parameter Odoo menu. + +When first using a value, the system will read it from the configuration file +and override any value that would be present in the database, so the configuration +file has precedence. + +When creating or modifying values that are in the configuration file, the +module replace changes, enforcing the configuration value. + +For example you can use this module in combination with web_environment_ribbon: + +.. code:: + + [ir.config_parameter] + ribbon.name=DEV + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/149/9.0 + +Known issues / Roadmap +====================== + +* When the user modifies System Parameters that are defined in the config + file, the changes are ignored. It would be nice to display which system + parameters come from the config file and possibly make their key and value + readonly in the user interface. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Stéphane Bidoul + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/server_environment_ir_config_parameter/__init__.py b/server_environment_ir_config_parameter/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/server_environment_ir_config_parameter/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/server_environment_ir_config_parameter/__openerp__.py b/server_environment_ir_config_parameter/__openerp__.py new file mode 100644 index 000000000..616840f8a --- /dev/null +++ b/server_environment_ir_config_parameter/__openerp__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Server Environment Ir Config Parameter', + 'summary': """ + Override System Parameters from server environment file""", + 'version': '9.0.1.0.0', + 'license': 'AGPL-3', + 'author': 'ACSONE SA/NV,Odoo Community Association (OCA)', + 'website': 'https://odoo-community.org/', + 'depends': [ + 'server_environment', + ], + 'data': [ + ], + 'demo': [ + ], +} diff --git a/server_environment_ir_config_parameter/models/__init__.py b/server_environment_ir_config_parameter/models/__init__.py new file mode 100644 index 000000000..bd3aa9f10 --- /dev/null +++ b/server_environment_ir_config_parameter/models/__init__.py @@ -0,0 +1 @@ +from . import ir_config_parameter diff --git a/server_environment_ir_config_parameter/models/ir_config_parameter.py b/server_environment_ir_config_parameter/models/ir_config_parameter.py new file mode 100644 index 000000000..f00ba08ac --- /dev/null +++ b/server_environment_ir_config_parameter/models/ir_config_parameter.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import api, models, _, SUPERUSER_ID +from openerp.exceptions import UserError +from openerp.addons.server_environment import serv_config + + +SECTION = 'ir.config_parameter' + + +class IrConfigParameter(models.Model): + + _inherit = 'ir.config_parameter' + + def get_param(self, cr, uid, key, default=False, context=None): + value = super(IrConfigParameter, self).get_param( + cr, uid, key, default=None, context=context) + 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.set_param(cr, SUPERUSER_ID, 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(IrConfigParameter, self).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(IrConfigParameter, rec).write(newvals) diff --git a/server_environment_ir_config_parameter/static/description/icon.png b/server_environment_ir_config_parameter/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/server_environment_ir_config_parameter/static/description/icon.png differ diff --git a/server_environment_ir_config_parameter/tests/__init__.py b/server_environment_ir_config_parameter/tests/__init__.py new file mode 100644 index 000000000..83a250db1 --- /dev/null +++ b/server_environment_ir_config_parameter/tests/__init__.py @@ -0,0 +1 @@ +from . import test_server_environment_ircp 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 new file mode 100644 index 000000000..8f6f768a5 --- /dev/null +++ b/server_environment_ir_config_parameter/tests/test_server_environment_ircp.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from cStringIO import StringIO + +from openerp.exceptions import UserError +from openerp.tests import common +from openerp.tools import convert + + +class TestEnv(common.TransactionCase): + + def setUp(self): + super(TestEnv, self).setUp() + self.ICP = self.env['ir.config_parameter'] + + 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_override_xmldata(self): + xml = """ + + + ircp_from_config + value_from_xml + + + """ + convert.convert_xml_import(self.env.cr, 'testmodule', StringIO(xml)) + value = self.ICP.get_param('ircp_from_config') + self.assertEqual(value, 'config_value') diff --git a/setup/server_environment_ir_config_parameter/odoo_addons/__init__.py b/setup/server_environment_ir_config_parameter/odoo_addons/__init__.py new file mode 100644 index 000000000..de40ea7ca --- /dev/null +++ b/setup/server_environment_ir_config_parameter/odoo_addons/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/setup/server_environment_ir_config_parameter/odoo_addons/server_environment_ir_config_parameter b/setup/server_environment_ir_config_parameter/odoo_addons/server_environment_ir_config_parameter new file mode 120000 index 000000000..b8e606f9b --- /dev/null +++ b/setup/server_environment_ir_config_parameter/odoo_addons/server_environment_ir_config_parameter @@ -0,0 +1 @@ +../../../server_environment_ir_config_parameter \ No newline at end of file diff --git a/setup/server_environment_ir_config_parameter/setup.py b/setup/server_environment_ir_config_parameter/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/server_environment_ir_config_parameter/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)