summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAymane (ayt) <ayt@odoo.com>2020-04-06 14:18:51 +0000
committerThibault Delavallée <tde@odoo.com>2020-05-27 07:22:28 +0000
commite02137c48562d824e3e01054e31dae383e5843e2 (patch)
treeea6f2cf6e02ebe9e6394cb7347dfc4da016f6ce7
parent28655ac9c318a3974c2b52c5216edfc22ade89f6 (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.py74
-rw-r--r--addons/test_mail_full/tests/test_sms_composer.py4
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.")