76 lines
2.3 KiB
Python
76 lines
2.3 KiB
Python
from odoo import api, fields, models
|
|
|
|
|
|
class DirectiveOrigin(models.Model):
|
|
_name = "directive.origin"
|
|
_description = "Directive Origin"
|
|
_rec_name = "display_name"
|
|
_order = "id desc"
|
|
|
|
res_model = fields.Char(string="Техническое имя модели", required=True, index=True)
|
|
res_id = fields.Integer(string="ID записи", required=True, index=True)
|
|
|
|
res_ref = fields.Reference(
|
|
selection="_get_reference_models",
|
|
string="Ссылка на запись",
|
|
compute="_compute_res_ref",
|
|
inverse="_inverse_res_ref",
|
|
store=True,
|
|
readonly=False,
|
|
)
|
|
|
|
directive_ids = fields.One2many(
|
|
"directive.directive",
|
|
"origin_id",
|
|
string="Директивы",
|
|
readonly=True,
|
|
)
|
|
|
|
display_name = fields.Char(
|
|
string="Источник (display_name)",
|
|
compute="_compute_display_name",
|
|
store=True,
|
|
)
|
|
|
|
_sql_constraints = [
|
|
("directive_origin_uniq", "unique(res_model, res_id)", "Origin must be unique per (model, id)."),
|
|
]
|
|
|
|
@api.model
|
|
def _get_reference_models(self):
|
|
models = self.env["ir.model"].sudo().search([])
|
|
return [(m.model, m.name) for m in models if m.model]
|
|
|
|
@api.depends("res_model", "res_id")
|
|
def _compute_res_ref(self):
|
|
for rec in self:
|
|
if rec.res_model and rec.res_id:
|
|
rec.res_ref = f"{rec.res_model},{rec.res_id}"
|
|
else:
|
|
rec.res_ref = False
|
|
|
|
def _inverse_res_ref(self):
|
|
for rec in self:
|
|
if not rec.res_ref:
|
|
rec.res_model = False
|
|
rec.res_id = 0
|
|
continue
|
|
try:
|
|
model, rid = rec.res_ref.split(",")
|
|
rec.res_model = model
|
|
rec.res_id = int(rid)
|
|
except Exception:
|
|
rec.res_model = False
|
|
rec.res_id = 0
|
|
|
|
@api.depends("res_ref")
|
|
def _compute_display_name(self):
|
|
for rec in self:
|
|
if rec.res_ref:
|
|
try:
|
|
rec.display_name = f"{rec.res_model},{rec.res_id}"
|
|
except Exception:
|
|
rec.display_name = f"{rec.res_model},{rec.res_id}"
|
|
else:
|
|
rec.display_name = f"{rec.res_model},{rec.res_id}"
|