Merge PR #845 into 17.0

Signed-off-by HviorForgeFlow
This commit is contained in:
OCA-git-bot
2025-01-06 12:08:45 +00:00
19 changed files with 1264 additions and 0 deletions

100
sql_export_mail/README.rst Normal file
View File

@@ -0,0 +1,100 @@
===============
SQL Export Mail
===============
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:7545ca6358f23ee0f98d8fa0d2610030bdce7d1dc9a2b1e241be5443612fcf1e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Freporting--engine-lightgray.png?logo=github
:target: https://github.com/OCA/reporting-engine/tree/17.0/sql_export_mail
:alt: OCA/reporting-engine
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/reporting-engine-17-0/reporting-engine-17-0-sql_export_mail
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/reporting-engine&target_branch=17.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
Allow to send the result of a query (made with the module sql_export) by
mail.
**Table of contents**
.. contents::
:local:
Configuration
=============
To configure this module, you need to:
1. Go to the sql query for which you want users to be notified by
e-mail.
2. Add users to be notified in the field Users Notified by e-mail.
3. Click on the button create a cron and then configure the cron to run
when you want to. If you already have created a cron for another
query, you can use it again for other queries
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/reporting-engine/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/reporting-engine/issues/new?body=module:%20sql_export_mail%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
-------
* Akretion
* GRAP
Contributors
------------
- Florian da Costa <florian.dacosta@akretion.com>
- Helly kapatel <helly.kapatel@initos.com>
- Sander Lienaerts <sander.lienaerts@codeforward.nl>
Maintainers
-----------
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
.. |maintainer-legalsylvain| image:: https://github.com/legalsylvain.png?size=40px
:target: https://github.com/legalsylvain
:alt: legalsylvain
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-legalsylvain|
This module is part of the `OCA/reporting-engine <https://github.com/OCA/reporting-engine/tree/17.0/sql_export_mail>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -0,0 +1 @@
from . import models

View File

@@ -0,0 +1,20 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "SQL Export Mail",
"version": "17.0.1.0.0",
"category": "Generic Modules",
"summary": "Send csv file generated by sql query by mail.",
"author": "Akretion,GRAP,Odoo Community Association (OCA)",
"maintainers": ["legalsylvain"],
"website": "https://github.com/OCA/reporting-engine",
"depends": [
"mail",
"sql_export",
],
"license": "AGPL-3",
"data": [
"views/sql_export_view.xml",
"data/mail_template.xml",
],
"installable": True,
}

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<!-- Error Email template -->
<record id="sql_export_mailer" model="mail.template">
<field name="name">SQL Export</field>
<field name="email_from">admin@example.com</field>
<field name="email_to">{{object.get_email_address_for_template()}}</field>
<field name="subject">{{object.name or ''}}</field>
<field name="model_id" ref="sql_export.model_sql_export" />
<field name="auto_delete" eval="True" />
<field name="body_html" type="html">
<div
style="font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; "
>
<p>You will find the report <t
t-out="object.name or ''"
/> as an attachment of the mail.</p>
</div>
</field>
</record>
</odoo>

102
sql_export_mail/i18n/ca.po Normal file
View File

@@ -0,0 +1,102 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sql_export_mail
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#. module: sql_export_mail
#: model:mail.template,body_html:sql_export_mail.sql_export_mailer
msgid ""
"<div style=\"font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-"
"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; \">\n"
"\n"
" <p>You will find the report <t t-out=\"object.name or ''\"></t> as an "
"attachment of the mail.</p>\n"
"\n"
"</div>\n"
" "
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,help:sql_export_mail.field_sql_export__mail_user_ids
msgid ""
"Add the users who want to receive the report by e-mail. You need to link the "
"sql query with a cron to send mail automatically"
msgstr ""
#. module: sql_export_mail
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Create Cron"
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,field_description:sql_export_mail.field_sql_export__cron_ids
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Crons"
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields.selection,name:sql_export_mail.selection__sql_export__mail_condition__not_empty
msgid "File Not Empty"
msgstr ""
#. module: sql_export_mail
#. odoo-python
#: code:addons/sql_export_mail/models/sql_export.py:0
#, python-format
msgid ""
"It is not possible to execute and send a query automatically by mail if "
"there are parameters to fill"
msgstr ""
#. module: sql_export_mail
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Mail"
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,field_description:sql_export_mail.field_sql_export__mail_condition
msgid "Mail Condition"
msgstr ""
#. module: sql_export_mail
#: model:mail.template,name:sql_export_mail.sql_export_mailer
msgid "SQL Export"
msgstr ""
#. module: sql_export_mail
#: model:ir.model,name:sql_export_mail.model_sql_export
msgid "SQL export"
msgstr ""
#. module: sql_export_mail
#. odoo-python
#: code:addons/sql_export_mail/models/sql_export.py:0
#, python-format
msgid "The user does not have any e-mail address."
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,field_description:sql_export_mail.field_sql_export__mail_user_ids
msgid "User to notify"
msgstr ""
#. module: sql_export_mail
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Users Notified by e-mail"
msgstr ""
#. module: sql_export_mail
#: model:mail.template,subject:sql_export_mail.sql_export_mailer
msgid "{{object.name or ''}}"
msgstr ""

136
sql_export_mail/i18n/fr.po Normal file
View File

@@ -0,0 +1,136 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sql_export_mail
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-18 13:15+0000\n"
"PO-Revision-Date: 2017-07-18 13:15+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: sql_export_mail
#: model:mail.template,body_html:sql_export_mail.sql_export_mailer
msgid ""
"<div style=\"font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-"
"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; \">\n"
"\n"
" <p>You will find the report <t t-out=\"object.name or ''\"></t> as an "
"attachment of the mail.</p>\n"
"\n"
"</div>\n"
" "
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,help:sql_export_mail.field_sql_export__mail_user_ids
msgid ""
"Add the users who want to receive the report by e-mail. You need to link the "
"sql query with a cron to send mail automatically"
msgstr ""
"Ajoutez les utilisateurs voulant recevoir le rapport par mail. Vous devez "
"ensuite créer une tâche planifiée pour envoyer le mail automatiquement."
#. module: sql_export_mail
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Create Cron"
msgstr "Créer une tâche planfiée"
#. module: sql_export_mail
#: model:ir.model.fields,field_description:sql_export_mail.field_sql_export__cron_ids
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Crons"
msgstr "Tâches planifiées"
#. module: sql_export_mail
#: model:ir.model.fields.selection,name:sql_export_mail.selection__sql_export__mail_condition__not_empty
msgid "File Not Empty"
msgstr "Fichier non vide."
#. module: sql_export_mail
#. odoo-python
#: code:addons/sql_export_mail/models/sql_export.py:0
#, python-format
msgid ""
"It is not possible to execute and send a query automatically by mail if "
"there are parameters to fill"
msgstr ""
"Il n'est pas possible d'exécuter en envoyer le résultat d'une requête par "
"mail si celle-ci contient des paramètres."
#. module: sql_export_mail
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Mail"
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,field_description:sql_export_mail.field_sql_export__mail_condition
#, fuzzy
msgid "Mail Condition"
msgstr "Condition d'envoi par mail"
#. module: sql_export_mail
#: model:mail.template,name:sql_export_mail.sql_export_mailer
msgid "SQL Export"
msgstr ""
#. module: sql_export_mail
#: model:ir.model,name:sql_export_mail.model_sql_export
msgid "SQL export"
msgstr "Export SQL"
#. module: sql_export_mail
#. odoo-python
#: code:addons/sql_export_mail/models/sql_export.py:0
#, python-format
msgid "The user does not have any e-mail address."
msgstr "L'utilisateur selectionné n'a pas d'addresse mail."
#. module: sql_export_mail
#: model:ir.model.fields,field_description:sql_export_mail.field_sql_export__mail_user_ids
msgid "User to notify"
msgstr "Utilisateurs à notifier par mail"
#. module: sql_export_mail
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Users Notified by e-mail"
msgstr "Utilisateurs notifiés par mail"
#. module: sql_export_mail
#: model:mail.template,subject:sql_export_mail.sql_export_mailer
msgid "{{object.name or ''}}"
msgstr ""
#, fuzzy
#~ msgid ""
#~ "\n"
#~ "<div style=\"font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-"
#~ "serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; "
#~ "\">\n"
#~ "\n"
#~ "<p>You will find the report ${object.name or ''} as an attachment of the "
#~ "mail.</p>\n"
#~ "\n"
#~ "</div>\n"
#~ " "
#~ msgstr ""
#~ "\n"
#~ "<div style=\"font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-"
#~ "serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; "
#~ "\">\n"
#~ "\n"
#~ "<p>Vous trouverez le rapport ${object.name or ''} en pièce jointe de ce "
#~ "mail.</p>\n"
#~ "\n"
#~ "</div>\n"
#~ " "
#~ msgid "${object.name or ''}"
#~ msgstr "${object.name or ''}"

100
sql_export_mail/i18n/it.po Normal file
View File

@@ -0,0 +1,100 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sql_export_mail
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#. module: sql_export_mail
#: model:mail.template,body_html:sql_export_mail.sql_export_mailer
msgid ""
"<div style=\"font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; \">\n"
"\n"
" <p>You will find the report <t t-out=\"object.name or ''\"></t> as an attachment of the mail.</p>\n"
"\n"
"</div>\n"
" "
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,help:sql_export_mail.field_sql_export__mail_user_ids
msgid ""
"Add the users who want to receive the report by e-mail. You need to link the"
" sql query with a cron to send mail automatically"
msgstr ""
#. module: sql_export_mail
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Create Cron"
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,field_description:sql_export_mail.field_sql_export__cron_ids
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Crons"
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields.selection,name:sql_export_mail.selection__sql_export__mail_condition__not_empty
msgid "File Not Empty"
msgstr ""
#. module: sql_export_mail
#. odoo-python
#: code:addons/sql_export_mail/models/sql_export.py:0
#, python-format
msgid ""
"It is not possible to execute and send a query automatically by mail if "
"there are parameters to fill"
msgstr ""
#. module: sql_export_mail
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Mail"
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,field_description:sql_export_mail.field_sql_export__mail_condition
msgid "Mail Condition"
msgstr ""
#. module: sql_export_mail
#: model:mail.template,name:sql_export_mail.sql_export_mailer
msgid "SQL Export"
msgstr ""
#. module: sql_export_mail
#: model:ir.model,name:sql_export_mail.model_sql_export
msgid "SQL export"
msgstr ""
#. module: sql_export_mail
#. odoo-python
#: code:addons/sql_export_mail/models/sql_export.py:0
#, python-format
msgid "The user does not have any e-mail address."
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,field_description:sql_export_mail.field_sql_export__mail_user_ids
msgid "User to notify"
msgstr ""
#. module: sql_export_mail
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Users Notified by e-mail"
msgstr ""
#. module: sql_export_mail
#: model:mail.template,subject:sql_export_mail.sql_export_mailer
msgid "{{object.name or ''}}"
msgstr ""

View File

@@ -0,0 +1,99 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sql_export_mail
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: sql_export_mail
#: model:mail.template,body_html:sql_export_mail.sql_export_mailer
msgid ""
"<div style=\"font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; \">\n"
"\n"
" <p>You will find the report <t t-out=\"object.name or ''\"></t> as an attachment of the mail.</p>\n"
"\n"
"</div>\n"
" "
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,help:sql_export_mail.field_sql_export__mail_user_ids
msgid ""
"Add the users who want to receive the report by e-mail. You need to link the"
" sql query with a cron to send mail automatically"
msgstr ""
#. module: sql_export_mail
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Create Cron"
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,field_description:sql_export_mail.field_sql_export__cron_ids
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Crons"
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields.selection,name:sql_export_mail.selection__sql_export__mail_condition__not_empty
msgid "File Not Empty"
msgstr ""
#. module: sql_export_mail
#. odoo-python
#: code:addons/sql_export_mail/models/sql_export.py:0
#, python-format
msgid ""
"It is not possible to execute and send a query automatically by mail if "
"there are parameters to fill"
msgstr ""
#. module: sql_export_mail
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Mail"
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,field_description:sql_export_mail.field_sql_export__mail_condition
msgid "Mail Condition"
msgstr ""
#. module: sql_export_mail
#: model:mail.template,name:sql_export_mail.sql_export_mailer
msgid "SQL Export"
msgstr ""
#. module: sql_export_mail
#: model:ir.model,name:sql_export_mail.model_sql_export
msgid "SQL export"
msgstr ""
#. module: sql_export_mail
#. odoo-python
#: code:addons/sql_export_mail/models/sql_export.py:0
#, python-format
msgid "The user does not have any e-mail address."
msgstr ""
#. module: sql_export_mail
#: model:ir.model.fields,field_description:sql_export_mail.field_sql_export__mail_user_ids
msgid "User to notify"
msgstr ""
#. module: sql_export_mail
#: model_terms:ir.ui.view,arch_db:sql_export_mail.sql_export_mail_view_form
msgid "Users Notified by e-mail"
msgstr ""
#. module: sql_export_mail
#: model:mail.template,subject:sql_export_mail.sql_export_mailer
msgid "{{object.name or ''}}"
msgstr ""

View File

@@ -0,0 +1 @@
from . import sql_export

View File

@@ -0,0 +1,148 @@
# Copyright 2019 Akretion
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from datetime import datetime, timedelta
from odoo import SUPERUSER_ID, _, api, fields, models
from odoo.exceptions import UserError
class SqlExport(models.Model):
_inherit = "sql.export"
mail_user_ids = fields.Many2many(
"res.users",
"mail_user_sqlquery_rel",
"sql_id",
"user_id",
"User to notify",
help="Add the users who want to receive the report by e-mail. You "
"need to link the sql query with a cron to send mail automatically",
)
cron_ids = fields.Many2many(
"ir.cron",
"cron_sqlquery_rel",
"sql_id",
"cron_id",
"Crons",
groups="base.group_system",
)
# We could implement other conditions, that is why it is a selection field
mail_condition = fields.Selection(
[("not_empty", "File Not Empty")], default="not_empty"
)
def _prepare_cron_mail(self):
self.ensure_one()
return {
"active": True,
"model_id": self.env.ref("sql_export.model_sql_export").id,
"state": "code",
"code": "model._run_all_sql_export_for_cron()",
"name": "SQL Export : %s" % self.name,
"nextcall": datetime.now() + timedelta(hours=2),
"doall": False,
"numbercall": -1,
"user_id": SUPERUSER_ID,
}
def create_cron(self):
self.ensure_one()
cron = self.env["ir.cron"].create(self._prepare_cron_mail())
# We need to pass cron_id in the cron args because a cron is not
# aware of itself in the end method and we need it to find all
# linked sql exports
write_vals = {"code": "model._run_all_sql_export_for_cron([%s])" % cron.id}
cron.write(write_vals)
self.write({"cron_ids": [(4, cron.id)]})
def send_mail(self, params=None):
self.ensure_one()
params = params or {}
mail_template = self.env.ref("sql_export_mail.sql_export_mailer")
attach_obj = self.env["ir.attachment"]
if self.mail_condition == "not_empty":
res = self._execute_sql_request(params=params, mode="fetchone")
if not res:
return
wizard = self.env["sql.file.wizard"].create(
{
"sql_export_id": self.id,
}
)
if "user_id" in params:
wizard = wizard.with_context(force_user=params["user_id"])
if "company_id" in params:
wizard = wizard.with_context(force_company=params["company_id"])
wizard.export_sql()
binary = wizard.binary_file
filename = wizard.file_name
msg_id = mail_template.send_mail(self.id, force_send=False)
mail = self.env["mail.mail"].browse(msg_id)
attach_vals = {
"name": filename,
"datas": binary,
"res_model": "mail.mail",
"res_id": mail.id,
}
attachment = attach_obj.create(attach_vals)
mail.write({"attachment_ids": [(4, attachment.id)]})
@api.model
def _run_all_sql_export_for_cron(self, cron_ids):
exports = self.search([("cron_ids", "in", cron_ids)])
for export in exports:
if "%(company_id)s" in export.query and "%(user_id)s" not in export.query:
variable_dict = {}
companies = self.env["res.company"].search([])
for company in companies:
users = export.mail_user_ids.filtered(
lambda user, company=company: user.company_id == company
)
if users:
variable_dict["company_id"] = users[0].company_id.id
export.with_context(mail_to=users.ids).send_mail(
params=variable_dict
)
elif "%(user_id)s" in export.query:
variable_dict = {}
for user in export.mail_user_ids:
variable_dict["user_id"] = user.id
if "%(company_id)s" in export.query:
variable_dict["company_id"] = user.company_id.id
export.with_context(mail_to=[user.id]).send_mail(
params=variable_dict
)
else:
export.send_mail()
@api.constrains("query_properties_definition", "mail_user_ids")
def check_no_parameter_if_sent_by_mail(self):
for export in self:
if export.query_properties_definition and export.mail_user_ids:
raise UserError(
_(
"It is not possible to execute and send a query "
"automatically by mail if there are parameters to fill"
)
)
@api.constrains("mail_user_ids")
def check_mail_user(self):
for export in self:
for user in export.mail_user_ids:
if not user.email:
raise UserError(_("The user does not have any e-mail address."))
def get_email_address_for_template(self):
"""
Called from mail template
"""
self.ensure_one()
if self.env.context.get("mail_to"):
mail_users = self.env["res.users"].browse(self.env.context.get("mail_to"))
else:
mail_users = self.mail_user_ids
return ",".join([x.email for x in mail_users if x.email])

View File

@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View File

@@ -0,0 +1,8 @@
To configure this module, you need to:
1. Go to the sql query for which you want users to be notified by
e-mail.
2. Add users to be notified in the field Users Notified by e-mail.
3. Click on the button create a cron and then configure the cron to run
when you want to. If you already have created a cron for another
query, you can use it again for other queries

View File

@@ -0,0 +1,3 @@
- Florian da Costa \<<florian.dacosta@akretion.com>\>
- Helly kapatel \<<helly.kapatel@initos.com>\>
- Sander Lienaerts \<<sander.lienaerts@codeforward.nl>\>

View File

@@ -0,0 +1,2 @@
Allow to send the result of a query (made with the module sql_export) by
mail.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,442 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>SQL Export Mail</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="sql-export-mail">
<h1 class="title">SQL Export Mail</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:7545ca6358f23ee0f98d8fa0d2610030bdce7d1dc9a2b1e241be5443612fcf1e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/reporting-engine/tree/17.0/sql_export_mail"><img alt="OCA/reporting-engine" src="https://img.shields.io/badge/github-OCA%2Freporting--engine-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/reporting-engine-17-0/reporting-engine-17-0-sql_export_mail"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/reporting-engine&amp;target_branch=17.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>Allow to send the result of a query (made with the module sql_export) by
mail.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<p>To configure this module, you need to:</p>
<ol class="arabic simple">
<li>Go to the sql query for which you want users to be notified by
e-mail.</li>
<li>Add users to be notified in the field Users Notified by e-mail.</li>
<li>Click on the button create a cron and then configure the cron to run
when you want to. If you already have created a cron for another
query, you can use it again for other queries</li>
</ol>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/reporting-engine/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/reporting-engine/issues/new?body=module:%20sql_export_mail%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>Akretion</li>
<li>GRAP</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Florian da Costa &lt;<a class="reference external" href="mailto:florian.dacosta&#64;akretion.com">florian.dacosta&#64;akretion.com</a>&gt;</li>
<li>Helly kapatel &lt;<a class="reference external" href="mailto:helly.kapatel&#64;initos.com">helly.kapatel&#64;initos.com</a>&gt;</li>
<li>Sander Lienaerts &lt;<a class="reference external" href="mailto:sander.lienaerts&#64;codeforward.nl">sander.lienaerts&#64;codeforward.nl</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/legalsylvain"><img alt="legalsylvain" src="https://github.com/legalsylvain.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/reporting-engine/tree/17.0/sql_export_mail">OCA/reporting-engine</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1 @@
from . import test_sql_query_mail

View File

@@ -0,0 +1,29 @@
# Copyright (C) 2019 Akretion (<http://www.akretion.com>)
# @author: Florian da Costa
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import SUPERUSER_ID, Command
from odoo.tests.common import TransactionCase
class TestExportSqlQueryMail(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.sql_report_demo = cls.env.ref("sql_export.sql_export_partner")
cls.sql_report_demo.mail_user_ids = [Command.link(SUPERUSER_ID)]
def test_sql_query_mail(self):
mail_obj = self.env["mail.mail"]
mails = mail_obj.search(
[("model", "=", "sql.export"), ("res_id", "=", self.sql_report_demo.id)]
)
self.assertFalse(mails)
self.sql_report_demo.create_cron()
self.assertTrue(self.sql_report_demo.cron_ids)
self.sql_report_demo.cron_ids.method_direct_trigger()
mails = mail_obj.search(
[("model", "=", "sql.export"), ("res_id", "=", self.sql_report_demo.id)]
)
self.assertTrue(mails)
self.assertTrue(mails.attachment_ids)

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="sql_export_mail_view_form" model="ir.ui.view">
<field name="model">sql.export</field>
<field name="inherit_id" ref="sql_export.sql_export_view_form" />
<field name="arch" type="xml">
<button name="export_sql_query" position="after">
<button
name="create_cron"
string="Create Cron"
type="object"
invisible="state == 'draft' or not mail_user_ids"
/>
</button>
<field name="copy_options" position="after">
<field
name="mail_condition"
invisible="not cron_ids"
groups="base.group_system"
/>
</field>
<page name="page_sql" position="after">
<page name="page_mail" string="Mail">
<group string="Users Notified by e-mail">
<field
name="mail_user_ids"
nolabel="1"
widget="many2many_tags"
colspan="2"
/>
</group>
<group string="Crons" groups="base.group_system">
<field
name="cron_ids"
nolabel="1"
colspan="2"
domain="[('model_id', '=', 'sql.export')]"
/>
</group>
</page>
</page>
</field>
</record>
</odoo>