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}"
/>
+
+
+