diff options
| author | Aymane (ayt) <ayt@odoo.com> | 2020-04-06 14:18:51 +0000 |
|---|---|---|
| committer | Thibault Delavallée <tde@odoo.com> | 2020-05-27 07:22:28 +0000 |
| commit | e02137c48562d824e3e01054e31dae383e5843e2 (patch) | |
| tree | ea6f2cf6e02ebe9e6394cb7347dfc4da016f6ce7 | |
| parent | 28655ac9c318a3974c2b52c5216edfc22ade89f6 (diff) | |
[REF] sms: move composer from onchange / default_get to editable computed fields
PURPOSE
Try to move from onchange / default_get to stored editable computed fields.
Behavior should be the same (computed or set by user), with support of
create / write / onchange field update without additional code.
SPECIFICATIONS
Update classic fields updated in some cases by onchange and/or default methods
by fields with store=True, readonly=False. It means their value comes either
from manual user input, either from trigger based computation.
Remove onchange and default_get when possible, leading to an unique computation
method and clearing fields definition.
Also clean some fields definition inconsistencies, notably required fields
that should instead be correctly computed or default that have no real meaning.
LINKS
Task ID 2229050
PR #51159
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
Co-authored-by: Aymane Taibi <ayt@odoo.com>
Co-authored-by: Thibault Delavallée <tde@odoo.com>
| -rw-r--r-- | addons/sms/wizard/sms_composer.py | 74 | ||||
| -rw-r--r-- | addons/test_mail_full/tests/test_sms_composer.py | 4 |
2 files changed, 44 insertions, 34 deletions
diff --git a/addons/sms/wizard/sms_composer.py b/addons/sms/wizard/sms_composer.py index 7d5cbc9bfd2..0d3d822ed4b 100644 --- a/addons/sms/wizard/sms_composer.py +++ b/addons/sms/wizard/sms_composer.py @@ -18,41 +18,24 @@ class SendSMS(models.TransientModel): result = super(SendSMS, self).default_get(fields) result['res_model'] = result.get('res_model') or self.env.context.get('active_model') - result['composition_mode'] = result.get('composition_mode') - - # guess the composition mode, if multiples ids => mass composition else comment - if self.env.context.get('default_composition_mode') and self.env.context.get('default_composition_mode') == "guess": - if self.env.context.get('active_ids') and len(self.env.context.get('active_ids')) > 1: - result['composition_mode'] = 'mass' - result['res_id'] = False - else: - result['composition_mode'] = 'comment' - result['res_ids'] = False if not result.get('active_domain'): result['active_domain'] = repr(self.env.context.get('active_domain', [])) + if not result.get('res_ids'): + if not result.get('res_id') and self.env.context.get('active_ids') and len(self.env.context.get('active_ids')) > 1: + result['res_ids'] = repr(self.env.context.get('active_ids')) if not result.get('res_id'): if not result.get('res_ids') and self.env.context.get('active_id'): result['res_id'] = self.env.context.get('active_id') - if not result.get('res_ids'): - if not result.get('res_id') and self.env.context.get('active_ids'): - result['res_ids'] = repr(self.env.context.get('active_ids')) - if result['res_model']: - result.update( - self._get_composer_values( - result['composition_mode'], result['res_model'], result.get('res_id'), - result.get('body'), result.get('template_id') - ) - ) return result # documents composition_mode = fields.Selection([ ('numbers', 'Send to numbers'), ('comment', 'Post on a document'), - ('mass', 'Send SMS in batch')], - string='Composition Mode', default='comment', required=True) + ('mass', 'Send SMS in batch')], string='Composition Mode', + compute='_compute_composition_mode', readonly=False, required=True, store=True) res_model = fields.Char('Document Model Name') res_id = fields.Integer('Document ID') res_ids = fields.Char('Document IDs') @@ -86,7 +69,19 @@ class SendSMS(models.TransientModel): sanitized_numbers = fields.Char('Sanitized Number', compute='_compute_sanitized_numbers', compute_sudo=False) # content template_id = fields.Many2one('sms.template', string='Use Template', domain="[('model', '=', res_model)]") - body = fields.Text('Message', required=True) + body = fields.Text( + 'Message', compute='_compute_body', + readonly=False, store=True, required=True) + + @api.depends('res_ids_count', 'active_domain_count') + @api.depends_context('default_composition_mode') + def _compute_composition_mode(self): + for composer in self: + if self.env.context.get('default_composition_mode') == 'guess' or not composer.composition_mode: + if composer.res_ids_count > 1 or (composer.use_active_domain and composer.active_domain_count > 1): + composer.composition_mode = 'mass' + else: + composer.composition_mode = 'comment' @api.depends('res_model', 'res_id', 'res_ids', 'active_domain') def _compute_recipients_count(self): @@ -165,12 +160,29 @@ class SendSMS(models.TransientModel): else: composer.sanitized_numbers = False - @api.onchange('composition_mode', 'res_model', 'res_id', 'template_id') - def _onchange_template_id(self): - if self.template_id and self.composition_mode == 'comment' and self.res_id: - self.body = self.template_id._render_field('body', [self.res_id], compute_lang=True)[self.res_id] - elif self.template_id: - self.body = self.template_id.body + @api.depends('composition_mode', 'res_model', 'res_id', 'template_id') + def _compute_body(self): + for record in self: + if record.template_id and record.composition_mode == 'comment' and record.res_id: + record.body = record.template_id._render_field('body', [record.res_id], compute_lang=True)[record.res_id] + elif record.template_id: + record.body = record.template_id.body + + # ------------------------------------------------------------ + # CRUD + # ------------------------------------------------------------ + + @api.model + def create(self, values): + # TDE FIXME: currently have to compute manually to avoid required issue, waiting VFE branch + if not values.get('body') or not values.get('composition_mode'): + values_wdef = self._add_missing_default_values(values) + cache_composer = self.new(values_wdef) + cache_composer._compute_body() + cache_composer._compute_composition_mode() + values['body'] = values.get('body') or cache_composer.body + values['composition_mode'] = values.get('composition_mode') or cache_composer.composition_mode + return super(SendSMS, self).create(values) # ------------------------------------------------------------ # Actions @@ -357,10 +369,12 @@ class SendSMS(models.TransientModel): if self.use_active_domain: active_domain = literal_eval(self.active_domain or '[]') records = self.env[self.res_model].search(active_domain) + elif self.res_ids: + records = self.env[self.res_model].browse(literal_eval(self.res_ids)) elif self.res_id: records = self.env[self.res_model].browse(self.res_id) else: - records = self.env[self.res_model].browse(literal_eval(self.res_ids or '[]')) + records = self.env[self.res_model] records = records.with_context(mail_notify_author=True) return records diff --git a/addons/test_mail_full/tests/test_sms_composer.py b/addons/test_mail_full/tests/test_sms_composer.py index 73b6fdf14a7..cee5e969c1a 100644 --- a/addons/test_mail_full/tests/test_sms_composer.py +++ b/addons/test_mail_full/tests/test_sms_composer.py @@ -529,8 +529,6 @@ class TestSMSComposerMass(TestMailFullCommon): ).create({ 'mass_keep_log': False, }) - # Call manually the onchange - composer._onchange_template_id() self.assertEqual(composer.composition_mode, "comment") self.assertEqual(composer.body, "Hello %s ceci est en français." % test_record_2.display_name) @@ -553,8 +551,6 @@ class TestSMSComposerMass(TestMailFullCommon): ).create({ 'mass_keep_log': True, }) - # Call manually the onchange - composer._onchange_template_id() self.assertEqual(composer.composition_mode, "mass") # In english because by default but when sinding depending of record self.assertEqual(composer.body, "Dear ${object.display_name} this is an SMS.") |
