You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
5.0 KiB

  1. from odoo import models, fields, api
  2. class MailComposeMessage(models.TransientModel):
  3. _inherit = 'mail.compose.message'
  4. is_private = fields.Boolean(string='Send Internal Message')
  5. class MailMessage(models.Model):
  6. _inherit = 'mail.message'
  7. is_private = fields.Boolean(string='Send Internal Message')
  8. def send_recepients_for_internal_message(self, model, domain):
  9. result = []
  10. default_resource = self.env[model].search(domain)
  11. follower_ids = default_resource.message_follower_ids
  12. internal_ids = self.get_internal_users_ids()
  13. recipient_ids = [r.partner_id for r in follower_ids if r.partner_id]
  14. # channel_ids = [c.channel_id for c in follower_ids if c.channel_id]
  15. for recipient in recipient_ids:
  16. result.append({
  17. 'checked': recipient.user_ids.id in internal_ids,
  18. 'partner_id': recipient.id,
  19. 'full_name': recipient.name,
  20. 'name': recipient.name,
  21. 'email_address': recipient.email,
  22. 'reason': 'Recipient'
  23. })
  24. # for channel in channel_ids:
  25. # result.append({
  26. # 'checked': True,
  27. # 'channel_id': channel.id,
  28. # 'full_name': channel,
  29. # 'name': '# '+channel.name,
  30. # 'reason': 'Channel',
  31. # })
  32. return result
  33. @api.multi
  34. def _notify(self, force_send=False, send_after_commit=True, user_signature=True):
  35. self_sudo = self.sudo()
  36. if not self_sudo.is_private:
  37. super(MailMessage, self)._notify(force_send, send_after_commit, user_signature)
  38. else:
  39. self._notify_mail_private(force_send, send_after_commit, user_signature)
  40. @api.multi
  41. def _notify_mail_private(self, force_send=False, send_after_commit=True, user_signature=True):
  42. """ Compute recipients to notify based on specified recipients and document
  43. followers. Delegate notification to partners to send emails and bus notifications
  44. and to channels to broadcast messages on channels """
  45. group_user = self.env.ref('base.group_user')
  46. # have a sudoed copy to manipulate partners (public can go here with website modules like forum / blog / ... )
  47. self_sudo = self.sudo()
  48. self.ensure_one()
  49. partners_sudo = self_sudo.partner_ids
  50. channels_sudo = self_sudo.channel_ids
  51. if self_sudo.subtype_id and self.model and self.res_id:
  52. followers = self_sudo.env['mail.followers'].search([
  53. ('res_model', '=', self.model),
  54. ('res_id', '=', self.res_id),
  55. ('subtype_ids', 'in', self_sudo.subtype_id.id),
  56. ])
  57. if self_sudo.subtype_id.internal:
  58. followers = followers.filtered(lambda fol: fol.channel_id or (fol.partner_id.user_ids and group_user in fol.partner_id.user_ids[0].mapped('groups_id')))
  59. channels_sudo |= followers.mapped('channel_id')
  60. # remove author from notified partners
  61. if not self._context.get('mail_notify_author', False) and self_sudo.author_id:
  62. partners_sudo = partners_sudo - self_sudo.author_id
  63. # update message, with maybe custom valuesz
  64. message_values = {}
  65. if channels_sudo:
  66. message_values['channel_ids'] = [(6, 0, channels_sudo.ids)]
  67. if partners_sudo:
  68. message_values['needaction_partner_ids'] = [(6, 0, partners_sudo.ids)]
  69. if self.model and self.res_id and hasattr(self.env[self.model], 'message_get_message_notify_values'):
  70. message_values.update(self.env[self.model].browse(self.res_id).message_get_message_notify_values(self, message_values))
  71. if message_values:
  72. self.write(message_values)
  73. # notify partners and channels
  74. # those methods are called as SUPERUSER because portal users posting messages
  75. # have no access to partner model. Maybe propagating a real uid could be necessary.
  76. email_channels = channels_sudo.filtered(lambda channel: channel.email_send)
  77. notif_partners = partners_sudo.filtered(lambda partner: 'inbox' in partner.mapped('user_ids.notification_type'))
  78. if email_channels or partners_sudo - notif_partners:
  79. partners_sudo.search([
  80. '|',
  81. ('id', 'in', (partners_sudo - notif_partners).ids),
  82. ('channel_ids', 'in', email_channels.ids),
  83. ('email', '!=', self_sudo.author_id.email or self_sudo.email_from),
  84. ])._notify(self, force_send=force_send, send_after_commit=send_after_commit, user_signature=user_signature)
  85. channels_sudo._notify(self)
  86. # Discard cache, because child / parent allow reading and therefore
  87. # change access rights.
  88. if self.parent_id:
  89. self.parent_id.invalidate_cache()
  90. return True
  91. def get_internal_users_ids(self):
  92. internal_users_ids = self.env['res.users'].search([('share', '=', False)]).ids
  93. return internal_users_ids