base_telegram/models/base_telegram.py

77 lines
2.7 KiB
Python
Raw Permalink Normal View History

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