diff --git a/base_export_async/data/mail_template.xml b/base_export_async/data/mail_template.xml index e1f8904e8b..5d254d8a15 100644 --- a/base_export_async/data/mail_template.xml +++ b/base_export_async/data/mail_template.xml @@ -4,7 +4,7 @@ Delay Export Export ${object.model_description} ${datetime.date.today()} + >Export ${object.sudo().model_description} ${datetime.date.today()} diff --git a/base_export_async/models/delay_export.py b/base_export_async/models/delay_export.py index a4590df883..80b3b03423 100644 --- a/base_export_async/models/delay_export.py +++ b/base_export_async/models/delay_export.py @@ -66,7 +66,9 @@ def _get_file_content(self, params): return xls.from_data(columns_headers, import_data) @api.model - def export(self, params): + def export( + self, params, mail_template=None, is_export_file_attached_to_email=False + ): """Delayed export of a file sent by email The ``params`` is a dict of parameters, contains: @@ -124,14 +126,27 @@ def export(self, params): "model_description": model_description, } ) + email_values = { + "email_from": email_from, + "reply_to": email_from, + "recipient_ids": [(6, 0, users.mapped("partner_id").ids)], + } + + email_template = ( + mail_template + if mail_template + else self.env.ref("base_export_async.delay_export_mail_template") + ) - self.env.ref("base_export_async.delay_export_mail_template").send_mail( + if is_export_file_attached_to_email: + attachment_ids = attachment.ids + if email_template and email_template.attachment_ids: + attachment_ids += email_template.attachment_ids.ids + attachment_ids = [(4, aid) for aid in attachment_ids] + email_values.update({"attachment_ids": attachment_ids}) + email_template.send_mail( export_record.id, - email_values={ - "email_from": email_from, - "reply_to": email_from, - "recipient_ids": [(6, 0, users.mapped("partner_id").ids)], - }, + email_values=email_values, ) @api.model diff --git a/base_export_async/security/ir_rule.xml b/base_export_async/security/ir_rule.xml index d7934f09ae..67374e2eea 100644 --- a/base_export_async/security/ir_rule.xml +++ b/base_export_async/security/ir_rule.xml @@ -1,7 +1,7 @@ - - Only user can read delay.export + + Recipient can read delay.export @@ -10,4 +10,14 @@ [('user_ids', 'in', user.id)] + + Admin / Settings can read all delay.export + + + + + + + [(1, '=', 1)] + diff --git a/base_export_async/tests/test_base_export_async.py b/base_export_async/tests/test_base_export_async.py index e1b5c3579a..64732a3223 100644 --- a/base_export_async/tests/test_base_export_async.py +++ b/base_export_async/tests/test_base_export_async.py @@ -81,6 +81,17 @@ def test_export_xls(self): self.assertEqual(len(new_mail), 1) self.assertEqual(new_attachment.name, "res.partner.xls") + def test_export_mail_attachments(self): + """Check that the export generate an email and attached the generated attachment""" + params = json.loads(data_csv.get("data")) + mails = self.env["mail.mail"].search([]) + self.delay_export_obj.export( + params, mail_template=None, is_export_file_attached_to_email=True + ) + new_mail = self.env["mail.mail"].search([]) - mails + self.assertEqual(len(new_mail.attachment_ids), 1) + self.assertEqual(new_mail.attachment_ids.name, "res.partner.csv") + def test_cron_delete(self): """Check that cron delete attachment after TTL""" params = json.loads(data_csv.get("data")) diff --git a/export_async_schedule/models/export_async_schedule.py b/export_async_schedule/models/export_async_schedule.py index 04ac3fa706..d17b094ed6 100644 --- a/export_async_schedule/models/export_async_schedule.py +++ b/export_async_schedule/models/export_async_schedule.py @@ -22,9 +22,7 @@ class ExportAsyncSchedule(models.Model): comodel_name="ir.model", required=True, ondelete="cascade" ) model_name = fields.Char(related="model_id.model", string="Model Name") - user_ids = fields.Many2many( - string="Recipients", comodel_name="res.users", required=True - ) + user_ids = fields.Many2many(string="Recipients", comodel_name="res.users") domain = fields.Char(string="Export Domain", default=[]) ir_export_id = fields.Many2one( comodel_name="ir.exports", @@ -45,7 +43,25 @@ class ExportAsyncSchedule(models.Model): default=lambda self: self.env.lang, help="Exports will be translated in this language.", ) - + mail_template_id = fields.Many2one( + "mail.template", + string="Email Template", + default=lambda self: self.env.ref( + "base_export_async.delay_export_mail_template" + ), + context=lambda env: { + "default_model_id": env.ref("base_export_async.model_delay_export").id + }, + ) + is_mail_template_has_recipients = fields.Boolean( + compute="_compute_is_mail_template_has_recipients" + ) + is_mail_template_has_recipients = fields.Boolean( + compute="_compute_is_mail_template_has_recipients" + ) + is_export_file_attached_to_email = fields.Boolean( + "Export file attached to email", default=False + ) # Scheduling next_execution = fields.Datetime(default=fields.Datetime.now, required=True) interval = fields.Integer(default=1, required=True) @@ -62,6 +78,15 @@ class ExportAsyncSchedule(models.Model): ) end_of_month = fields.Boolean() + @api.depends( + "mail_template_id", "mail_template_id.email_to", "mail_template_id.partner_to" + ) + def _compute_is_mail_template_has_recipients(self): + for record in self: + record.is_mail_template_has_recipients = record.mail_template_id and ( + record.mail_template_id.email_to or record.mail_template_id.partner_to + ) + def name_get(self): result = [] for record in self: @@ -149,4 +174,8 @@ def action_export(self): for record in self: record = record.with_context(lang=record.lang) params = record._prepare_export_params() - record.env["delay.export"].with_delay().export(params) + record.env["delay.export"].with_delay().export( + params, + mail_template=record.mail_template_id, + is_export_file_attached_to_email=record.is_export_file_attached_to_email, + ) diff --git a/export_async_schedule/views/export_async_schedule_views.xml b/export_async_schedule/views/export_async_schedule_views.xml index a9a2a3dcaa..332116758e 100644 --- a/export_async_schedule/views/export_async_schedule_views.xml +++ b/export_async_schedule/views/export_async_schedule_views.xml @@ -43,11 +43,17 @@ name="model_id" options="{'no_open': True, 'no_create_edit': True}" /> + + +