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", }