Merge PR #878 into 17.0

Signed-off-by HviorForgeFlow
This commit is contained in:
OCA-git-bot
2024-10-01 13:25:28 +00:00
27 changed files with 2510 additions and 0 deletions

140
report_async/README.rst Normal file
View File

@@ -0,0 +1,140 @@
============
Report Async
============
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:49866d2b712288add9819deb8ff6dc8aa180a52463a72789350974bbf10e17ae
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/report_async
: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-report_async
: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|
The new menu "Report Center" is the central place to host your reports
in one place. From here, there are 2 ways to launch the report,
1. Run Now - run report immediately as per normal.
2. Run Background - put the report execution to queue job.
By using the queue job, option 2 is great for long running report. The
report file will be saved for later use, with the option to send report
by email as soon as it is ready.
Notes:
- Only user with Technical Feature rights can manage the report.
- Every internal user will have right to execute the report allowed for
his/her groups.
- The files created are owned and viewable only by the person who run
the report.
- Job queue manager can also see all jobs for each reports.
**Table of contents**
.. contents::
:local:
Usage
=====
Menu: Dashboard > Report Center
As Technical Feature users, you can manage reports for Report Center.
- **Report:** choose the report (a window action). Although the option
show all window actions it only make sense for window actions that
launch reports.
- **Allow Async:** check this, if you want the report to run in
background too, suitable for report that return file as result, i.e.,
pdf/xlsx/csv/txt.
- **Email Notification:** if checked, once the background process is
completed, email with link to download report will be sent.
- **Groups:** select user groups allowed to use this report. If left
blank, all user can use.
As normal user, you can run your reports from Report Center
- **Run Now button:** to run report immediately as per normal.
- **Run Background button:** to run report asynchronously. Fall back to
run now, if not report that produce file.
- **Job Status:** show status of the latest run job. If job fail,
exception error will also shown
- **Files:** show all files being produced by the job as run by the
user.
- **Jobs:** show all jobs triggered by this report as run by the user.
Only job queue manager have access to this button.
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:%20report_async%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
-------
* Ecosoft
Contributors
------------
- `Ecosoft <http://ecosoft.co.th>`__:
- Kitti U. <kittiu@ecosoft.co.th>
- Saran Lim. <saranl@ecosoft.co.th>
- Tharathip Chaweewongphan <tharathipc@ecosoft.co.th>
- Opensourceintegrators
- Daniel Reis <dreis@opensourceintegrators.com>
- Nikul Chaudhary <nchaudhary@opensourceintegrators.com>
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-kittiu| image:: https://github.com/kittiu.png?size=40px
:target: https://github.com/kittiu
:alt: kittiu
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-kittiu|
This module is part of the `OCA/reporting-engine <https://github.com/OCA/reporting-engine/tree/17.0/report_async>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

5
report_async/__init__.py Normal file
View File

@@ -0,0 +1,5 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from . import models
from . import wizard

View File

@@ -0,0 +1,24 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
{
"name": "Report Async",
"summary": "Central place to run reports live or async",
"version": "17.0.1.0.0",
"author": "Ecosoft, Odoo Community Association (OCA)",
"license": "AGPL-3",
"website": "https://github.com/OCA/reporting-engine",
"category": "Generic Modules",
"depends": ["queue_job", "spreadsheet_dashboard"],
"data": [
"security/ir.model.access.csv",
"security/ir_rule.xml",
"data/mail_template.xml",
"data/queue_job_function_data.xml",
"views/report_async.xml",
"wizard/print_report_wizard.xml",
],
"demo": ["demo/report_async_demo.xml"],
"installable": True,
"maintainers": ["kittiu"],
"development_status": "Beta",
}

View File

@@ -0,0 +1,69 @@
<odoo noupdate="1">
<record id="async_report_delivery" model="mail.template">
<field name="name">Report Async: New Report Available</field>
<field name="model_id" ref="base.model_ir_attachment" />
<field name="subject">Your report is available, ${object.name}</field>
<field
name="email_from"
>${object.company_id.partner_id.email_formatted|safe}</field>
<field name="partner_to">{{ user.partner_id.id }}</field>
<field name="body_html" type="html">
<table
border="0"
cellpadding="0"
cellspacing="0"
style="background-color: #F1F1F1; font-family:Verdana, Arial,sans-serif; color: #454748; width: 100%; border-collapse:separate;"
>
<tr>
<td align="center">
<table
border="0"
cellpadding="0"
cellspacing="0"
width="590"
style="padding: 16px; background-color: white; color: #454748; border-collapse:separate;"
>
<tbody>
<tr>
<td align="center" style="min-width: 590px;">
<table
border="0"
cellpadding="0"
cellspacing="0"
width="590"
style="min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;"
>
<tr>
<td
valign="top"
style="font-size: 13px;"
>
% set base_url = object.env['ir.config_parameter'].sudo().get_param('web.base.url')
% set download_url = '%s/web/content/ir.attachment/%s/datas/%s?download=true' % (base_url, object.id, object.name, )
<div>
Dear ${object.create_uid.partner_id.name or ''},
<br /><br />
Your requested report, ${object.name}, is available for <b
>
<a
href='${download_url}'
>download</a>
</b>.
<br /><br />
Have a nice day!<br />
--<br />${object.company_id.name}
</div>
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</table>
</field>
<field name="auto_delete" eval="True" />
</record>
</odoo>

View File

@@ -0,0 +1,6 @@
<odoo noupdate="1">
<record id="job_function_report_async_run_report" model="queue.job.function">
<field name="model_id" ref="report_async.model_report_async" />
<field name="method">run_report</field>
</record>
</odoo>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="report_async_print_document" model="report.async">
<field name="action_id" eval="ref('report_async.action_print_report_wizard')" />
<field name="allow_async" eval="0" />
</record>
</odoo>

416
report_async/i18n/es.po Normal file
View File

@@ -0,0 +1,416 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * report_async
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-09-02 20:42+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
"Language-Team: none\n"
"Language: es\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"
"X-Generator: Weblate 4.17\n"
#. module: report_async
#: model:mail.template,body_html:report_async.async_report_delivery
msgid ""
"<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"background-"
"color: #F1F1F1; font-family:Verdana, Arial,sans-serif; color: #454748; "
"width: 100%; border-collapse:separate;\">\n"
" <tr>\n"
" <td align=\"center\">\n"
" <table border=\"0\" cellpadding=\"0\" cellspacing="
"\"0\" width=\"590\" style=\"padding: 16px; background-color: white; color: "
"#454748; border-collapse:separate;\">\n"
" <tbody>\n"
" <tr>\n"
" <td align=\"center\" style=\"min-width: "
"590px;\">\n"
" <table border=\"0\" cellpadding="
"\"0\" cellspacing=\"0\" width=\"590\" style=\"min-width: 590px; background-"
"color: white; padding: 0px 8px 0px 8px; border-collapse:separate;\">\n"
" <tr>\n"
" <td valign=\"top\" style="
"\"font-size: 13px;\">\n"
" % set base_url = object.env['ir."
"config_parameter'].sudo().get_param('web.base.url')\n"
" % set download_url = '%s/web/content/ir."
"attachment/%s/datas/%s?download=true' % (base_url, object.id, object."
"name, )\n"
" <div>\n"
" Dear ${object.create_uid.partner_id."
"name or ''},\n"
" <br><br>\n"
" Your requested report, ${object."
"name}, is available for <b>\n"
" <a href="
"\"%24%7Bdownload_url%7D\">download</a>\n"
" </b>.\n"
" <br><br>\n"
" Have a nice day!<br>\n"
" --<br>${object.company_id.name}\n"
" </div>\n"
" </td>\n"
" </tr>\n"
" </table>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </td>\n"
" </tr>\n"
" </table>\n"
" "
msgstr ""
"<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"background-"
"color: #F1F1F1; font-family:Verdana, Arial,sans-serif; color: #454748; "
"width: 100%; border-collapse:separate;\">\n"
" <tr>\n"
" <td align=\"center\">\n"
" <table border=\"0\" cellpadding=\"0\" cellspacing="
"\"0\" width=\"590\" style=\"padding: 16px; background-color: white; color: "
"#454748; border-collapse:separate;\">\n"
" <tbody>\n"
" <tr>\n"
" <td align=\"center\" style=\"min-width: "
"590px;\">\n"
" <table border=\"0\" cellpadding="
"\"0\" cellspacing=\"0\" width=\"590\" style=\"min-width: 590px; background-"
"color: white; padding: 0px 8px 0px 8px; border-collapse:separate;\">\n"
" <tr>\n"
" <td valign=\"top\" style="
"\"font-size: 13px;\">\n"
" % set base_url = object.env['ir."
"config_parameter'].sudo().get_param('web.base.url')\n"
" % set download_url = '%s/web/content/ir."
"attachment/%s/datas/%s?download=true' % (base_url, object.id, object."
"name, )\n"
" <div>\n"
" Estimado ${object.create_uid."
"partner_id.name or ''},\n"
" <br><br>\n"
" Su informe solicitado, ${object."
"name}, está disponible para<b>\n"
" <a href="
"\"%24%7Bdownload_url%7D\">descargar</a>\n"
" </b>.\n"
" <br><br>\n"
" ¡Que tenga un buen día!<br>\n"
" --<br>${object.company_id.name}\n"
" </div>\n"
" </td>\n"
" </tr>\n"
" </table>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </td>\n"
" </tr>\n"
" </table>\n"
" "
#. module: report_async
#: model:ir.model,name:report_async.model_ir_actions_act_window
msgid "Action Window"
msgstr "Ventana de acción"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__allow_async
msgid "Allow Async"
msgstr "Permitir Async"
#. module: report_async
#. odoo-python
#: code:addons/report_async/models/report_async.py:0
#, python-format
msgid "Background process not allowed."
msgstr "Proceso en segundo plano no permitido."
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.print_report_wizard
msgid "Cancel"
msgstr "Cancelar"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__create_uid
#: model:ir.model.fields,field_description:report_async.field_report_async__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__create_date
#: model:ir.model.fields,field_description:report_async.field_report_async__create_date
msgid "Created on"
msgstr "Creado el"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__display_name
#: model:ir.model.fields,field_description:report_async.field_report_async__display_name
msgid "Display Name"
msgstr "Mostrar Nombre"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__reference
msgid "Document"
msgstr "Documento"
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__done
msgid "Done"
msgstr "Hecho"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__email_notify
msgid "Email Notification"
msgstr "Notificación de correo electrónico"
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__enqueued
msgid "Enqueued"
msgstr "En la cola"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.print_report_wizard
msgid "Execute"
msgstr "Ejecutar"
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__failed
msgid "Failed"
msgstr "Fallido"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__file_ids
msgid "File"
msgstr "Fichero"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_tree
msgid "Files"
msgstr "Ficheros"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__group_ids
msgid "Groups"
msgstr "Grupos"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__id
#: model:ir.model.fields,field_description:report_async.field_report_async__id
msgid "ID"
msgstr "ID (identificación)"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__job_ids
msgid "Job"
msgstr "Trabajo"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__job_info
msgid "Job Info"
msgstr "información laboral"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__job_status
msgid "Job Status"
msgstr "Estado Laboral"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid "Jobs"
msgstr "Trabajos"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard____last_update
#: model:ir.model.fields,field_description:report_async.field_report_async____last_update
msgid "Last Modified on"
msgstr "Última Modificación el"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid "Last Run Job Error"
msgstr "Error en el último trabajo ejecutado"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__write_uid
#: model:ir.model.fields,field_description:report_async.field_report_async__write_uid
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__write_date
#: model:ir.model.fields,field_description:report_async.field_report_async__write_date
msgid "Last Updated on"
msgstr "Última Actualización el"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__job_info
msgid "Latest Job Error Message"
msgstr "Último mensaje de error del trabajo"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__job_status
msgid "Latest Job Status"
msgstr "Último estado del trabajo"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__file_ids
msgid "List all files created by this report background process"
msgstr ""
"Lista de todos los archivos creados por este proceso de fondo de informe"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__job_ids
msgid "List all jobs related to this running report"
msgstr "Lista de todos los trabajos relacionados con este informe en ejecución"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__name
msgid "Name"
msgstr "Nombre"
#. module: report_async
#: model_terms:ir.actions.act_window,help:report_async.action_view_files
msgid "No files found"
msgstr "No se han encontrado archivos"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__group_ids
msgid ""
"Only user in selected groups can use this report.If left blank, everyone can "
"use"
msgstr ""
"Sólo los usuarios de grupos seleccionados pueden utilizar este informe. Si "
"se deja en blanco, todos pueden utilizarlo"
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__pending
msgid "Pending"
msgstr "Pendiente"
#. module: report_async
#: model:ir.actions.act_window,name:report_async.action_print_report_wizard
msgid "Print Document"
msgstr "Imprimir documento"
#. module: report_async
#: model:ir.model,name:report_async.model_print_report_wizard
msgid "Print Report Wizard"
msgstr "Asistente para la impresión de informes"
#. module: report_async
#: model:ir.model,name:report_async.model_ir_actions_report
msgid "Report Action"
msgstr "Informar Acción"
#. module: report_async
#: model:ir.model,name:report_async.model_report_async
msgid "Report Async"
msgstr "Informe Async"
#. module: report_async
#: model:mail.template,name:report_async.async_report_delivery
msgid "Report Async: New Report Available"
msgstr "Informe Async: Nuevo informe disponible"
#. module: report_async
#: model:ir.actions.act_window,name:report_async.action_report_async
#: model:ir.ui.menu,name:report_async.menu_report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_search
msgid "Report Center"
msgstr "Centro de informes"
#. module: report_async
#: model:ir.actions.act_window,name:report_async.action_view_files
msgid "Report Files"
msgstr "Archivos de informes"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__action_report_id
msgid "Report Template"
msgstr "Plantilla de informe"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__action_id
msgid "Reports"
msgstr "Informes"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_tree
msgid "Run Background"
msgstr "Fondo de ejecución"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_tree
msgid "Run Now"
msgstr "Ejecutar ahora"
#. module: report_async
#: model_terms:ir.actions.act_window,help:report_async.action_report_async
msgid "Run reports asyncronously"
msgstr "Ejecutar informes de forma asíncrona"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__email_notify
msgid "Send email with link to report, when it is ready"
msgstr "Enviar correo electrónico con enlace al informe, cuando esté listo"
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__started
msgid "Started"
msgstr "Iniciado"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid ""
"The last <i class=\"fa fa-cogs\"/> <b>running job</b> was failed.\n"
" Please contact your system administrator."
msgstr ""
"El último <i class=\"fa fa-cogs\"/> <b>trabajo en ejecución</b> ha fallado.\n"
" Póngase en contacto con el administrador del sistema."
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid ""
"The last <i class=\"fa fa-cogs\"/> <b>running job</b> was succeed.\n"
" You can check the result in <i class=\"fa fa-copy\"/"
"><b> Files</b>"
msgstr ""
"El último <i class=\"fa fa-cogs\"/> <b>trabajo en ejecución</b> fué "
"exitoso.\n"
" Puede comprobar el resultado en <i class=\"fa fa-copy"
"\"/><b> Archivos</b>"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid ""
"The report will be running by <i class=\"fa fa-cogs\"/>\n"
" <b>job</b>, and will be available at\n"
" <i class=\"fa fa-copy\"/><b> Files</b>"
msgstr ""
"El informe se ejecutará por <i class=\"fa fa-cogs\"/>\n"
" <b>trabajo</b>, y estará disponible en\n"
" <i class=\"fa fa-copy\"/><b> Archivos</b>"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__allow_async
msgid ""
"This is not automatic field, please check if you want to allow this report "
"in background process"
msgstr ""
"Este campo no es automático, por favor marque si desea permitir este informe "
"en proceso de fondo"
#. module: report_async
#: model:mail.template,subject:report_async.async_report_delivery
msgid "Your report is available, ${object.name}"
msgstr "Su informe está disponible, ${object.name}"

400
report_async/i18n/it.po Normal file
View File

@@ -0,0 +1,400 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * report_async
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-01-18 09:34+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\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"
"X-Generator: Weblate 4.17\n"
#. module: report_async
#: model:mail.template,body_html:report_async.async_report_delivery
msgid ""
"<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"background-color: #F1F1F1; font-family:Verdana, Arial,sans-serif; color: #454748; width: 100%; border-collapse:separate;\">\n"
" <tr>\n"
" <td align=\"center\">\n"
" <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"590\" style=\"padding: 16px; background-color: white; color: #454748; border-collapse:separate;\">\n"
" <tbody>\n"
" <tr>\n"
" <td align=\"center\" style=\"min-width: 590px;\">\n"
" <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"590\" style=\"min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;\">\n"
" <tr>\n"
" <td valign=\"top\" style=\"font-size: 13px;\">\n"
" % set base_url = object.env['ir.config_parameter'].sudo().get_param('web.base.url')\n"
" % set download_url = '%s/web/content/ir.attachment/%s/datas/%s?download=true' % (base_url, object.id, object.name, )\n"
" <div>\n"
" Dear ${object.create_uid.partner_id.name or ''},\n"
" <br><br>\n"
" Your requested report, ${object.name}, is available for <b>\n"
" <a href=\"%24%7Bdownload_url%7D\">download</a>\n"
" </b>.\n"
" <br><br>\n"
" Have a nice day!<br>\n"
" --<br>${object.company_id.name}\n"
" </div>\n"
" </td>\n"
" </tr>\n"
" </table>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </td>\n"
" </tr>\n"
" </table>\n"
" "
msgstr ""
"<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"background-"
"color: #F1F1F1; font-family:Verdana, Arial,sans-serif; color: #454748; width:"
" 100%; border-collapse:separate;\">\n"
" <tr>\n"
" <td align=\"center\">\n"
" <table border=\"0\" cellpadding=\"0\" cellspacing=\"0"
"\" width=\"590\" style=\"padding: 16px; background-color: white; color: "
"#454748; border-collapse:separate;\">\n"
" <tbody>\n"
" <tr>\n"
" <td align=\"center\" style=\"min-width: "
"590px;\">\n"
" <table border=\"0\" cellpadding=\"0\""
" cellspacing=\"0\" width=\"590\" style=\"min-width: 590px; background-color: "
"white; padding: 0px 8px 0px 8px; border-collapse:separate;\">\n"
" <tr>\n"
" <td valign=\"top\" style"
"=\"font-size: 13px;\">\n"
" % set base_url = object.env['ir."
"config_parameter'].sudo().get_param('web.base.url')\n"
" % set download_url = '%s/web/content/ir."
"attachment/%s/datas/%s?download=true' % (base_url, object.id, object.name, )"
"\n"
" <div>\n"
" Spettabile ${"
"object.create_uid.partner_id.name or ''},\n"
" <br><br>\n"
" la sua richiesta resoconto, ${object."
"name}, is available for <b>\n"
" <a href=\""
"%24%7Bdownload_url%7D\">scaricare</a>\n"
" </b>.\n"
" <br><br>\n"
" Buona giornata!<br>\n"
" --<br>${object.company_id.name}\n"
" </div>\n"
" </td>\n"
" </tr>\n"
" </table>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </td>\n"
" </tr>\n"
" </table>\n"
" "
#. module: report_async
#: model:ir.model,name:report_async.model_ir_actions_act_window
msgid "Action Window"
msgstr "Azione finestra"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__allow_async
msgid "Allow Async"
msgstr "Permetti asincrono"
#. module: report_async
#. odoo-python
#: code:addons/report_async/models/report_async.py:0
#, python-format
msgid "Background process not allowed."
msgstr "Processo in background non permesso."
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.print_report_wizard
msgid "Cancel"
msgstr "Annulla"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__create_uid
#: model:ir.model.fields,field_description:report_async.field_report_async__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__create_date
#: model:ir.model.fields,field_description:report_async.field_report_async__create_date
msgid "Created on"
msgstr "Creato il"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__display_name
#: model:ir.model.fields,field_description:report_async.field_report_async__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__reference
msgid "Document"
msgstr "Documento"
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__done
msgid "Done"
msgstr "Completato"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__email_notify
msgid "Email Notification"
msgstr "Notifica e-mail"
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__enqueued
msgid "Enqueued"
msgstr "In coda"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.print_report_wizard
msgid "Execute"
msgstr "Esegui"
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__failed
msgid "Failed"
msgstr "Fallito"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__file_ids
msgid "File"
msgstr "File"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_tree
msgid "Files"
msgstr "File"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__group_ids
msgid "Groups"
msgstr "Gruppi"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__id
#: model:ir.model.fields,field_description:report_async.field_report_async__id
msgid "ID"
msgstr "ID"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__job_ids
msgid "Job"
msgstr "Lavoro"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__job_info
msgid "Job Info"
msgstr "Info lavoro"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__job_status
msgid "Job Status"
msgstr "Stato lavoro"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid "Jobs"
msgstr "Lavori"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard____last_update
#: model:ir.model.fields,field_description:report_async.field_report_async____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid "Last Run Job Error"
msgstr "Errore ultimo lavoro lanciato"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__write_uid
#: model:ir.model.fields,field_description:report_async.field_report_async__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__write_date
#: model:ir.model.fields,field_description:report_async.field_report_async__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__job_info
msgid "Latest Job Error Message"
msgstr "Messaggio errore ultimo lavoro"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__job_status
msgid "Latest Job Status"
msgstr "Stato ultimo lavoro"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__file_ids
msgid "List all files created by this report background process"
msgstr "Elenca tutti i files creati da questo processo in background di stampa"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__job_ids
msgid "List all jobs related to this running report"
msgstr "Elenca tutti i lavori relativi a questa stampa in corso"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__name
msgid "Name"
msgstr "Nome"
#. module: report_async
#: model_terms:ir.actions.act_window,help:report_async.action_view_files
msgid "No files found"
msgstr "Nessun file trovato"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__group_ids
msgid ""
"Only user in selected groups can use this report.If left blank, everyone can"
" use"
msgstr ""
"Solo gli utenti in certi gruppi possono usare questa stampa. Se lasciato "
"vuoto, può essere usato da tutti"
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__pending
msgid "Pending"
msgstr "In attesa"
#. module: report_async
#: model:ir.actions.act_window,name:report_async.action_print_report_wizard
msgid "Print Document"
msgstr "Stampa documento"
#. module: report_async
#: model:ir.model,name:report_async.model_print_report_wizard
msgid "Print Report Wizard"
msgstr "Procedura guidata stampa resoconto"
#. module: report_async
#: model:ir.model,name:report_async.model_ir_actions_report
msgid "Report Action"
msgstr "Azione resoconto"
#. module: report_async
#: model:ir.model,name:report_async.model_report_async
msgid "Report Async"
msgstr "Resoconto asincrono"
#. module: report_async
#: model:mail.template,name:report_async.async_report_delivery
msgid "Report Async: New Report Available"
msgstr "Resoconto asincrono: nuovo resoconto disponibile"
#. module: report_async
#: model:ir.actions.act_window,name:report_async.action_report_async
#: model:ir.ui.menu,name:report_async.menu_report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_search
msgid "Report Center"
msgstr "Centro resoconti"
#. module: report_async
#: model:ir.actions.act_window,name:report_async.action_view_files
msgid "Report Files"
msgstr "File resoconti"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__action_report_id
msgid "Report Template"
msgstr "Modello resoconto"
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__action_id
msgid "Reports"
msgstr "Resoconti"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_tree
msgid "Run Background"
msgstr "Lancia in background"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_tree
msgid "Run Now"
msgstr "Esegui adesso"
#. module: report_async
#: model_terms:ir.actions.act_window,help:report_async.action_report_async
msgid "Run reports asyncronously"
msgstr "Esegui resoconti in modo asincrono"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__email_notify
msgid "Send email with link to report, when it is ready"
msgstr "Invia una e-mail con il link al resoconto, quando è pronto"
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__started
msgid "Started"
msgstr "Iniziato"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid ""
"The last <i class=\"fa fa-cogs\"/> <b>running job</b> was failed.\n"
" Please contact your system administrator."
msgstr ""
"L'ultimo <i class=\"fa fa-cogs\"/> <b>lavoro lanciato</b> è fallito.\n"
" Contattare l'amministratore di sistema."
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid ""
"The last <i class=\"fa fa-cogs\"/> <b>running job</b> was succeed.\n"
" You can check the result in <i class=\"fa fa-copy\"/><b> Files</b>"
msgstr ""
"L'ultimo <i class=\"fa fa-cogs\"/> <b>lavoro lanciato</b> è andato a buon "
"fine.\n"
" Si può verificare il risultato nei <i class=\"fa fa-"
"copy\"/><b> file</b>"
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid ""
"The report will be running by <i class=\"fa fa-cogs\"/>\n"
" <b>job</b>, and will be available at\n"
" <i class=\"fa fa-copy\"/><b> Files</b>"
msgstr ""
"Il resoconto verrà eseguito in un <i class=\"fa fa-cogs\"/>\n"
" <b>lavoro</b>, e sarà disponibile nei\n"
" <i class=\"fa fa-copy\"/><b> file</b>"
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__allow_async
msgid ""
"This is not automatic field, please check if you want to allow this report "
"in background process"
msgstr ""
"Questo non è un campo automatico, controllare se si vuole permettere quest "
"resoconto nel processo in background"
#. module: report_async
#: model:mail.template,subject:report_async.async_report_delivery
msgid "Your report is available, ${object.name}"
msgstr "Il tuo resoconto è ponto, ${object.name}"

View File

@@ -0,0 +1,337 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * report_async
#
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: report_async
#: model:mail.template,body_html:report_async.async_report_delivery
msgid ""
"<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"background-color: #F1F1F1; font-family:Verdana, Arial,sans-serif; color: #454748; width: 100%; border-collapse:separate;\">\n"
" <tr>\n"
" <td align=\"center\">\n"
" <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"590\" style=\"padding: 16px; background-color: white; color: #454748; border-collapse:separate;\">\n"
" <tbody>\n"
" <tr>\n"
" <td align=\"center\" style=\"min-width: 590px;\">\n"
" <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"590\" style=\"min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;\">\n"
" <tr>\n"
" <td valign=\"top\" style=\"font-size: 13px;\">\n"
" % set base_url = object.env['ir.config_parameter'].sudo().get_param('web.base.url')\n"
" % set download_url = '%s/web/content/ir.attachment/%s/datas/%s?download=true' % (base_url, object.id, object.name, )\n"
" <div>\n"
" Dear ${object.create_uid.partner_id.name or ''},\n"
" <br><br>\n"
" Your requested report, ${object.name}, is available for <b>\n"
" <a href=\"%24%7Bdownload_url%7D\">download</a>\n"
" </b>.\n"
" <br><br>\n"
" Have a nice day!<br>\n"
" --<br>${object.company_id.name}\n"
" </div>\n"
" </td>\n"
" </tr>\n"
" </table>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </td>\n"
" </tr>\n"
" </table>\n"
" "
msgstr ""
#. module: report_async
#: model:ir.model,name:report_async.model_ir_actions_act_window
msgid "Action Window"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__allow_async
msgid "Allow Async"
msgstr ""
#. module: report_async
#. odoo-python
#: code:addons/report_async/models/report_async.py:0
#, python-format
msgid "Background process not allowed."
msgstr ""
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.print_report_wizard
msgid "Cancel"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__create_uid
#: model:ir.model.fields,field_description:report_async.field_report_async__create_uid
msgid "Created by"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__create_date
#: model:ir.model.fields,field_description:report_async.field_report_async__create_date
msgid "Created on"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__display_name
#: model:ir.model.fields,field_description:report_async.field_report_async__display_name
msgid "Display Name"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__reference
msgid "Document"
msgstr ""
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__done
msgid "Done"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__email_notify
msgid "Email Notification"
msgstr ""
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__enqueued
msgid "Enqueued"
msgstr ""
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.print_report_wizard
msgid "Execute"
msgstr ""
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__failed
msgid "Failed"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__file_ids
msgid "File"
msgstr ""
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_tree
msgid "Files"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__group_ids
msgid "Groups"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__id
#: model:ir.model.fields,field_description:report_async.field_report_async__id
msgid "ID"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__job_ids
msgid "Job"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__job_info
msgid "Job Info"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__job_status
msgid "Job Status"
msgstr ""
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid "Jobs"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard____last_update
#: model:ir.model.fields,field_description:report_async.field_report_async____last_update
msgid "Last Modified on"
msgstr ""
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid "Last Run Job Error"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__write_uid
#: model:ir.model.fields,field_description:report_async.field_report_async__write_uid
msgid "Last Updated by"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__write_date
#: model:ir.model.fields,field_description:report_async.field_report_async__write_date
msgid "Last Updated on"
msgstr ""
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__job_info
msgid "Latest Job Error Message"
msgstr ""
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__job_status
msgid "Latest Job Status"
msgstr ""
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__file_ids
msgid "List all files created by this report background process"
msgstr ""
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__job_ids
msgid "List all jobs related to this running report"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__name
msgid "Name"
msgstr ""
#. module: report_async
#: model_terms:ir.actions.act_window,help:report_async.action_view_files
msgid "No files found"
msgstr ""
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__group_ids
msgid ""
"Only user in selected groups can use this report.If left blank, everyone can"
" use"
msgstr ""
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__pending
msgid "Pending"
msgstr ""
#. module: report_async
#: model:ir.actions.act_window,name:report_async.action_print_report_wizard
msgid "Print Document"
msgstr ""
#. module: report_async
#: model:ir.model,name:report_async.model_print_report_wizard
msgid "Print Report Wizard"
msgstr ""
#. module: report_async
#: model:ir.model,name:report_async.model_ir_actions_report
msgid "Report Action"
msgstr ""
#. module: report_async
#: model:ir.model,name:report_async.model_report_async
msgid "Report Async"
msgstr ""
#. module: report_async
#: model:mail.template,name:report_async.async_report_delivery
msgid "Report Async: New Report Available"
msgstr ""
#. module: report_async
#: model:ir.actions.act_window,name:report_async.action_report_async
#: model:ir.ui.menu,name:report_async.menu_report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_search
msgid "Report Center"
msgstr ""
#. module: report_async
#: model:ir.actions.act_window,name:report_async.action_view_files
msgid "Report Files"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_print_report_wizard__action_report_id
msgid "Report Template"
msgstr ""
#. module: report_async
#: model:ir.model.fields,field_description:report_async.field_report_async__action_id
msgid "Reports"
msgstr ""
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_tree
msgid "Run Background"
msgstr ""
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_tree
msgid "Run Now"
msgstr ""
#. module: report_async
#: model_terms:ir.actions.act_window,help:report_async.action_report_async
msgid "Run reports asyncronously"
msgstr ""
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__email_notify
msgid "Send email with link to report, when it is ready"
msgstr ""
#. module: report_async
#: model:ir.model.fields.selection,name:report_async.selection__report_async__job_status__started
msgid "Started"
msgstr ""
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid ""
"The last <i class=\"fa fa-cogs\"/> <b>running job</b> was failed.\n"
" Please contact your system administrator."
msgstr ""
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid ""
"The last <i class=\"fa fa-cogs\"/> <b>running job</b> was succeed.\n"
" You can check the result in <i class=\"fa fa-copy\"/><b> Files</b>"
msgstr ""
#. module: report_async
#: model_terms:ir.ui.view,arch_db:report_async.view_report_async_form
msgid ""
"The report will be running by <i class=\"fa fa-cogs\"/>\n"
" <b>job</b>, and will be available at\n"
" <i class=\"fa fa-copy\"/><b> Files</b>"
msgstr ""
#. module: report_async
#: model:ir.model.fields,help:report_async.field_report_async__allow_async
msgid ""
"This is not automatic field, please check if you want to allow this report "
"in background process"
msgstr ""
#. module: report_async
#: model:mail.template,subject:report_async.async_report_delivery
msgid "Your report is available, ${object.name}"
msgstr ""

View File

@@ -0,0 +1,6 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from . import report_async
from . import ir_report
from . import ir_actions

View File

@@ -0,0 +1,26 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from odoo import SUPERUSER_ID, api, models
class IrActionsActWindow(models.Model):
_inherit = "ir.actions.act_window"
@api.model
def name_search(self, name, args=None, operator="ilike", limit=100):
if self._context.get("access_sudo", False):
self = self.with_user(SUPERUSER_ID)
return super().name_search(name, args, operator, limit)
@api.model
def search(self, args, offset=0, limit=None, order=None):
if self._context.get("access_sudo", False):
self = self.with_user(SUPERUSER_ID)
return super().search(args, offset, limit, order)
def fetch(self, field_names):
"""Add permission to read analytic account for do something."""
if self._context.get("access_sudo", False):
self = self.with_user(SUPERUSER_ID)
return super().fetch(field_names)

View File

@@ -0,0 +1,23 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from odoo import models
# Define all supported report_type
REPORT_TYPES = ["qweb-pdf", "qweb-text", "qweb-xml", "csv", "excel", "xlsx"]
class Report(models.Model):
_inherit = "ir.actions.report"
def report_action(self, docids, data=None, config=True):
res = super().report_action(docids, data=data, config=config)
if res["context"].get("async_process", False):
rpt_async_id = res["context"]["active_id"]
report_async = self.env["report.async"].browse(rpt_async_id)
if res["report_type"] in REPORT_TYPES:
report_async.with_delay().run_report(
res["context"].get("active_ids", []), data, self.id, self._uid
)
return {}
return res

View File

@@ -0,0 +1,176 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
import base64
from odoo import SUPERUSER_ID, _, api, fields, models
from odoo.exceptions import UserError
from odoo.tools.safe_eval import safe_eval
# Define all supported report_type
REPORT_TYPES_FUNC = {
"qweb-pdf": "_render_qweb_pdf",
"qweb-text": "_render_qweb_text",
"qweb-xml": "_render_qweb_xml",
"csv": "_render_csv",
"excel": "render_excel",
"xlsx": "_render_xlsx",
}
class ReportAsync(models.Model):
_name = "report.async"
_description = "Report Async"
action_id = fields.Many2one(
comodel_name="ir.actions.act_window",
string="Reports",
required=True,
)
allow_async = fields.Boolean(
default=False,
help="This is not automatic field, please check if you want to allow "
"this report in background process",
)
name = fields.Char(
string="Name",
related="action_id.display_name",
)
email_notify = fields.Boolean(
string="Email Notification",
help="Send email with link to report, when it is ready",
)
group_ids = fields.Many2many(
string="Groups",
comodel_name="res.groups",
help="Only user in selected groups can use this report."
"If left blank, everyone can use",
)
job_ids = fields.Many2many(
comodel_name="queue.job",
compute="_compute_job",
help="List all jobs related to this running report",
)
job_status = fields.Selection(
selection=[
("pending", "Pending"),
("enqueued", "Enqueued"),
("started", "Started"),
("done", "Done"),
("failed", "Failed"),
],
compute="_compute_job",
help="Latest Job Status",
)
job_info = fields.Text(
compute="_compute_job",
help="Latest Job Error Message",
)
file_ids = fields.Many2many(
comodel_name="ir.attachment",
compute="_compute_file",
help="List all files created by this report background process",
)
def _compute_job(self):
for rec in self:
rec.job_ids = (
self.sudo()
.env["queue.job"]
.search(
[
("func_string", "like", "report.async(%s,)" % rec.id),
("user_id", "=", self._uid),
],
order="id desc",
)
)
rec.job_status = rec.job_ids[0].sudo().state if rec.job_ids else False
rec.job_info = rec.job_ids[0].sudo().exc_info if rec.job_ids else False
def _compute_file(self):
files = self.env["ir.attachment"].search(
[
("res_model", "=", "report.async"),
("res_id", "in", self.ids),
("create_uid", "=", self._uid),
],
order="id desc",
)
for rec in self:
rec.file_ids = files.filtered(lambda file, rec=rec: file.res_id == rec.id)
def run_now(self):
self.ensure_one()
result = self.env[self.action_id.type]._for_xml_id(self.action_id.xml_id)
ctx = safe_eval(result.get("context", {}))
ctx.update({"async_process": False})
result["context"] = ctx
return result
def run_async(self):
self.ensure_one()
if not self.allow_async:
raise UserError(_("Background process not allowed."))
result = self.env[self.action_id.type]._for_xml_id(self.action_id.xml_id)
ctx = safe_eval(result.get("context", {}))
ctx.update({"async_process": True})
result["context"] = ctx
return result
def view_files(self):
self.ensure_one()
result = self.env["ir.actions.act_window"]._for_xml_id(
"report_async.action_view_files"
)
result["domain"] = [("id", "in", self.file_ids.ids)]
return result
def view_jobs(self):
self.ensure_one()
result = self.env["ir.actions.act_window"]._for_xml_id(
"queue_job.action_queue_job"
)
result["domain"] = [("id", "in", self.job_ids.ids)]
result["context"] = {}
return result
@api.model
def run_report(self, docids, data, report_id, user_id):
report = self.env["ir.actions.report"].browse(report_id)
func = REPORT_TYPES_FUNC[report.report_type]
# Run report
out_file, file_ext = getattr(report, func)(report.xml_id, docids, data)
out_file = base64.b64encode(out_file)
out_name = f"{report.name}.{file_ext}"
# Save report to attachment
attachment = (
self.env["ir.attachment"]
.with_user(SUPERUSER_ID)
.create(
{
"name": out_name,
"datas": out_file,
"type": "binary",
"res_model": "report.async",
"res_id": self.id,
}
)
)
self._cr.execute(
"""
UPDATE ir_attachment SET create_uid = %s, write_uid = %s
WHERE id = %s""",
(self._uid, self._uid, attachment.id),
)
# Send email
if self.email_notify:
self._send_email(attachment)
def _send_email(self, attachment):
template = self.env.ref("report_async.async_report_delivery")
template.send_mail(
attachment.id,
email_layout_xmlid="mail.mail_notification_light",
force_send=False,
)

View File

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

View File

@@ -0,0 +1,7 @@
- [Ecosoft](http://ecosoft.co.th):
- Kitti U. \<<kittiu@ecosoft.co.th>\>
- Saran Lim. \<<saranl@ecosoft.co.th>\>
- Tharathip Chaweewongphan \<<tharathipc@ecosoft.co.th>\>
- Opensourceintegrators
- Daniel Reis \<<dreis@opensourceintegrators.com>\>
- Nikul Chaudhary \<<nchaudhary@opensourceintegrators.com>\>

View File

@@ -0,0 +1,18 @@
The new menu "Report Center" is the central place to host your reports
in one place. From here, there are 2 ways to launch the report,
1. Run Now - run report immediately as per normal.
2. Run Background - put the report execution to queue job.
By using the queue job, option 2 is great for long running report. The
report file will be saved for later use, with the option to send report
by email as soon as it is ready.
Notes:
- Only user with Technical Feature rights can manage the report.
- Every internal user will have right to execute the report allowed for
his/her groups.
- The files created are owned and viewable only by the person who run
the report.
- Job queue manager can also see all jobs for each reports.

View File

@@ -0,0 +1,26 @@
Menu: Dashboard \> Report Center
As Technical Feature users, you can manage reports for Report Center.
- **Report:** choose the report (a window action). Although the option
show all window actions it only make sense for window actions that
launch reports.
- **Allow Async:** check this, if you want the report to run in
background too, suitable for report that return file as result, i.e.,
pdf/xlsx/csv/txt.
- **Email Notification:** if checked, once the background process is
completed, email with link to download report will be sent.
- **Groups:** select user groups allowed to use this report. If left
blank, all user can use.
As normal user, you can run your reports from Report Center
- **Run Now button:** to run report immediately as per normal.
- **Run Background button:** to run report asynchronously. Fall back to
run now, if not report that produce file.
- **Job Status:** show status of the latest run job. If job fail,
exception error will also shown
- **Files:** show all files being produced by the job as run by the
user.
- **Jobs:** show all jobs triggered by this report as run by the user.
Only job queue manager have access to this button.

View File

@@ -0,0 +1,4 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
access_report_async,report.async.user,model_report_async,base.group_user,1,0,0,0
access_report_async_sudo,report.async.sudo,model_report_async,base.group_no_one,1,1,1,1
access_print_report_wizard,print.report.wizard,model_print_report_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_report_async report.async.user model_report_async base.group_user 1 0 0 0
3 access_report_async_sudo report.async.sudo model_report_async base.group_no_one 1 1 1 1
4 access_print_report_wizard print.report.wizard model_print_report_wizard base.group_user 1 1 1 1

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="rule_report_async_access_by_group" model="ir.rule">
<field name="name">Report Async by Groups</field>
<field name="model_id" ref="model_report_async" />
<field name="groups" eval="[(4, ref('base.group_user'))]" />
<field name="perm_read" eval="True" />
<field name="perm_create" eval="False" />
<field name="perm_write" eval="False" />
<field name="perm_unlink" eval="False" />
<field
name="domain_force"
>['|', ('group_ids', '=', False), ('group_ids', 'in', [g.id for g in user.groups_id])]</field>
</record>
<record id="rule_report_async_access_all" model="ir.rule">
<field name="name">Report Async by Groups</field>
<field name="model_id" ref="model_report_async" />
<field name="groups" eval="[(4, ref('base.group_no_one'))]" />
<field name="perm_read" eval="True" />
<field name="perm_create" eval="True" />
<field name="perm_write" eval="True" />
<field name="perm_unlink" eval="True" />
<field name="domain_force">[(1,'=', 1)]</field>
</record>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,482 @@
<!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>Report Async</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="report-async">
<h1 class="title">Report Async</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:49866d2b712288add9819deb8ff6dc8aa180a52463a72789350974bbf10e17ae
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/report_async"><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-report_async"><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>The new menu “Report Center” is the central place to host your reports
in one place. From here, there are 2 ways to launch the report,</p>
<ol class="arabic simple">
<li>Run Now - run report immediately as per normal.</li>
<li>Run Background - put the report execution to queue job.</li>
</ol>
<p>By using the queue job, option 2 is great for long running report. The
report file will be saved for later use, with the option to send report
by email as soon as it is ready.</p>
<p>Notes:</p>
<ul class="simple">
<li>Only user with Technical Feature rights can manage the report.</li>
<li>Every internal user will have right to execute the report allowed for
his/her groups.</li>
<li>The files created are owned and viewable only by the person who run
the report.</li>
<li>Job queue manager can also see all jobs for each reports.</li>
</ul>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</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="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<p>Menu: Dashboard &gt; Report Center</p>
<p>As Technical Feature users, you can manage reports for Report Center.</p>
<ul class="simple">
<li><strong>Report:</strong> choose the report (a window action). Although the option
show all window actions it only make sense for window actions that
launch reports.</li>
<li><strong>Allow Async:</strong> check this, if you want the report to run in
background too, suitable for report that return file as result, i.e.,
pdf/xlsx/csv/txt.</li>
<li><strong>Email Notification:</strong> if checked, once the background process is
completed, email with link to download report will be sent.</li>
<li><strong>Groups:</strong> select user groups allowed to use this report. If left
blank, all user can use.</li>
</ul>
<p>As normal user, you can run your reports from Report Center</p>
<ul class="simple">
<li><strong>Run Now button:</strong> to run report immediately as per normal.</li>
<li><strong>Run Background button:</strong> to run report asynchronously. Fall back to
run now, if not report that produce file.</li>
<li><strong>Job Status:</strong> show status of the latest run job. If job fail,
exception error will also shown</li>
<li><strong>Files:</strong> show all files being produced by the job as run by the
user.</li>
<li><strong>Jobs:</strong> show all jobs triggered by this report as run by the user.
Only job queue manager have access to this button.</li>
</ul>
</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:%20report_async%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>Ecosoft</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="http://ecosoft.co.th">Ecosoft</a>:<ul>
<li>Kitti U. &lt;<a class="reference external" href="mailto:kittiu&#64;ecosoft.co.th">kittiu&#64;ecosoft.co.th</a>&gt;</li>
<li>Saran Lim. &lt;<a class="reference external" href="mailto:saranl&#64;ecosoft.co.th">saranl&#64;ecosoft.co.th</a>&gt;</li>
<li>Tharathip Chaweewongphan &lt;<a class="reference external" href="mailto:tharathipc&#64;ecosoft.co.th">tharathipc&#64;ecosoft.co.th</a>&gt;</li>
</ul>
</li>
<li>Opensourceintegrators<ul>
<li>Daniel Reis &lt;<a class="reference external" href="mailto:dreis&#64;opensourceintegrators.com">dreis&#64;opensourceintegrators.com</a>&gt;</li>
<li>Nikul Chaudhary &lt;<a class="reference external" href="mailto:nchaudhary&#64;opensourceintegrators.com">nchaudhary&#64;opensourceintegrators.com</a>&gt;</li>
</ul>
</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/kittiu"><img alt="kittiu" src="https://github.com/kittiu.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/report_async">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_report_async

View File

@@ -0,0 +1,57 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from odoo.exceptions import UserError
from odoo.tests import common
from odoo.tests.common import Form
class TestJobChannel(common.TransactionCase):
def setUp(self):
super().setUp()
self.print_doc = self.env.ref("report_async.report_async_print_document")
self.test_rec = self.env.ref("base.module_mail")
self.test_rpt = self.env.ref("base.ir_module_reference_print")
def _print_wizard(self, res):
obj = self.env[res["res_model"]]
with Form(
obj.with_context(
active_model=self.print_doc._name,
active_id=self.print_doc.id,
async_process=res["context"].get("async_process"),
)
) as form:
form.reference = f"{self.test_rec._name},{self.test_rec.id}"
form.action_report_id = self.test_rpt
print_wizard = form.save()
return print_wizard
def test_1_run_now(self):
"""Run now will return report action as normal"""
res = self.print_doc.run_now()
report_action = self._print_wizard(res).print_report()
self.assertEqual(report_action["type"], "ir.actions.report")
def test_2_run_async(self):
"""Run background will return nothing, job started"""
self.print_doc.write({"allow_async": False})
with self.assertRaises(UserError):
self.print_doc.run_async()
self.print_doc.write({"allow_async": True, "email_notify": True})
res = self.print_doc.run_async()
print_wizard = self._print_wizard(res)
report_action = print_wizard.print_report()
self.assertEqual(report_action, {}) # Do not run report yet
self.assertEqual(self.print_doc.job_status, "pending") # Job started
# Test produce file (as queue will not run in test mode)
docids = [print_wizard.reference.id]
data = None
report_id = self.test_rpt.id
user_id = self.env.user.id
self.print_doc.run_report(docids, data, report_id, user_id)
# Check name of the newly producted file
# Note: on env with test-enable, always fall back to render_qweb_html
self.assertIn(self.test_rpt.name, self.print_doc.file_ids[0].name)
# View fileds/jobs
self.print_doc.view_files()
self.print_doc.view_jobs()

View File

@@ -0,0 +1,166 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_report_async_tree" model="ir.ui.view">
<field name="name">report.async.tree</field>
<field name="model">report.async</field>
<field name="arch" type="xml">
<tree>
<field name="action_id" context="{'access_sudo': True}" />
<button type="object" name="run_now" string="Run Now" icon="fa-bolt" />
<button
type="object"
name="run_async"
string="Run Background"
icon="fa-cogs"
invisible="not allow_async"
/>
<button
type="object"
name="view_files"
string="Files"
icon="fa-copy"
invisible="not allow_async"
/>
<field name="allow_async" column_invisible="1" />
<field name="job_status" optional="hide" />
<field name="email_notify" />
</tree>
</field>
</record>
<record id="view_report_async_form" model="ir.ui.view">
<field name="name">report.async.form</field>
<field name="model">report.async</field>
<field name="arch" type="xml">
<form>
<div
class="alert alert-warning"
role="alert"
invisible="not allow_async or (job_status in ['done', 'failed', False])"
style="margin-bottom:0px;"
>
<p>
The report will be running by <i class="fa fa-cogs" />
<b>job</b>, and will be available at
<i class="fa fa-copy" /><b> Files</b>
</p>
</div>
<div
class="alert alert-danger"
role="alert"
invisible="not allow_async or job_status != 'failed'"
style="margin-bottom:0px;"
>
<p>
The last <i class="fa fa-cogs" /> <b>running job</b> was failed.
Please contact your system administrator.
</p>
</div>
<div
class="alert alert-success"
role="alert"
invisible="not allow_async or job_status != 'done'"
style="margin-bottom:0px;"
>
<p>
The last <i class="fa fa-cogs" /> <b
>running job</b> was succeed.
You can check the result in <i class="fa fa-copy" /><b
> Files</b>
</p>
</div>
<sheet>
<div class="oe_button_box" name="button_box">
<button
type="object"
name="run_now"
string="Run Now"
icon="fa-bolt"
/>
<button
type="object"
name="run_async"
string="Run Background"
icon="fa-cogs"
invisible="not allow_async"
/>
<button
type="object"
name="view_files"
string="Files"
icon="fa-copy"
invisible="not allow_async"
/>
<button
type="object"
name="view_jobs"
string="Jobs"
icon="fa-align-justify"
groups="queue_job.group_queue_job_manager"
invisible="not allow_async"
/>
</div>
<group>
<group>
<field
name="action_id"
options="{'no_open': True, 'no_create_edit': True}"
context="{'access_sudo': True}"
/>
<field name="allow_async" />
<field name="email_notify" invisible="not allow_async" />
</group>
<group>
<field name="job_status" invisible="not allow_async" />
<field name="group_ids" widget="many2many_tags" />
</group>
<group
name="job_info"
string="Last Run Job Error"
colspan="2"
invisible="not allow_async or not job_info"
>
<field nolabel="1" name="job_info" />
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_report_async_search" model="ir.ui.view">
<field name="name">report.async.search</field>
<field name="model">report.async</field>
<field name="arch" type="xml">
<search string="Report Center">
<field name="action_id" />
</search>
</field>
</record>
<record id="action_report_async" model="ir.actions.act_window">
<field name="name">Report Center</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">report.async</field>
<field name="help">Run reports asyncronously</field>
</record>
<menuitem
id="menu_report_async"
parent="spreadsheet_dashboard.spreadsheet_dashboard_menu_root"
action="action_report_async"
sequence="10"
/>
<record id="action_view_files" model="ir.actions.act_window">
<field name="name">Report Files</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">ir.attachment</field>
<field name="view_id" eval="False" />
<field name="search_view_id" ref="base.view_attachment_search" />
<field name="view_mode">kanban,tree,form</field>
<field
name="domain"
>[('res_model', '=', 'report.async'), ('create_uid', '=', uid)]</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No files found
</p>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,4 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from . import print_report_wizard

View File

@@ -0,0 +1,45 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from odoo import api, fields, models
class PrintReportWizard(models.TransientModel):
_name = "print.report.wizard"
_description = "Print Report Wizard"
reference = fields.Reference(
string="Document",
selection="_reference_models",
required=True,
)
action_report_id = fields.Many2one(
comodel_name="ir.actions.report",
string="Report Template",
required=True,
)
@api.model
def _reference_models(self):
excludes = ["res.company"]
models = self.env["ir.model"].search(
[
("state", "!=", "manual"),
("transient", "=", False),
("model", "not in", excludes),
]
)
return [(model.model, model.name) for model in models]
@api.onchange("reference")
def _onchange_reference(self):
self.ensure_one()
domain = [("id", "in", [])]
self.action_report_id = False
if self.reference:
domain = [("model", "=", self.reference._name)]
return {"domain": {"action_report_id": domain}}
def print_report(self):
self.ensure_one()
return self.action_report_id.report_action(self.reference, config=False)

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="print_report_wizard" model="ir.ui.view">
<field name="name">print.report.wizard</field>
<field name="model">print.report.wizard</field>
<field name="arch" type="xml">
<form>
<group>
<group>
<field name="reference" />
</group>
<group>
<field
name="action_report_id"
options="{'no_open': True, 'no_create_edit': True}"
/>
</group>
</group>
<footer>
<button
name="print_report"
type="object"
string="Execute"
class="oe_highlight"
/>
<button special="cancel" string="Cancel" />
</footer>
</form>
</field>
</record>
<record id="action_print_report_wizard" model="ir.actions.act_window">
<field name="name">Print Document</field>
<field name="res_model">print.report.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>