117 lines
4.9 KiB
Python
117 lines
4.9 KiB
Python
from odoo import fields, models, api
|
|
from odoo.exceptions import AccessError, MissingError, UserError, ValidationError
|
|
|
|
|
|
class WizardCreateNotifyNewObject(models.TransientModel):
|
|
_name = "wizard.create.notify.new.object"
|
|
_description = "Create Automation to send message to Telegram about new object"
|
|
|
|
@api.model
|
|
def _selection_target_model(self):
|
|
return [(model.model, model.name) for model in self.env['ir.model'].sudo().search([])]
|
|
|
|
@api.model
|
|
def _selection_languages(self):
|
|
return self.env['res.lang'].get_installed()
|
|
|
|
name = fields.Char(required=True)
|
|
chat_id = fields.Many2one('base_telegram.api', string='Bot and chat to send messages', required=True,
|
|
help="Select Bot and chat to send messages")
|
|
res_model_id = fields.Many2one('ir.model', string='Model', required=True,
|
|
help="Select Model where new object will be monitored")
|
|
template_id_domain = fields.Char(compute="_compute_template_id_domain")
|
|
template_id = fields.Many2one('ir.ui.view', string='Template', domain="template_id_domain",
|
|
help="Select QWeb Template to compose message")
|
|
template_xml_id = fields.Char(string='Template xml_id', related='template_id.xml_id')
|
|
template_arch = fields.Text(string='Template arch', related='template_id.arch')
|
|
action_server_id_domain = fields.Char(compute="_compute_action_server_id")
|
|
action_server_id = fields.Many2one('ir.actions.server', string='Server action to send message', required=True, domain="action_server_id_domain")
|
|
action_code = fields.Text(string='Action python code', compute='_compute_action_code', compute_sudo=True, readonly=True)
|
|
test_active = fields.Boolean(string='Activate Preview')
|
|
test_record_ref = fields.Reference(
|
|
string='Test Record',
|
|
compute='_compute_test_record_ref',
|
|
compute_sudo=False, readonly=False,
|
|
selection='_selection_target_model',
|
|
store=True
|
|
)
|
|
test_lang = fields.Selection(_selection_languages, string='Template Preview Language')
|
|
test_no_record = fields.Boolean('No Record', compute='_compute_no_record')
|
|
test_preview = fields.Text('Test Preview', compute='_compute_template_preview')
|
|
|
|
@api.depends('res_model_id')
|
|
def _compute_template_id_domain(self):
|
|
for rec in self:
|
|
domain = [('model', '=', rec.res_model_id.model if rec.res_model_id else False), ('type', '=', 'qweb')]
|
|
rec.template_id_domain = domain
|
|
|
|
@api.depends('res_model_id')
|
|
def _compute_action_server_id(self):
|
|
for rec in self:
|
|
domain = [('model_id', '=', rec.res_model_id.id if rec.res_model_id else False), ('state', '=', 'code')]
|
|
rec.action_server_id_domain = domain
|
|
|
|
@api.depends('action_server_id')
|
|
def _compute_action_code(self):
|
|
for rec in self:
|
|
if rec.action_server_id:
|
|
rec.action_code = rec.action_server_id.code
|
|
else:
|
|
rec.action_code = False
|
|
|
|
@api.depends('res_model_id')
|
|
def _compute_test_record_ref(self):
|
|
for rec in self:
|
|
if rec.res_model_id:
|
|
res = self.env[rec.res_model_id.model].search([], limit=1)
|
|
else:
|
|
res = False
|
|
rec.test_record_ref = f'{str(rec.res_model_id.model)},{res.id}' if res else False
|
|
|
|
@api.depends('test_record_ref')
|
|
def _compute_no_record(self):
|
|
for rec in self:
|
|
rec.test_no_record = False if rec.test_record_ref else True
|
|
|
|
@api.depends('test_record_ref','template_id')
|
|
def _compute_template_preview(self):
|
|
for rec in self:
|
|
if rec.chat_id and rec.test_record_ref and rec.test_record_ref.id and rec.template_id:
|
|
try:
|
|
rec.test_preview = rec.chat_id.with_context(
|
|
lang=rec.test_lang
|
|
).render_template(rec.template_xml_id, rec.test_record_ref)
|
|
except UserError as e:
|
|
rec.test_preview = f"Error: {e}"
|
|
else:
|
|
rec.test_preview = False
|
|
|
|
def create_by_chat_id(self):
|
|
self.ensure_one()
|
|
|
|
chat_ids = self.env.context.get("active_ids", [])
|
|
assert len(chat_ids) == 1
|
|
|
|
chat_id = chat_ids[0]
|
|
|
|
rule_obj = self.env["base.automation"]
|
|
automation = rule_obj.create(
|
|
{
|
|
"name": self.name,
|
|
"model_id": self.res_model_id.id,
|
|
"trigger": 'on_create_or_write',
|
|
"trigger_field_ids": self.env['ir.model.fields'].search([('model_id','=',self.res_model_id.id),('name','=','create_date')]),
|
|
"action_server_ids": self.action_server_id.ids,
|
|
}
|
|
)
|
|
return {
|
|
"context": self.env.context,
|
|
"name": "Automation Rule",
|
|
"view_type": "form",
|
|
"view_mode": "form",
|
|
"res_model": "base.automation",
|
|
"res_id": automation.id,
|
|
"target": "current",
|
|
"type": "ir.actions.act_window",
|
|
}
|