base_telegram/wizard/create_notify_new_object.py

117 lines
4.9 KiB
Python
Raw Normal View History

2025-02-19 16:15:22 +03:00
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",
}