diff --git a/server_environment_ir_config_parameter/README.rst b/server_environment_ir_config_parameter/README.rst new file mode 100644 index 0000000..56eac78 --- /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/11.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 0000000..0650744 --- /dev/null +++ b/server_environment_ir_config_parameter/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/server_environment_ir_config_parameter/__manifest__.py b/server_environment_ir_config_parameter/__manifest__.py new file mode 100644 index 0000000..90b1b4b --- /dev/null +++ b/server_environment_ir_config_parameter/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2016-2018 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': '11.0.1.0.0', + 'license': 'AGPL-3', + 'author': 'ACSONE SA/NV, Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/server-env/', + 'depends': [ + 'server_environment', + ], +} diff --git a/server_environment_ir_config_parameter/i18n/de.po b/server_environment_ir_config_parameter/i18n/de.po new file mode 100644 index 0000000..8b27e66 --- /dev/null +++ b/server_environment_ir_config_parameter/i18n/de.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * server_environment_ir_config_parameter +# +# Translators: +# Niki Waibel , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-22 01:12+0000\n" +"PO-Revision-Date: 2017-06-22 01:12+0000\n" +"Last-Translator: Niki Waibel , 2017\n" +"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: server_environment_ir_config_parameter +#: code:addons/server_environment_ir_config_parameter/models/ir_config_parameter.py:23 +#, python-format +msgid "Key %s is empty in server_environment_file" +msgstr "" + +#. module: server_environment_ir_config_parameter +#: model:ir.model,name:server_environment_ir_config_parameter.model_ir_config_parameter +msgid "ir.config_parameter" +msgstr "ir.config_parameter" diff --git a/server_environment_ir_config_parameter/i18n/es.po b/server_environment_ir_config_parameter/i18n/es.po new file mode 100644 index 0000000..39388a1 --- /dev/null +++ b/server_environment_ir_config_parameter/i18n/es.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * server_environment_ir_config_parameter +# +# Translators: +# Pedro M. Baeza , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-22 01:12+0000\n" +"PO-Revision-Date: 2017-06-22 01:12+0000\n" +"Last-Translator: Pedro M. Baeza , 2017\n" +"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: server_environment_ir_config_parameter +#: code:addons/server_environment_ir_config_parameter/models/ir_config_parameter.py:23 +#, python-format +msgid "Key %s is empty in server_environment_file" +msgstr "" + +#. module: server_environment_ir_config_parameter +#: model:ir.model,name:server_environment_ir_config_parameter.model_ir_config_parameter +msgid "ir.config_parameter" +msgstr "ir.config_parameter" diff --git a/server_environment_ir_config_parameter/i18n/it.po b/server_environment_ir_config_parameter/i18n/it.po new file mode 100644 index 0000000..11aad2d --- /dev/null +++ b/server_environment_ir_config_parameter/i18n/it.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * server_environment_ir_config_parameter +# +# Translators: +# Paolo Valier , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-06 02:25+0000\n" +"PO-Revision-Date: 2018-01-06 02:25+0000\n" +"Last-Translator: Paolo Valier , 2018\n" +"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: server_environment_ir_config_parameter +#: code:addons/server_environment_ir_config_parameter/models/ir_config_parameter.py:23 +#, python-format +msgid "Key %s is empty in server_environment_file" +msgstr "" + +#. module: server_environment_ir_config_parameter +#: model:ir.model,name:server_environment_ir_config_parameter.model_ir_config_parameter +msgid "ir.config_parameter" +msgstr "ir.config_parameter" diff --git a/server_environment_ir_config_parameter/i18n/nl_NL.po b/server_environment_ir_config_parameter/i18n/nl_NL.po new file mode 100644 index 0000000..11fe9f3 --- /dev/null +++ b/server_environment_ir_config_parameter/i18n/nl_NL.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * server_environment_ir_config_parameter +# +# Translators: +# Peter Hageman , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-22 01:12+0000\n" +"PO-Revision-Date: 2017-06-22 01:12+0000\n" +"Last-Translator: Peter Hageman , 2017\n" +"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/teams/23907/nl_NL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: nl_NL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: server_environment_ir_config_parameter +#: code:addons/server_environment_ir_config_parameter/models/ir_config_parameter.py:23 +#, python-format +msgid "Key %s is empty in server_environment_file" +msgstr "sleutel %s is leeg in server_environment_file" + +#. module: server_environment_ir_config_parameter +#: model:ir.model,name:server_environment_ir_config_parameter.model_ir_config_parameter +msgid "ir.config_parameter" +msgstr "ir.config_parameter" diff --git a/server_environment_ir_config_parameter/i18n/ro.po b/server_environment_ir_config_parameter/i18n/ro.po new file mode 100644 index 0000000..28e0325 --- /dev/null +++ b/server_environment_ir_config_parameter/i18n/ro.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * server_environment_ir_config_parameter +# +# Translators: +# Dorin Hongu , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-12-16 02:17+0000\n" +"PO-Revision-Date: 2017-12-16 02:17+0000\n" +"Last-Translator: Dorin Hongu , 2017\n" +"Language-Team: Romanian (https://www.transifex.com/oca/teams/23907/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#. module: server_environment_ir_config_parameter +#: code:addons/server_environment_ir_config_parameter/models/ir_config_parameter.py:23 +#, python-format +msgid "Key %s is empty in server_environment_file" +msgstr "" + +#. module: server_environment_ir_config_parameter +#: model:ir.model,name:server_environment_ir_config_parameter.model_ir_config_parameter +msgid "ir.config_parameter" +msgstr "ir.config_parameter" 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 0000000..bd3aa9f --- /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 0000000..29ddc44 --- /dev/null +++ b/server_environment_ir_config_parameter/models/ir_config_parameter.py @@ -0,0 +1,54 @@ +# Copyright 2016-2018 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, models, _ +from odoo.exceptions import UserError +from odoo.addons.server_environment import serv_config + + +SECTION = 'ir.config_parameter' + + +class IrConfigParameter(models.Model): + + _inherit = 'ir.config_parameter' + + @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 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 0000000..83a250d --- /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/config_param_test.xml b/server_environment_ir_config_parameter/tests/config_param_test.xml new file mode 100644 index 0000000..61303a8 --- /dev/null +++ b/server_environment_ir_config_parameter/tests/config_param_test.xml @@ -0,0 +1,6 @@ + + + ircp_from_config + value_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 new file mode 100644 index 0000000..8843f79 --- /dev/null +++ b/server_environment_ir_config_parameter/tests/test_server_environment_ircp.py @@ -0,0 +1,80 @@ +# Copyright 2016-2018 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.exceptions import UserError +from odoo.tests import common +from odoo.tools import convert_file +from odoo.modules.module import get_resource_path + + +class TestEnv(common.TransactionCase): + + def setUp(self): + super().setUp() + self.ICP = self.env['ir.config_parameter'] + + def _load_xml(self, module, filepath): + convert_file( + self.env.cr, module, + 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_override_xmldata(self): + 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')