77 lines
2.7 KiB
Python
77 lines
2.7 KiB
Python
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
|
|
|