whatsapp_message.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from odoo import models, fields, api
  2. from odoo.exceptions import ValidationError
  3. import logging
  4. _logger = logging.getLogger(__name__)
  5. class WhatsAppMessage(models.Model):
  6. _inherit = 'whatsapp.message'
  7. # Campo Many2one para grupos - solo disponible cuando whatsapp_web_groups está instalado
  8. whatsapp_group_id = fields.Many2one('ww.group', string='WhatsApp Group',
  9. help="WhatsApp group to send message to (if recipient_type is group)",
  10. ondelete='set null')
  11. @api.depends('recipient_type', 'mobile_number', 'whatsapp_group_id')
  12. def _compute_final_recipient(self):
  13. """Compute the final recipient based on type - extiende la lógica base"""
  14. # Primero ejecutar la lógica base de whatsapp_web
  15. super()._compute_final_recipient()
  16. # Si hay grupo seleccionado, usar su ID (sobrescribe la lógica base)
  17. for record in self:
  18. if record.recipient_type == 'group' and record.whatsapp_group_id:
  19. record.final_recipient = record.whatsapp_group_id.whatsapp_web_id
  20. @api.onchange('whatsapp_group_id')
  21. def _onchange_whatsapp_group_id(self):
  22. """Actualizar mobile_number cuando se selecciona un grupo"""
  23. if self.whatsapp_group_id:
  24. self.mobile_number = self.whatsapp_group_id.whatsapp_web_id
  25. self.recipient_type = 'group'
  26. @api.constrains('recipient_type', 'mobile_number', 'whatsapp_group_id')
  27. def _check_recipient_configuration(self):
  28. """Extender validación para incluir whatsapp_group_id"""
  29. super()._check_recipient_configuration()
  30. for record in self:
  31. if record.recipient_type == 'group':
  32. if not record.whatsapp_group_id and not (record.mobile_number and record.mobile_number.endswith('@g.us')):
  33. raise ValidationError("Para mensajes a grupos, debe seleccionar un grupo o proporcionar un ID de grupo válido (@g.us)")
  34. def _get_final_destination(self):
  35. """Método mejorado para obtener destino final - extiende la lógica base"""
  36. self.ensure_one()
  37. # Si hay grupo seleccionado, usar su ID
  38. if self.recipient_type == 'group' and self.whatsapp_group_id:
  39. return self.whatsapp_group_id.whatsapp_web_id
  40. # De lo contrario, usar la lógica base (incluye verificación de mobile_number @g.us)
  41. result = super()._get_final_destination()
  42. if result:
  43. return result
  44. # Fallback adicional si no hay resultado
  45. return False
  46. def _send_message(self, with_commit=False):
  47. """Extender método _send_message para manejar whatsapp_group_id"""
  48. # El método _get_final_destination ya maneja whatsapp_group_id,
  49. # así que la lógica base funcionará correctamente
  50. return super()._send_message(with_commit)