from odoo import models, fields, api
from odoo.tools import groupby
import logging
import markupsafe
import requests
import json
import time
import random
import re
import html
import base64
_logger = logging.getLogger(__name__)
class WhatsAppMessage(models.Model):
_inherit = 'whatsapp.message'
def _send_message(self, with_commit=False):
url = ''
if self.wa_account_id and self.wa_account_id.whatsapp_web_url:
url = self.wa_account_id.whatsapp_web_url
_logger.info('WHATSAPP WEB SEND MESSAGE' + url)
group = ''
if not url:
super()._send_message(with_commit)
for whatsapp_message in self:
#verificacion envio a grupo
#plantilla dada de alta en x_plantillas_whatsapp
if 'marketing.trace' in self.env:
marketing_traces = self.env['marketing.trace'].sudo().search([('whatsapp_message_id', '=', whatsapp_message.id)])
for marketing_trace in marketing_traces:
if 'x_studio_grupo_whatsapp' in marketing_trace.activity_id and marketing_trace.activity_id.x_studio_grupo_whatsapp:
group = marketing_trace.activity_id.x_studio_grupo_whatsapp.x_studio_destinatario
if 'x_notificaciones_whats' in self.env and not group:
notificaciones = self.env['x_notificaciones_whats'].sudo().search([('x_studio_plantilla_de_whatsapp', '=', whatsapp_message.wa_template_id.id)])
if notificaciones:
_logger.info('template encontrado')
if not group:
for notificacion in notificaciones:
if not notificacion.x_studio_partner_unico:
group = notificacion.x_studio_destinatario
break
attachment = False
if whatsapp_message.wa_template_id:
record = self.env[whatsapp_message.wa_template_id.model].browse(whatsapp_message.mail_message_id.res_id)
#codigo con base a whatsapp.message y whatsapp.template para generacion de adjuntos
RecordModel = self.env[whatsapp_message.mail_message_id.model].with_user(whatsapp_message.create_uid)
from_record = RecordModel.browse(whatsapp_message.mail_message_id.res_id)
# if retrying message then we need to unlink previous attachment
# in case of header with report in order to generate it again
if whatsapp_message.wa_template_id.report_id and whatsapp_message.wa_template_id.header_type == 'document' and whatsapp_message.mail_message_id.attachment_ids:
whatsapp_message.mail_message_id.attachment_ids.unlink()
if not attachment and whatsapp_message.wa_template_id.report_id:
attachment = whatsapp_message.wa_template_id._generate_attachment_from_report(record)
if not attachment and whatsapp_message.wa_template_id.header_attachment_ids:
attachment = whatsapp_message.wa_template_id.header_attachment_ids[0]
if attachment and attachment not in whatsapp_message.mail_message_id.attachment_ids:
whatsapp_message.mail_message_id.attachment_ids = [(4, attachment.id)]
# no template
elif whatsapp_message.mail_message_id.attachment_ids:
attachment = whatsapp_message.mail_message_id.attachment_ids[0]
#codigo para limpiar body y numero
body = whatsapp_message.body
if isinstance(body, markupsafe.Markup):
text = html.unescape(str(body))
# Reemplazamos las etiquetas BR y P
text = re.sub(r'
|
', '\n', text)
text = re.sub(r'
|
', '\n\n', text) text = re.sub(r'
|', '', text) # Eliminamos el resto de etiquetas HTML text = re.sub(r'<[^>]+>', '', text) # Limpiamos múltiples saltos de línea text = re.sub(r'\n\s*\n\s*\n', '\n\n', text) # Limpiamos espacios en blanco al inicio y final body = text.strip() number = whatsapp_message.mobile_number number = number.replace(' ', '').replace('+','') if number.startswith("52") and len(number) == 12: number = "521" + number[2:] # ENVIO DE MENSAJE # Headers de la petición, si es necesario headers = { "Content-Type": "application/json" } number = group if group else number + '@c.us' #$wa::sendMessage("521{$fields_data[$settings['borax_whatsapp_mobile']]}@c.us", ['type' => 'MessageMedia', 'args' => [mime_content_type($file), base64_encode(file_get_contents($file)), $filename, $filesize]], ['caption' => $borax_whatsapp_mensaje]); parent_message_id = '' if whatsapp_message.mail_message_id and whatsapp_message.mail_message_id.parent_id: parent_id = whatsapp_message.mail_message_id.parent_id.wa_message_ids if parent_id: parent_message_id = parent_id[0].msg_uid if attachment: payload = { "method": "sendMessage", "args": [number, {'type': 'MessageMedia', 'args': [attachment.mimetype, base64.b64encode(attachment.raw).decode('utf-8'), attachment.name, attachment.file_size]}, {'caption': body}] } else: payload = { "method": "sendMessage", "args": [number, body, {}] } if parent_message_id: payload['args'][2]['quotedMessageId'] = parent_message_id # Realizando la petición POST response = requests.post(url, data=json.dumps(payload), headers=headers) # Verificando si la respuesta contiene data->id if response.status_code == 200: response_json = response.json() if "_data" in response_json and "id" in response_json["_data"]: _logger.info(f"Petición exitosa. ID: {response_json['_data']['id']['id']}") whatsapp_message.write({ 'state': 'sent', 'msg_uid': response_json['_data']['id']['_serialized'] }) self._cr.commit() else: _logger.info("La respuesta no contiene 'data->id'.") else: _logger.info(f"Error en la petición. Código de estado: {response.status_code}") time.sleep(random.randint(3, 7))