summaryrefslogtreecommitdiff
path: root/addons/sms/models/mail_thread.py
diff options
context:
space:
mode:
authorThibault Delavallée <tde@odoo.com>2020-03-02 13:28:38 +0000
committerThibault Delavallée <tde@odoo.com>2020-03-05 11:04:49 +0000
commite36661ecd9fc455222f4d274eb65ab763a6ccd18 (patch)
tree430a8b9967a6b23d95e4e57e7a6d04c9464369e0 /addons/sms/models/mail_thread.py
parent3150541bedbf77b652a91cc04e01d15130a175c9 (diff)
[REF] sms: improve _sms_get_recipients returned information
Purpose is to improve information given back, adding notably * whether the value comes from the customer (partner_id field) or directly from the record we are looping on; * the actual field used when no specific field is enforced; LINKS Task ID 2088303 Community PR odoo/odoo#40482
Diffstat (limited to 'addons/sms/models/mail_thread.py')
-rw-r--r--addons/sms/models/mail_thread.py66
1 files changed, 46 insertions, 20 deletions
diff --git a/addons/sms/models/mail_thread.py b/addons/sms/models/mail_thread.py
index add3e7f2dc0..e1dac1fba33 100644
--- a/addons/sms/models/mail_thread.py
+++ b/addons/sms/models/mail_thread.py
@@ -61,7 +61,7 @@ class MailThread(models.AbstractModel):
send an SMS on a record. """
return ['mobile']
- def _sms_get_recipients_info(self, force_field=False):
+ 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.
@@ -72,17 +72,27 @@ class MailThread(models.AbstractModel):
* contact -> find numbers from all possible phone fields on record, find
customer, force its number to found field number or fallback on customer fields;
+ :param force_field: either give a specific field to find phone number, either
+ generic heuristic is used to find one based on ``_sms_get_number_fields``;
+ :param partner_fallback: if no value found in the record, check its customer
+ values based on ``_sms_get_default_partners``;
+
:return dict: record.id: {
- 'partner': a res.partner recordset that is the customer (void or singleton);
- 'sanitized': sanitized number to use (coming from record's field or partner's mobile
- or phone). Set to False is number impossible to parse and format;
+ 'partner': a res.partner recordset that is the customer (void or singleton)
+ linked to the recipient. See ``_sms_get_default_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;
+ 'partner_store': whether the number comes from the customer phone fields. If
+ False it means number comes from the record itself, even if linked to a
+ customer;
+ 'field_store': field in which the number has been found (generally mobile or
+ phone, see ``_sms_get_number_fields``);
} for each record in self
"""
result = dict.fromkeys(self.ids, False)
- number_fields = self._sms_get_number_fields()
+ tocheck_fields = [force_field] if force_field else self._sms_get_number_fields()
for record in self:
- tocheck_fields = [force_field] if force_field else number_fields
all_numbers = [record[fname] for fname in tocheck_fields if fname in record]
all_partners = record._sms_get_default_partners()
@@ -95,25 +105,41 @@ class MailThread(models.AbstractModel):
if valid_number:
result[record.id] = {
'partner': all_partners[0] if all_partners else self.env['res.partner'],
- 'sanitized': valid_number, 'number': valid_number,
+ 'sanitized': valid_number,
+ 'number': record[fname],
+ 'partner_store': False,
+ 'field_store': fname,
}
- elif all_partners:
- partner_number, partner = False, self.env['res.partner']
+ elif all_partners and partner_fallback:
+ partner = self.env['res.partner']
for partner in all_partners:
- partner_number = partner.mobile or partner.phone
- if partner_number:
- partner_number = phone_validation.phone_sanitize_numbers_w_record([partner_number], record)[partner_number]['sanitized']
- if partner_number:
- break
-
- if partner_number:
- result[record.id] = {'partner': partner, 'sanitized': partner_number, 'number': partner_number}
- else:
- result[record.id] = {'partner': partner, 'sanitized': False, 'number': partner.mobile or partner.phone}
+ for fname in self.env['res.partner']._sms_get_number_fields():
+ valid_number = phone_validation.phone_sanitize_numbers_w_record([partner[fname]], record)[partner[fname]]['sanitized']
+ if valid_number:
+ break
+
+ if not valid_number:
+ fname = 'mobile' if partner.mobile else ('phone' if partner.phone else 'mobile')
+
+ result[record.id] = {
+ 'partner': partner,
+ 'sanitized': valid_number if valid_number else False,
+ 'number': partner[fname],
+ 'partner_store': True,
+ 'field_store': fname,
+ }
elif all_numbers:
result[record.id] = {'partner': self.env['res.partner'], 'sanitized': False, 'number': all_numbers[0]}
else:
- result[record.id] = {'partner': self.env['res.partner'], 'sanitized': False, 'number': False}
+ idx, value = next(((idx, val) for idx, val in enumerate(all_numbers)), (0, False))
+ fname = tocheck_fields[idx] if tocheck_fields else False
+ result[record.id] = {
+ 'partner': self.env['res.partner'],
+ 'sanitized': False,
+ 'number': value,
+ 'partner_store': False,
+ 'field_store': fname
+ }
return result
def _message_sms_schedule_mass(self, body='', template=False, active_domain=None, **composer_values):