From 0d3d6c8e2741d830c9b603b32774e3519c6942b8 Mon Sep 17 00:00:00 2001 From: "Claire Bretton (clbr)" Date: Tue, 24 Oct 2023 11:12:04 +0200 Subject: [PATCH] [REF] account,*: Send & Print - clean computes - Clean computes to avoid unnecessary recomputations and improve the readability. - Various small fixes after this refactor PR https://github.com/odoo/odoo/pull/139311: wrong usage of `self`, missing `api.model` Task-id: 3415101 Part-of: odoo/odoo#139612 --- addons/account/wizard/account_move_send.py | 131 +++++++++--------- .../models/account_move_send.py | 2 + .../wizard/account_move_send.py | 2 +- .../wizard/account_move_send.py | 15 +- .../l10n_it_edi/wizard/account_move_send.py | 1 + .../wizard/account_move_send.py | 2 +- 6 files changed, 82 insertions(+), 71 deletions(-) diff --git a/addons/account/wizard/account_move_send.py b/addons/account/wizard/account_move_send.py index f0ffded08b8..34472dba882 100644 --- a/addons/account/wizard/account_move_send.py +++ b/addons/account/wizard/account_move_send.py @@ -32,7 +32,7 @@ class AccountMoveSend(models.TransientModel): ) # == MAIL == - enable_send_mail = fields.Boolean(compute='_compute_send_mail_extra_fields') + enable_send_mail = fields.Boolean(compute='_compute_enable_send_mail') checkbox_send_mail = fields.Boolean( string="Email", compute='_compute_checkbox_send_mail', @@ -42,7 +42,6 @@ class AccountMoveSend(models.TransientModel): display_mail_composer = fields.Boolean(compute='_compute_send_mail_extra_fields') send_mail_warning_message = fields.Text(compute='_compute_send_mail_extra_fields') send_mail_readonly = fields.Boolean(compute='_compute_send_mail_extra_fields') - mail_template_id = fields.Many2one( comodel_name='mail.template', string="Use template", @@ -61,14 +60,14 @@ class AccountMoveSend(models.TransientModel): ) mail_subject = fields.Char( string="Subject", - compute='_compute_mail_subject', + compute='_compute_mail_subject_body', store=True, readonly=False, ) mail_body = fields.Html( string="Contents", sanitize_style=True, - compute='_compute_mail_body', + compute='_compute_mail_subject_body', store=True, readonly=False, ) @@ -99,48 +98,46 @@ class AccountMoveSend(models.TransientModel): .with_context(lang=lang)\ ._render_field(field, move.ids, **kwargs)[move._origin.id] - def _get_default_mail_body(self, moves, mail_template, mail_lang): - if mail_template and len(moves) == 1: - return self._get_mail_default_field_value_from_template( - mail_template, - mail_lang, - moves, - 'body_html', - options={'post_process': True}, - ) - return None + def _get_default_mail_lang(self, move, mail_template=None): + return mail_template._render_lang([move.id]).get(move.id) if mail_template else get_lang(self.env).code - def _get_default_mail_subject(self, moves, mail_template, mail_lang): - if mail_template and len(moves) == 1: - return self._get_mail_default_field_value_from_template( - mail_template, - mail_lang, - moves, - 'subject', - ) - return None + def _get_default_mail_body(self, move, mail_template, mail_lang): + return self._get_mail_default_field_value_from_template( + mail_template, + mail_lang, + move, + 'body_html', + options={'post_process': True}, + ) - def _get_default_mail_partner_ids(self, moves, mail_template, mail_lang): - partners = self.env['res.partner'].with_company(moves.company_id) - if mail_template and len(moves) == 1: - if mail_template.email_to: - for mail_data in tools.email_split(mail_template.email_to): - partners |= partners.find_or_create(mail_data) - if mail_template.email_cc: - for mail_data in tools.email_split(mail_template.email_cc): - partners |= partners.find_or_create(mail_data) - if mail_template.partner_to: - partner_to = self._get_mail_default_field_value_from_template(mail_template, mail_lang, moves, 'partner_to') - partner_ids = mail_template._parse_partner_to(partner_to) - partners |= self.env['res.partner'].sudo().browse(partner_ids).exists() + def _get_default_mail_subject(self, move, mail_template, mail_lang): + return self._get_mail_default_field_value_from_template( + mail_template, + mail_lang, + move, + 'subject', + ) + + def _get_default_mail_partner_ids(self, move, mail_template, mail_lang): + partners = self.env['res.partner'].with_company(move.company_id) + if mail_template.email_to: + for mail_data in tools.email_split(mail_template.email_to): + partners |= partners.find_or_create(mail_data) + if mail_template.email_cc: + for mail_data in tools.email_split(mail_template.email_cc): + partners |= partners.find_or_create(mail_data) + if mail_template.partner_to: + partner_to = self._get_mail_default_field_value_from_template(mail_template, mail_lang, move, 'partner_to') + partner_ids = mail_template._parse_partner_to(partner_to) + partners |= self.env['res.partner'].sudo().browse(partner_ids).exists() return partners - def _get_default_mail_attachments_widget(self, moves, mail_template): - return self._get_placeholder_mail_attachments_data(moves) \ - + self._get_invoice_extra_attachments_data(moves) \ + def _get_default_mail_attachments_widget(self, move, mail_template): + return self._get_placeholder_mail_attachments_data(move) \ + + self._get_invoice_extra_attachments_data(move) \ + self._get_mail_template_attachments_data(mail_template) - def _get_wizard_values(self, move=None): + def _get_wizard_values(self, move): self.ensure_one() return { 'mail_template_id': self.mail_template_id.id, @@ -148,10 +145,10 @@ class AccountMoveSend(models.TransientModel): 'send_mail': self.checkbox_send_mail, } - def _get_mail_move_data(self, move, wizard=None): + def _get_mail_move_values(self, move, wizard=None): mail_template_id = move.send_and_print_values and move.send_and_print_values.get('mail_template_id') mail_template = wizard and wizard.mail_template_id or self.env['mail.template'].browse(mail_template_id) - mail_lang = mail_template._render_lang([move.id]).get(move.id) if mail_template else get_lang(self.env).code + mail_lang = self._get_default_mail_lang(move, mail_template) return { 'mail_template_id': mail_template, 'mail_lang': mail_lang, @@ -240,10 +237,19 @@ class AccountMoveSend(models.TransientModel): for wizard in self: wizard.checkbox_download = wizard.enable_download and wizard.company_id.invoice_is_download + @api.depends('move_ids') + def _compute_enable_send_mail(self): + for wizard in self: + wizard.enable_send_mail = wizard.mode in ('invoice_single', 'invoice_multi') + + @api.depends('enable_send_mail') + def _compute_checkbox_send_mail(self): + for wizard in self: + wizard.checkbox_send_mail = wizard.company_id.invoice_is_email and not wizard.send_mail_readonly + @api.depends('checkbox_send_mail') def _compute_send_mail_extra_fields(self): for wizard in self: - wizard.enable_send_mail = wizard.mode in ('invoice_single', 'invoice_multi') wizard.display_mail_composer = wizard.mode == 'invoice_single' wizard.send_mail_warning_message = False @@ -256,43 +262,40 @@ class AccountMoveSend(models.TransientModel): "so those invoices will not be sent: %s", ", ".join(invoices_without_mail_data.mapped('name'))) - @api.depends('move_ids') - def _compute_checkbox_send_mail(self): - for wizard in self: - wizard.checkbox_send_mail = wizard.company_id.invoice_is_email and not wizard.send_mail_readonly - @api.depends('mail_template_id') def _compute_mail_lang(self): for wizard in self: - if wizard.mail_template_id and wizard.mode == 'invoice_single': - move = wizard.move_ids - wizard.mail_lang = wizard.mail_template_id._render_lang([move.id]).get(move.id) + if wizard.mode == 'invoice_single': + wizard.mail_lang = self._get_default_mail_lang(wizard.move_ids, wizard.mail_template_id) else: wizard.mail_lang = get_lang(self.env).code @api.depends('mail_template_id', 'mail_lang') def _compute_mail_partner_ids(self): for wizard in self: - wizard.mail_partner_ids = self._get_default_mail_partner_ids(wizard.move_ids, wizard.mail_template_id, wizard.mail_lang) + if wizard.mode == 'invoice_single' and wizard.mail_template_id: + wizard.mail_partner_ids = self._get_default_mail_partner_ids(self.move_ids, wizard.mail_template_id, wizard.mail_lang) + else: + wizard.mail_partner_ids = None @api.depends('mail_template_id', 'mail_lang') - def _compute_mail_subject(self): + def _compute_mail_subject_body(self): for wizard in self: - wizard.mail_subject = self._get_default_mail_subject(wizard.move_ids, wizard.mail_template_id, wizard.mail_lang) + if wizard.mode == 'invoice_single' and wizard.mail_template_id: + wizard.mail_subject = self._get_default_mail_subject(wizard.move_ids, wizard.mail_template_id, wizard.mail_lang) + wizard.mail_body = self._get_default_mail_body(wizard.move_ids, wizard.mail_template_id, wizard.mail_lang) + else: + wizard.mail_subject = wizard.mail_body = None - @api.depends('mail_template_id', 'mail_lang') - def _compute_mail_body(self): - for wizard in self: - wizard.mail_body = self._get_default_mail_body(wizard.move_ids, wizard.mail_template_id, wizard.mail_lang) - - @api.depends('mail_template_id', 'mail_lang') + @api.depends('mail_template_id') def _compute_mail_attachments_widget(self): for wizard in self: if wizard.mode == 'invoice_single': manual_attachments_data = [x for x in wizard.mail_attachments_widget or [] if x.get('manual')] - wizard.mail_attachments_widget = \ - self._get_default_mail_attachments_widget(wizard.move_ids, wizard.mail_template_id) \ - + manual_attachments_data + wizard.mail_attachments_widget = ( + self._get_default_mail_attachments_widget(wizard.move_ids, wizard.mail_template_id) + + manual_attachments_data + ) else: wizard.mail_attachments_widget = [] @@ -602,7 +605,7 @@ class AccountMoveSend(models.TransientModel): moves_data = { move: { **(move.send_and_print_values if not wizard else wizard._get_wizard_values(move)), - **self._get_mail_move_data(move, wizard), + **self._get_mail_move_values(move, wizard), } for move in moves } diff --git a/addons/account_edi_ubl_cii/models/account_move_send.py b/addons/account_edi_ubl_cii/models/account_move_send.py index a849640e30d..4b8b1adec15 100644 --- a/addons/account_edi_ubl_cii/models/account_move_send.py +++ b/addons/account_edi_ubl_cii/models/account_move_send.py @@ -180,6 +180,7 @@ class AccountMoveSend(models.TransientModel): reader_buffer.close() writer_buffer.close() + @api.model def _postprocess_invoice_ubl_xml(self, invoice, invoice_data): # Adding the PDF to the XML tree = etree.fromstring(invoice_data['ubl_cii_xml_attachment_values']['raw']) @@ -220,6 +221,7 @@ class AccountMoveSend(models.TransientModel): cleanup_xml_node(tree), xml_declaration=True, encoding='UTF-8' ) + @api.model def _link_invoice_documents(self, invoice, invoice_data): # EXTENDS 'account' super()._link_invoice_documents(invoice, invoice_data) diff --git a/addons/account_peppol/wizard/account_move_send.py b/addons/account_peppol/wizard/account_move_send.py index f129f83fa64..782dadf485f 100644 --- a/addons/account_peppol/wizard/account_move_send.py +++ b/addons/account_peppol/wizard/account_move_send.py @@ -42,7 +42,6 @@ class AccountMoveSend(models.TransientModel): def _compute_checkbox_ubl_cii_xml(self): # extends 'account_edi_ubl_cii' super()._compute_checkbox_ubl_cii_xml() - for wizard in self: if wizard.checkbox_send_peppol and wizard.enable_ubl_cii_xml and not wizard.checkbox_ubl_cii_xml: wizard.checkbox_ubl_cii_xml = True @@ -111,6 +110,7 @@ class AccountMoveSend(models.TransientModel): return super().action_send_and_print(force_synchronous=force_synchronous, allow_fallback_pdf=allow_fallback_pdf, **kwargs) + @api.model def _call_web_service_after_invoice_pdf_render(self, invoices_data): # Overrides 'account' super()._call_web_service_after_invoice_pdf_render(invoices_data) diff --git a/addons/l10n_es_edi_facturae/wizard/account_move_send.py b/addons/l10n_es_edi_facturae/wizard/account_move_send.py index d9e540c737c..730b707ef00 100644 --- a/addons/l10n_es_edi_facturae/wizard/account_move_send.py +++ b/addons/l10n_es_edi_facturae/wizard/account_move_send.py @@ -4,10 +4,10 @@ from odoo import _, api, fields, models, SUPERUSER_ID class AccountMoveSend(models.TransientModel): _inherit = 'account.move.send' - l10n_es_edi_facturae_enable_xml = fields.Boolean(compute='_compute_send_mail_extra_fields') + l10n_es_edi_facturae_enable_xml = fields.Boolean(compute='_compute_l10n_es_edi_facturae_enable_xml') l10n_es_edi_facturae_checkbox_xml = fields.Boolean( string="Generate Facturae edi file", - default=True, + compute='_compute_l10n_es_edi_facturae_checkbox_xml', ) def _get_wizard_values(self, move): @@ -20,12 +20,16 @@ class AccountMoveSend(models.TransientModel): # COMPUTE METHODS # ------------------------------------------------------------------------- - def _compute_send_mail_extra_fields(self): - # EXTENDS 'account' - super()._compute_send_mail_extra_fields() + @api.depends('move_ids') + def _compute_l10n_es_edi_facturae_enable_xml(self): for wizard in self: wizard.l10n_es_edi_facturae_enable_xml = any(move._l10n_es_edi_facturae_get_default_enable() for move in wizard.move_ids) + @api.depends('l10n_es_edi_facturae_enable_xml') + def _compute_l10n_es_edi_facturae_checkbox_xml(self): + for wizard in self: + wizard.l10n_es_edi_facturae_checkbox_xml = wizard.l10n_es_edi_facturae_enable_xml + @api.depends('l10n_es_edi_facturae_checkbox_xml') def _compute_mail_attachments_widget(self): # EXTENDS 'account' - add depends @@ -82,6 +86,7 @@ class AccountMoveSend(models.TransientModel): 'res_field': 'l10n_es_edi_facturae_xml_file', # Binary field } + @api.model def _link_invoice_documents(self, invoice, invoice_data): # EXTENDS 'account' super()._link_invoice_documents(invoice, invoice_data) diff --git a/addons/l10n_it_edi/wizard/account_move_send.py b/addons/l10n_it_edi/wizard/account_move_send.py index 5b37312722b..e06c5bac589 100644 --- a/addons/l10n_it_edi/wizard/account_move_send.py +++ b/addons/l10n_it_edi/wizard/account_move_send.py @@ -129,6 +129,7 @@ class AccountMoveSend(models.TransientModel): attachments_vals[move] = invoices_data[move]['l10n_it_edi_values'] moves._l10n_it_edi_send(attachments_vals) + @api.model def _link_invoice_documents(self, invoice, invoice_data): # EXTENDS 'account' super()._link_invoice_documents(invoice, invoice_data) diff --git a/addons/snailmail_account/wizard/account_move_send.py b/addons/snailmail_account/wizard/account_move_send.py index b189b21804c..d8d155e085a 100644 --- a/addons/snailmail_account/wizard/account_move_send.py +++ b/addons/snailmail_account/wizard/account_move_send.py @@ -17,7 +17,7 @@ class AccountMoveSend(models.TransientModel): send_by_post_warning_message = fields.Text(compute='_compute_send_by_post_extra_fields') send_by_post_readonly = fields.Boolean(compute='_compute_send_by_post_extra_fields') - def _get_wizard_values(self, move=None): + def _get_wizard_values(self, move): # EXTENDS 'account' values = super()._get_wizard_values(move) values['send_by_post'] = self.checkbox_send_by_post