server-env/server_environment/models/server_env_tech_name_mixin.py

73 lines
2.4 KiB
Python

# Copyright 2020 Camptocamp (http://www.camptocamp.com)
# @author Simone Orsi <simahawk@gmail.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
from odoo.addons.http_routing.models.ir_http import slugify
class ServerEnvTechNameMixin(models.AbstractModel):
"""Provides a tech_name field to be used in server env vars as unique key.
The `name` field can be error prone because users can easily change it
to something more meaningful for them or set weird chars into it
that make difficult to reference the record in env var config.
This mixin helps solve the problem by providing a tech name field
and a cleanup machinery as well as a unique constrain.
To use this mixin add it to the _inherit attr of your module like:
_inherit = [
"my.model",
"server.env.techname.mixin",
"server.env.mixin",
]
"""
_name = "server.env.techname.mixin"
_description = "Server environment technical name"
_sql_constraints = [
("tech_name_uniq", "unique(tech_name)", "`tech_name` must be unique!",)
]
# TODO: could leverage the new option for computable / writable fields
# and get rid of some onchange / read / write code.
tech_name = fields.Char(
required=True,
help="Unique name for technical purposes. " "Eg: server env keys.",
)
_server_env_section_name_field = "tech_name"
@api.onchange("name")
def _onchange_name_for_tech(self):
# Keep this specific name for the method to avoid possible overrides
# of existing `_onchange_name` methods
if self.name and not self.tech_name:
self.tech_name = self.name
@api.onchange("tech_name")
def _onchange_tech_name(self):
if self.tech_name:
# make sure is normalized
self.tech_name = self._normalize_tech_name(self.tech_name)
@api.model
def create(self, vals):
self._handle_tech_name(vals)
return super().create(vals)
def write(self, vals):
self._handle_tech_name(vals)
return super().write(vals)
def _handle_tech_name(self, vals):
# make sure technical names are always there
if not vals.get("tech_name") and vals.get("name"):
vals["tech_name"] = self._normalize_tech_name(vals["name"])
@staticmethod
def _normalize_tech_name(name):
return slugify(name).replace("-", "_")