from odoo import api, fields, models, _ import requests import json from odoo.tools import html2plaintext import logging _logger = logging.getLogger(__name__) class TelegramAPI(models.Model): _name = "base_telegram.api" _description = "Telegram API" code = fields.Char(string='Code Name', index=True) name = fields.Char(string='Name') chat_id = fields.Char(string='Chat ID') token = fields.Char(string='Bot Token') messages_html = fields.Html(string='Messages for Bot', compute='_compute_messages_html', store=False, readonly=True) @api.onchange('token') def _compute_messages_html(self): for rec in self: result = rec.get_updates() if rec.token else [] rec.messages_html = self.render_template('base_telegram.get_updates', {'result': result} if result else {}) def get_url(self, command): return "https://api.telegram.org/bot{token}/{command}".format(token = self.token, command = command) def send_message(self, message): cnt = 0 for chat in self: #url = "https://api.telegram.org/bot{token}/sendMessage".format(token = chat.token) url = chat.get_url('sendMessage') info = { 'chat_id': chat.chat_id, 'text': message, 'parse_mode': 'HTML' } try: response = requests.post(url, data=info) #response.raise_for_status() cnt += 1 except requests.exceptions.RequestException as e: _logger.info(f"Error: {e}") return cnt def send_template(self, template, obj, data = dict()): return self.send_message(str( self.with_context( lang=self.env.user.lang if self.env.user.lang else 'ru_RU', tz=self.env.user.tz if self.env.user.tz else 'Europe/Moscow' ).render_template(template, obj, data) )) def get_updates(self): url = self.get_url('getUpdates') try: response = requests.post(url, data='') except requests.exceptions.RequestException as e: _logger.info(f"Error: {e}") return json.loads(response.content).get('result',[]) if response and response.content else [] def render_template(self, template, obj = False, data = dict()): if not data: data = dict() data['object'] = obj data['html2plaintext'] = html2plaintext return self.env['ir.qweb']._render(template, data, lang='ru_RU') def button_get_messages(self): self.get_updates() self._compute_messages_html() return True def button_send_test(self): self.send_message(_('Test from Odoo')) return True