Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace)
This commit is contained in:
117
addons/cetmix_tower_server/models/cx_tower_variable_option.py
Normal file
117
addons/cetmix_tower_server/models/cx_tower_variable_option.py
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
# Copyright (C) 2022 Cetmix OÜ
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import _, api, fields, models
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
|
|
||||||
|
class TowerVariableOption(models.Model):
|
||||||
|
"""
|
||||||
|
Model to manage variable options in the Cetmix Tower.
|
||||||
|
|
||||||
|
The model allows defining options
|
||||||
|
that are linked to tower variables and can be used to
|
||||||
|
manage configurations or settings for those variables.
|
||||||
|
"""
|
||||||
|
|
||||||
|
_name = "cx.tower.variable.option"
|
||||||
|
_description = "Cetmix Tower Variable Options"
|
||||||
|
_inherit = ["cx.tower.reference.mixin", "cx.tower.access.mixin"]
|
||||||
|
_order = "sequence, name"
|
||||||
|
|
||||||
|
access_level = fields.Selection(
|
||||||
|
compute="_compute_access_level",
|
||||||
|
readonly=False,
|
||||||
|
store=True,
|
||||||
|
default=None,
|
||||||
|
)
|
||||||
|
name = fields.Char(required=True)
|
||||||
|
value_char = fields.Char(string="Value", required=True)
|
||||||
|
variable_id = fields.Many2one(
|
||||||
|
comodel_name="cx.tower.variable",
|
||||||
|
required=True,
|
||||||
|
ondelete="cascade",
|
||||||
|
)
|
||||||
|
sequence = fields.Integer(default=10)
|
||||||
|
|
||||||
|
# Define a SQL constraint to ensure the combination of
|
||||||
|
# 'name' and 'variable_id' is unique
|
||||||
|
_sql_constraints = [
|
||||||
|
(
|
||||||
|
"unique_variable_option",
|
||||||
|
"unique (value_char, variable_id)",
|
||||||
|
"The combination of Value and Variable must be unique.",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"unique_variable_option_name",
|
||||||
|
"unique (name, variable_id)",
|
||||||
|
"The combination of Name and Variable must be unique.",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
@api.depends("variable_id", "variable_id.access_level")
|
||||||
|
def _compute_access_level(self):
|
||||||
|
"""
|
||||||
|
Automatically set the access_level based on Variable access level
|
||||||
|
"""
|
||||||
|
for rec in self:
|
||||||
|
if rec.variable_id:
|
||||||
|
rec.access_level = rec.variable_id.access_level
|
||||||
|
|
||||||
|
@api.constrains("access_level", "variable_id")
|
||||||
|
def _check_access_level_consistency(self):
|
||||||
|
"""
|
||||||
|
Ensure that the access level of the variable value is not lower than
|
||||||
|
the access level of the associated variable.
|
||||||
|
"""
|
||||||
|
access_level_dict = dict(
|
||||||
|
self.fields_get(["access_level"])["access_level"]["selection"]
|
||||||
|
)
|
||||||
|
for rec in self:
|
||||||
|
if not rec.variable_id:
|
||||||
|
continue
|
||||||
|
if not rec.access_level:
|
||||||
|
raise ValidationError(
|
||||||
|
_(
|
||||||
|
"Access level is not defined for '%(option)s'",
|
||||||
|
option=rec.name,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if rec.access_level < rec.variable_id.access_level:
|
||||||
|
raise ValidationError(
|
||||||
|
_(
|
||||||
|
"The access level for Variable Option '%(value)s' "
|
||||||
|
"cannot be lower than the access level of its "
|
||||||
|
"Variable '%(variable)s'.\n"
|
||||||
|
"Variable Access Level: %(var_level)s\n"
|
||||||
|
"Variable Option Access Level: %(val_level)s",
|
||||||
|
value=rec.name,
|
||||||
|
variable=rec.variable_id.name,
|
||||||
|
var_level=access_level_dict[rec.variable_id.access_level],
|
||||||
|
val_level=access_level_dict[rec.access_level],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Workaround for the default value not being set
|
||||||
|
@api.model_create_multi
|
||||||
|
def create(self, vals_list):
|
||||||
|
variable_obj = self.env["cx.tower.variable"]
|
||||||
|
for vals in vals_list:
|
||||||
|
# Set access level from the variable
|
||||||
|
# if not provided explicitly
|
||||||
|
access_level = vals.get("access_level")
|
||||||
|
if access_level:
|
||||||
|
continue
|
||||||
|
variable_id = vals.get("variable_id")
|
||||||
|
if variable_id:
|
||||||
|
variable = variable_obj.browse(variable_id)
|
||||||
|
vals["access_level"] = variable.access_level
|
||||||
|
return super().create(vals_list)
|
||||||
|
|
||||||
|
def _get_pre_populated_model_data(self):
|
||||||
|
"""
|
||||||
|
Define the model relationships for reference generation.
|
||||||
|
"""
|
||||||
|
res = super()._get_pre_populated_model_data()
|
||||||
|
res.update({"cx.tower.variable.option": ["cx.tower.variable", "variable_id"]})
|
||||||
|
return res
|
||||||
Reference in New Issue
Block a user