[REF] various, calendar_sms: remove '_sms_get_default_partners'

RATIONALE

Simplify field management for mail / phone / sms flows. Make it working out
of the box, easier to use and tweak.

SPECIFICATIONS

'_sms_get_default_partners' exists in SMS to find default customers to
notify when sending automated SMS. It can be replaced by '_mail_get_partners'
helper available on BaseModel in mail.

A specific case exists in calendar where it was overridden to avoid notifying
attendees that declined the event, notably for alarms. This feature has been
moved directly in the reminder sending method, to keep behavior coherent.
Test is updated accordingly, and is now really using the SMS mocks to simulate
the sending.

Task-3422449 (Mail, Phone: Move and improve field helpers)

Part-of: odoo/odoo#130468
This commit is contained in:
Thibault Delavallée
2023-08-02 18:50:17 +02:00
parent adfdf5ab33
commit 7f83f510e7
6 changed files with 28 additions and 38 deletions
+4 -7
View File
@@ -7,17 +7,14 @@ from odoo.exceptions import UserError
class CalendarEvent(models.Model):
_inherit = 'calendar.event'
def _sms_get_default_partners(self):
""" Method overridden from mail.thread (defined in the sms module).
SMS text messages will be sent to attendees that haven't declined the event(s).
"""
return self.mapped('attendee_ids').filtered(lambda att: att.state != 'declined' and att.partner_id.phone_sanitized).mapped('partner_id')
def _do_sms_reminder(self, alarms):
""" Send an SMS text reminder to attendees that haven't declined the event """
for event in self:
declined_partners = event.attendee_ids.filtered_domain([('state', '=', 'declined')]).partner_id
for alarm in alarms:
partners = event._sms_get_default_partners()
partners = event._mail_get_partners()[event.id].filtered(
lambda partner: partner.phone_sanitized and partner not in declined_partners
)
if event.user_id and not alarm.sms_notify_responsible:
partners -= event.user_id.partner_id
event._message_sms_with_template(
+17 -9
View File
@@ -3,10 +3,12 @@
from datetime import datetime
from odoo.tests.common import SingleTransactionCase
from odoo.addons.sms.tests.common import SMSCommon
from odoo.tests import tagged
class TestCalendarSms(SingleTransactionCase):
@tagged('sms')
class TestCalendarSms(SMSCommon):
@classmethod
def setUpClass(cls):
@@ -21,13 +23,19 @@ class TestCalendarSms(SingleTransactionCase):
'name': 'Partner With No Phone Number',
'country_id': cls.env.ref('base.be').id,
})
cls.event = cls.env['calendar.event'].create({
'alarm_ids': [(0, 0, {
'alarm_type': 'sms',
'name': 'SMS Reminder',
})],
'name': "Boostrap vs Foundation",
'partner_ids': [(6, 0, [cls.partner_phone.id, cls.partner_no_phone.id])],
'start': datetime(2022, 1, 1, 11, 11),
'stop': datetime(2022, 2, 2, 22, 22),
})
def test_attendees_with_number(self):
"""Test if only partners with sanitized number are returned."""
attendees = self.env['calendar.event'].create({
'name': "Boostrap vs Foundation",
'start': datetime(2022, 1, 1, 11, 11),
'stop': datetime(2022, 2, 2, 22, 22),
'partner_ids': [(6, 0, [self.partner_phone.id, self.partner_no_phone.id])],
})._sms_get_default_partners()
self.assertEqual(len(attendees), 1, "There should be only one partner retrieved")
with self.mockSMSGateway():
self.event._do_sms_reminder(self.event.alarm_ids)
self.assertEqual(len(self._sms), 1, "There should be only one partner retrieved")
+2 -2
View File
@@ -14,8 +14,8 @@ class Followers(models.Model):
if pids is None and records:
records_pids = dict(
(record.id, record._sms_get_default_partners().ids)
for record in records
(rec_id, partners.ids)
for rec_id, partners in records._mail_get_partners().items()
)
elif pids and records:
records_pids = dict((record.id, pids) for record in records)
+4 -13
View File
@@ -42,15 +42,6 @@ class MailThread(models.AbstractModel):
def _search_message_has_sms_error(self, operator, operand):
return ['&', ('message_ids.has_sms_error', operator, operand), ('message_ids.author_id', '=', self.env.user.partner_id.id)]
def _sms_get_default_partners(self):
""" This method will likely need to be overridden by inherited models.
:returns partners: recordset of res.partner
"""
partners = self.env['res.partner']
for fname in self._mail_get_partner_fields():
partners = partners.union(*self.mapped(fname)) # ensure ordering
return partners
def _sms_get_recipients_info(self, force_field=False, partner_fallback=True):
"""" Get SMS recipient information on current record set. This method
checks for numbers and sanitation in order to centralize computation.
@@ -65,11 +56,11 @@ class MailThread(models.AbstractModel):
:param force_field: either give a specific field to find phone number, either
generic heuristic is used to find one based on ``_phone_get_number_fields``;
:param partner_fallback: if no value found in the record, check its customer
values based on ``_sms_get_default_partners``;
values based on ``_mail_get_partners``;
:return dict: record.id: {
'partner': a res.partner recordset that is the customer (void or singleton)
linked to the recipient. See ``_sms_get_default_partners``;
linked to the recipient. See ``_mail_get_partners``;
'sanitized': sanitized number to use (coming from record's field or partner's
phone fields). Set to False is number impossible to parse and format;
'number': original number before sanitation;
@@ -84,9 +75,9 @@ class MailThread(models.AbstractModel):
tocheck_fields = [force_field] if force_field else self._phone_get_number_fields()
for record in self:
all_numbers = [record[fname] for fname in tocheck_fields if fname in record]
all_partners = record._sms_get_default_partners()
all_partners = record._mail_get_partners()[record.id]
valid_number = False
valid_number, fname = False, False
for fname in [f for f in tocheck_fields if f in record]:
valid_number = record._phone_format(fname=fname)
if valid_number:
-6
View File
@@ -7,9 +7,3 @@ from odoo import models
class ResPartner(models.Model):
_name = 'res.partner'
_inherit = ['mail.thread.phone', 'res.partner']
def _sms_get_default_partners(self):
""" Override of mail.thread method.
SMS recipients on partners are the partners themselves.
"""
return self
+1 -1
View File
@@ -123,7 +123,7 @@ class SendSMS(models.TransientModel):
continue
records.ensure_one()
res = records._sms_get_recipients_info(force_field=composer.number_field_name, partner_fallback=False)
composer.recipient_single_description = res[records.id]['partner'].name or records._sms_get_default_partners().display_name
composer.recipient_single_description = res[records.id]['partner'].name or records._mail_get_partners()[records[0].id].display_name
composer.recipient_single_number = res[records.id]['number'] or ''
if not composer.recipient_single_number_itf:
composer.recipient_single_number_itf = res[records.id]['number'] or ''