[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>
This commit is contained in:
committed by
Thibault Delavallée
co-authored by
Thibault Delavallée
parent
28655ac9c3
commit
e02137c485
@@ -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
|
||||
|
||||
@@ -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.")
|
||||
|
||||
Reference in New Issue
Block a user