Add global section

This commit is contained in:
Guewen Baconnier 2018-07-19 18:20:44 +02:00
parent 64c3e29b73
commit 60375bbf65
1 changed files with 46 additions and 14 deletions

View File

@ -34,8 +34,10 @@ class ServerEnvMixin(models.AbstractModel):
By default, it looks for the configuration in a section named
``[model_name.Record Name]`` where ``model_name`` is the ``_name`` of the
model with ``.`` replaced by ``_``. It can be customized by overriding the
method :meth:`~_server_env_section_name`.
model with ``.`` replaced by ``_``. Then in a global section which is only
the name of the model. They can be customized by overriding the method
:meth:`~_server_env_section_name` and
:meth:`~_server_env_global_section_name`.
For each field transformed to an env-computed field, a companion field
``<field>_env_default`` is automatically created. When it's value is set
@ -87,6 +89,15 @@ class ServerEnvMixin(models.AbstractModel):
"""
return {}
@api.multi
def _server_env_global_section_name(self):
"""Name of the global section in the configuration files
Can be customized in your model
"""
self.ensure_one()
return self._name.replace(".", "_")
@api.multi
def _server_env_section_name(self):
"""Name of the section in the configuration files
@ -99,12 +110,20 @@ class ServerEnvMixin(models.AbstractModel):
)
@api.multi
def _server_env_read_from_config(self, section_name, field_name,
config_getter):
def _server_env_read_from_config(self, field_name, config_getter):
self.ensure_one()
global_section_name = self._server_env_global_section_name()
section_name = self._server_env_section_name()
try:
# at this point we should have checked that we have a key with
# _server_env_has_key_defined so we are sure that the value is
# either in the global or the record config
getter = getattr(serv_config, config_getter)
if (section_name in serv_config
and field_name in serv_config[section_name]):
value = getter(section_name, field_name)
else:
value = getter(global_section_name, field_name)
except:
_logger.exception(
"error trying to read field %s in section %s",
@ -114,6 +133,21 @@ class ServerEnvMixin(models.AbstractModel):
return False
return value
@api.multi
def _server_env_has_key_defined(self, field_name):
self.ensure_one()
global_section_name = self._server_env_global_section_name()
section_name = self._server_env_section_name()
has_global_config = (
global_section_name in serv_config
and field_name in serv_config[global_section_name]
)
has_config = (
section_name in serv_config
and field_name in serv_config[section_name]
)
return has_global_config or has_config
@api.multi
def _compute_server_env(self):
"""Read values from environment configuration files
@ -122,13 +156,11 @@ class ServerEnvMixin(models.AbstractModel):
read from the ``<field>_env_default`` field from database.
"""
for record in self:
for field_name, options in record._server_env_fields.items():
section_name = record._server_env_section_name()
if (section_name in serv_config
and field_name in serv_config[section_name]):
for field_name, options in self._server_env_fields.items():
if record._server_env_has_key_defined(field_name):
getter_name = options.get('getter', 'get')
value = record._server_env_read_from_config(
section_name, field_name, getter_name
field_name, getter_name
)
else:
@ -145,6 +177,7 @@ class ServerEnvMixin(models.AbstractModel):
for record in self:
# when we write in an env-computed field, if it is editable
# we update the default value in database
if record[is_editable_field]:
record[default_field] = record[field_name]
@ -163,10 +196,9 @@ class ServerEnvMixin(models.AbstractModel):
is_editable_field = self._server_env_is_editable_fieldname(
field_name
)
section_name = record._server_env_section_name()
is_editable = not (section_name in serv_config
and field_name in serv_config[section_name])
is_editable = not record._server_env_has_key_defined(
field_name
)
record[is_editable_field] = is_editable
def _server_env_view_set_readonly(self, view_arch):