Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,47 @@
# Base Export Async
Odoo addon: base_export_async
## Installation
```bash
pip install odoo-bringout-oca-queue-base_export_async
```
## Dependencies
This addon depends on:
- web
- queue_job
## Manifest Information
- **Name**: Base Export Async
- **Version**: 16.0.1.1.0
- **Category**: N/A
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/queue](https://github.com/OCA/queue) branch 16.0, addon `base_export_async`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,87 @@
=================
Base Export Async
=================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:85ce335207ce3505a7676a8a78743155f9f8c01d1c6f777fe2308c5e77f00e5a
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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%2Fqueue-lightgray.png?logo=github
:target: https://github.com/OCA/queue/tree/16.0/base_export_async
:alt: OCA/queue
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/queue-16-0/queue-16-0-base_export_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/queue&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
Standard Export can be delayed in asynchronous jobs executed in the background and then send by email to the user.
**Table of contents**
.. contents::
:local:
Usage
=====
The user is presented with a new checkbox "Asynchronous export"
in the export screen. When selected, the export is delayed in a
background job.
The .csv or .xls file generated by the export will be sent by email
to the user who execute the export.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/queue/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/queue/issues/new?body=module:%20base_export_async%0Aversion:%2016.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
~~~~~~~
* ACSONE SA/NV
Contributors
~~~~~~~~~~~~
* Arnaud Pineux (ACSONE SA/NV) authored the initial prototype.
* Guewen Baconnier (Camptocamp)
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.
This module is part of the `OCA/queue <https://github.com/OCA/queue/tree/16.0/base_export_async>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,4 @@
# Copyright 2019 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import models

View file

@ -0,0 +1,28 @@
# Copyright 2019 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Base Export Async",
"summary": "Asynchronous export with job queue",
"version": "16.0.1.1.0",
"license": "AGPL-3",
"author": "ACSONE SA/NV, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/queue",
"depends": ["web", "queue_job"],
"data": [
"security/ir.model.access.csv",
"security/ir_rule.xml",
"data/config_parameter.xml",
"data/cron.xml",
"data/mail_template.xml",
],
"demo": [],
"assets": {
"web.assets_backend": [
"base_export_async/static/src/xml/base.xml",
"base_export_async/static/src/js/list_controller.esm.js",
"base_export_async/static/src/js/data_export.esm.js",
],
},
"installable": True,
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="attachment_ttl" model="ir.config_parameter">
<field name="key">attachment.ttl</field>
<field name="value">7</field>
</record>
</odoo>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="to_delete_attachment" model="ir.cron">
<field name="name">Delete Generated Exports</field>
<field name="model_id" ref="model_delay_export" />
<field name="state">code</field>
<field name="code">model.cron_delete()</field>
<field name='interval_number'>1</field>
<field name='interval_type'>days</field>
<field name="numbercall">-1</field>
</record>
</odoo>

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="delay_export_mail_template" model="mail.template">
<field name="name">Delay Export</field>
<field
name="subject"
>Export {{ object.model_description }} {{ datetime.date.today() }}</field>
<field name="model_id" ref="base_export_async.model_delay_export" />
<field name="auto_delete" eval="True" />
<field name="body_html" type="html">
<p>Your export is available <a
t-attf-href="{{ object.url }}"
target="_blank"
>here</a>.</p>
<p>It will be automatically deleted the <t
t-out="object.expiration_date"
/>.</p>
<br />
<p>
<span
style="color: #808080;"
>This is an automated message please do not reply.</span>
</p>
</field>
</record>
</odoo>

View file

@ -0,0 +1,144 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_export_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: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "(You will receive the export by email)"
msgstr ""
#. module: base_export_async
#: model:mail.template,body_html:base_export_async.delay_export_mail_template
msgid ""
"<p>Your export is available <a t-attf-href=\"{{ object.url }}\" target=\"_blank\">here</a>.</p>\n"
" <p>It will be automatically deleted the <t t-out=\"object.expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">This is an automated message please do not reply.</span>\n"
" </p>\n"
" "
msgstr ""
#. module: base_export_async
#: model:ir.model,name:base_export_async.model_delay_export
msgid "Asynchronous Export"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "Asynchronous export"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_uid
msgid "Created by"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_date
msgid "Created on"
msgstr ""
#. module: base_export_async
#: model:mail.template,name:base_export_async.delay_export_mail_template
msgid "Delay Export"
msgstr ""
#. module: base_export_async
#: model:ir.actions.server,name:base_export_async.to_delete_attachment_ir_actions_server
#: model:ir.cron,cron_name:base_export_async.to_delete_attachment
msgid "Delete Generated Exports"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__display_name
msgid "Display Name"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__expiration_date
msgid "Expiration Date"
msgstr ""
#. module: base_export_async
#: model:mail.template,subject:base_export_async.delay_export_mail_template
msgid "Export {{ object.model_description }} {{ datetime.date.today() }}"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "External ID"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__id
msgid "ID"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export____last_update
msgid "Last Modified on"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_uid
msgid "Last Updated by"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_date
msgid "Last Updated on"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__model_description
msgid "Model Description"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/data_export.esm.js:0
#, python-format
msgid "Please select fields to save export list..."
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__url
msgid "Url"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__user_ids
msgid "Users"
msgstr ""
#. module: base_export_async
#. odoo-python
#: code:addons/base_export_async/models/delay_export.py:0
#, python-format
msgid "You must set an email address to your user."
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "You will receive the export file by email as soon as it is finished."
msgstr ""

View file

@ -0,0 +1,144 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_export_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: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "(You will receive the export by email)"
msgstr "(Primiće te izvoz e-poštom)"
#. module: base_export_async
#: model:mail.template,body_html:base_export_async.delay_export_mail_template
msgid ""
"<p>Your export is available <a t-attf-href=\"{{ object.url }}\" target=\"_blank\">here</a>.</p>\n"
" <p>It will be automatically deleted the <t t-out=\"object.expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">This is an automated message please do not reply.</span>\n"
" </p>\n"
" "
msgstr ""
#. module: base_export_async
#: model:ir.model,name:base_export_async.model_delay_export
msgid "Asynchronous Export"
msgstr "Asinhroni izvoz"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "Asynchronous export"
msgstr "Asinhroni izvoz"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: base_export_async
#: model:mail.template,name:base_export_async.delay_export_mail_template
msgid "Delay Export"
msgstr "Kašnjenje izvoza"
#. module: base_export_async
#: model:ir.actions.server,name:base_export_async.to_delete_attachment_ir_actions_server
#: model:ir.cron,cron_name:base_export_async.to_delete_attachment
msgid "Delete Generated Exports"
msgstr "Obriši generirane izvozove"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__expiration_date
msgid "Expiration Date"
msgstr "Datum isteka"
#. module: base_export_async
#: model:mail.template,subject:base_export_async.delay_export_mail_template
msgid "Export {{ object.model_description }} {{ datetime.date.today() }}"
msgstr "Izvoz {{ object.model_description }} {{ datetime.date.today() }}"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "External ID"
msgstr "Externi ID"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__id
msgid "ID"
msgstr "ID"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__model_description
msgid "Model Description"
msgstr "Opis modela"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/data_export.esm.js:0
#, python-format
msgid "Please select fields to save export list..."
msgstr "Molimo da odaberete polja za čuvanje liste izvoza..."
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__url
msgid "Url"
msgstr "Url"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__user_ids
msgid "Users"
msgstr "Korisnici"
#. module: base_export_async
#. odoo-python
#: code:addons/base_export_async/models/delay_export.py:0
#, python-format
msgid "You must set an email address to your user."
msgstr "Morate postaviti e-mail adresu za vašeg korisnika."
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "You will receive the export file by email as soon as it is finished."
msgstr "Primiće te datoteku izvoza e-poštom čim bude završena."

View file

@ -0,0 +1,179 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_export_async
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-02-07 17:45+0000\n"
"Last-Translator: Hans Henrik Gabelgaard <hhg@gabelgaard.org>\n"
"Language-Team: none\n"
"Language: da\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.3.2\n"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "(You will receive the export by email)"
msgstr "(Du vil modtage eksporten via mail)"
#. module: base_export_async
#: model:mail.template,body_html:base_export_async.delay_export_mail_template
msgid ""
"<p>Your export is available <a t-attf-href=\"{{ object.url }}\" target="
"\"_blank\">here</a>.</p>\n"
" <p>It will be automatically deleted the <t t-out=\"object."
"expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">This is an automated message "
"please do not reply.</span>\n"
" </p>\n"
" "
msgstr ""
#. module: base_export_async
#: model:ir.model,name:base_export_async.model_delay_export
msgid "Asynchronous Export"
msgstr "Asynkron export"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "Asynchronous export"
msgstr "Asynkron export"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_uid
msgid "Created by"
msgstr "Oprettet af"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_date
msgid "Created on"
msgstr "Oprettet den"
#. module: base_export_async
#: model:mail.template,name:base_export_async.delay_export_mail_template
msgid "Delay Export"
msgstr ""
#. module: base_export_async
#: model:ir.actions.server,name:base_export_async.to_delete_attachment_ir_actions_server
#: model:ir.cron,cron_name:base_export_async.to_delete_attachment
msgid "Delete Generated Exports"
msgstr "Slet genererede eksporter"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__display_name
msgid "Display Name"
msgstr "Vist navn"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__expiration_date
msgid "Expiration Date"
msgstr ""
#. module: base_export_async
#: model:mail.template,subject:base_export_async.delay_export_mail_template
msgid "Export {{ object.model_description }} {{ datetime.date.today() }}"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "External ID"
msgstr "External ID"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__id
msgid "ID"
msgstr "ID"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export____last_update
msgid "Last Modified on"
msgstr "Senest rettet den"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_uid
msgid "Last Updated by"
msgstr "Senest rettet af"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_date
msgid "Last Updated on"
msgstr "Senest rettet den"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__model_description
msgid "Model Description"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/data_export.esm.js:0
#, python-format
msgid "Please select fields to save export list..."
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__url
msgid "Url"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__user_ids
msgid "Users"
msgstr "Brugere"
#. module: base_export_async
#. odoo-python
#: code:addons/base_export_async/models/delay_export.py:0
#, python-format
msgid "You must set an email address to your user."
msgstr "Du skal have en email adresse på dit brugeropsæt."
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "You will receive the export file by email as soon as it is finished."
msgstr "Du vil modtage et link til eksporten så snart den er færdig."
#, python-format
#~ msgid "Please select fields to export..."
#~ msgstr "Vælg venligst felter til eksporten..."
#, python-format
#~ msgid ""
#~ "\n"
#~ " <p>Your export is available <a href=\"{}\">here</a>.</p>\n"
#~ " <p>It will be automatically deleted the {}.</p>\n"
#~ " <p>&nbsp;</p>\n"
#~ " <p><span style=\"color: #808080;\">\n"
#~ " This is an automated message please do not reply.\n"
#~ " </span></p>\n"
#~ " "
#~ msgstr ""
#~ "\n"
#~ " <p>Din export er tilgængelig <a href=\"{}\">her</a>.</p>\n"
#~ " <p>Den vil atutomatisk blive slettet den {}.</p>\n"
#~ " <p>&nbsp;</p>\n"
#~ " <p><span style=\"color: #808080;\">\n"
#~ " Dette er en automatisk besked. Undlad venlisgt at "
#~ "besvare.\n"
#~ " </span></p>\n"
#~ " "
#, python-format
#~ msgid "Export {} {}"
#~ msgstr "Eksport {} {}"

View file

@ -0,0 +1,188 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_export_async
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-07-04 14:43+0000\n"
"Last-Translator: Maria Sparenberg <maria.sparenberg@gmx.net>\n"
"Language-Team: none\n"
"Language: de\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 3.7.1\n"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "(You will receive the export by email)"
msgstr "(Der Export wird per Mail bereitgestellt.)"
#. module: base_export_async
#: model:mail.template,body_html:base_export_async.delay_export_mail_template
msgid ""
"<p>Your export is available <a t-attf-href=\"{{ object.url }}\" target="
"\"_blank\">here</a>.</p>\n"
" <p>It will be automatically deleted the <t t-out=\"object."
"expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">This is an automated message "
"please do not reply.</span>\n"
" </p>\n"
" "
msgstr ""
#. module: base_export_async
#: model:ir.model,name:base_export_async.model_delay_export
#, fuzzy
msgid "Asynchronous Export"
msgstr "Asynchroner Export"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "Asynchronous export"
msgstr "Asynchroner Export"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_uid
msgid "Created by"
msgstr "Erstellt von"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_date
msgid "Created on"
msgstr "Erstellt am"
#. module: base_export_async
#: model:mail.template,name:base_export_async.delay_export_mail_template
msgid "Delay Export"
msgstr ""
#. module: base_export_async
#: model:ir.actions.server,name:base_export_async.to_delete_attachment_ir_actions_server
#: model:ir.cron,cron_name:base_export_async.to_delete_attachment
msgid "Delete Generated Exports"
msgstr "Erzeugte Exporte löschen"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__display_name
msgid "Display Name"
msgstr "Anzeigename"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__expiration_date
msgid "Expiration Date"
msgstr ""
#. module: base_export_async
#: model:mail.template,subject:base_export_async.delay_export_mail_template
msgid "Export {{ object.model_description }} {{ datetime.date.today() }}"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "External ID"
msgstr "Externe ID"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__id
msgid "ID"
msgstr "ID"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export____last_update
msgid "Last Modified on"
msgstr "Zuletzt geändert am"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_uid
msgid "Last Updated by"
msgstr "Zuletzt aktualisiert von"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_date
msgid "Last Updated on"
msgstr "Zuletzt aktualisiert am"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__model_description
msgid "Model Description"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/data_export.esm.js:0
#, python-format
msgid "Please select fields to save export list..."
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__url
msgid "Url"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__user_ids
msgid "Users"
msgstr "Benutzer"
#. module: base_export_async
#. odoo-python
#: code:addons/base_export_async/models/delay_export.py:0
#, python-format
msgid "You must set an email address to your user."
msgstr ""
"Der aktuelle Benutzer hat keine Email-Adresse. Es muss eine gesetzt werden."
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "You will receive the export file by email as soon as it is finished."
msgstr ""
"Die Export-Datei wird per Email versendet, sobald der Export beendet ist."
#, python-format
#~ msgid "Please select fields to export..."
#~ msgstr "Bitte Felder für den Export auswählen..."
#, python-format
#~ msgid ""
#~ "\n"
#~ " <p>Your export is available <a href=\"{}\">here</a>.</p>\n"
#~ " <p>It will be automatically deleted the {}.</p>\n"
#~ " <p>&nbsp;</p>\n"
#~ " <p><span style=\"color: #808080;\">\n"
#~ " This is an automated message please do not reply.\n"
#~ " </span></p>\n"
#~ " "
#~ msgstr ""
#~ "\n"
#~ " <p>Der Export ist <a href=\"{}\">hier</a> verfügbar.</p>\n"
#~ " <p>Das {} wird automatisch gelöscht.</p>\n"
#~ " <p>&nbsp;</p>\n"
#~ " <p><span style=\"color: #808080;\">\n"
#~ " Dies ist eine automatisch erstellte Nachricht, bitte "
#~ "nicht darauf antworten.\n"
#~ " </span></p>\n"
#~ " "
#, python-format
#~ msgid "Export {} {}"
#~ msgstr "Export {} {}"
#~ msgid "Allow to delay the export"
#~ msgstr "Verzögerung des Exports erlauben"
#~ msgid "The user doesn't have an email address."
#~ msgstr "Der Benutzer hat keine Email-Adresse."

View file

@ -0,0 +1,164 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_export_async
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-07-25 00:18+0000\n"
"Last-Translator: bencoronel <bencoronel@gmail.com>\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: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "(You will receive the export by email)"
msgstr "(Recibirás la exportación por correo electrónico)"
#. module: base_export_async
#: model:mail.template,body_html:base_export_async.delay_export_mail_template
msgid ""
"<p>Your export is available <a t-attf-href=\"{{ object.url }}\" target="
"\"_blank\">here</a>.</p>\n"
" <p>It will be automatically deleted the <t t-out=\"object."
"expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">This is an automated message "
"please do not reply.</span>\n"
" </p>\n"
" "
msgstr ""
"<p>Tu exportación está disponible <a t-attf-href=\"{{ object.url }}\" target="
"\"_blank\">aquí</a>.</p>\n"
" <p>Se eliminará automáticamente el <t t-out=\"object."
"expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">Este es un mensaje "
"automatizado, por favor no responder.</span>\n"
" </p>\n"
" "
#. module: base_export_async
#: model:ir.model,name:base_export_async.model_delay_export
msgid "Asynchronous Export"
msgstr "Exportación Asíncrona"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "Asynchronous export"
msgstr "Exportación asíncrona"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_date
msgid "Created on"
msgstr "Creado el"
#. module: base_export_async
#: model:mail.template,name:base_export_async.delay_export_mail_template
msgid "Delay Export"
msgstr "Aplazar Exportación"
#. module: base_export_async
#: model:ir.actions.server,name:base_export_async.to_delete_attachment_ir_actions_server
#: model:ir.cron,cron_name:base_export_async.to_delete_attachment
msgid "Delete Generated Exports"
msgstr "Eliminar Exportaciones Generadas"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__display_name
msgid "Display Name"
msgstr "Nombre mostrado"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__expiration_date
msgid "Expiration Date"
msgstr "Fecha de vencimiento"
#. module: base_export_async
#: model:mail.template,subject:base_export_async.delay_export_mail_template
msgid "Export {{ object.model_description }} {{ datetime.date.today() }}"
msgstr "Exportación {{ object.model_description }} {{ datetime.date.today() }}"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "External ID"
msgstr "ID Externo"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__id
msgid "ID"
msgstr "ID"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export____last_update
msgid "Last Modified on"
msgstr "Última fecha de modificación"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_uid
msgid "Last Updated by"
msgstr "Última Actualización por"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_date
msgid "Last Updated on"
msgstr "Última fecha de actualización"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__model_description
msgid "Model Description"
msgstr "Descripción del modelo"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/data_export.esm.js:0
#, python-format
msgid "Please select fields to save export list..."
msgstr ""
"Por favor, seleccione los campos para guardar la lista de exportación..."
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__url
msgid "Url"
msgstr "Url"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__user_ids
msgid "Users"
msgstr "Usuarios"
#. module: base_export_async
#. odoo-python
#: code:addons/base_export_async/models/delay_export.py:0
#, python-format
msgid "You must set an email address to your user."
msgstr ""
"Debes proporcionar una dirección de correo electrónico para tu usuario."
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "You will receive the export file by email as soon as it is finished."
msgstr ""
"Recibirás el archivo de exportación por correo electrónico tan pronto como "
"acabe."

View file

@ -0,0 +1,191 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_export_async
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-05-01 15:36+0000\n"
"Last-Translator: c2cdidier <didier.donze@camptocamp.com>\n"
"Language-Team: none\n"
"Language: fr\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: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "(You will receive the export by email)"
msgstr "(Vous recevrez cet export par courriel)"
#. module: base_export_async
#: model:mail.template,body_html:base_export_async.delay_export_mail_template
msgid ""
"<p>Your export is available <a t-attf-href=\"{{ object.url }}\" target="
"\"_blank\">here</a>.</p>\n"
" <p>It will be automatically deleted the <t t-out=\"object."
"expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">This is an automated message "
"please do not reply.</span>\n"
" </p>\n"
" "
msgstr ""
"<p>Votre export est disponible<a t-attf-href=\"{{ object.url }}\" target="
"\"_blank\">ici</a>.</p>\n"
" <p>Il sera automatiquement supprimé le<t t-out=\"object."
"expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">Ce message est "
"automatique, merci de ne pas y répondre.</span>\n"
" </p>\n"
" "
#. module: base_export_async
#: model:ir.model,name:base_export_async.model_delay_export
msgid "Asynchronous Export"
msgstr "Export asynchrone"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "Asynchronous export"
msgstr "Export asynchrone"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_uid
msgid "Created by"
msgstr "Créé par"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_date
msgid "Created on"
msgstr "Créé le"
#. module: base_export_async
#: model:mail.template,name:base_export_async.delay_export_mail_template
msgid "Delay Export"
msgstr "Retarder l'exportation"
#. module: base_export_async
#: model:ir.actions.server,name:base_export_async.to_delete_attachment_ir_actions_server
#: model:ir.cron,cron_name:base_export_async.to_delete_attachment
msgid "Delete Generated Exports"
msgstr "Supprimer les exports générés"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__expiration_date
msgid "Expiration Date"
msgstr "Date d'expiration"
#. module: base_export_async
#: model:mail.template,subject:base_export_async.delay_export_mail_template
msgid "Export {{ object.model_description }} {{ datetime.date.today() }}"
msgstr "Exportation {{ object.model_description }} {{ datetime.date.today() }}"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "External ID"
msgstr "Identifiant externe"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__id
msgid "ID"
msgstr "ID"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export____last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__model_description
msgid "Model Description"
msgstr "Description du modèle"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/data_export.esm.js:0
#, python-format
msgid "Please select fields to save export list..."
msgstr ""
"Veuillez sélectionner les champs pour enregistrer la liste d'exportation..."
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__url
msgid "Url"
msgstr "Url"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__user_ids
msgid "Users"
msgstr "Utilisateurs"
#. module: base_export_async
#. odoo-python
#: code:addons/base_export_async/models/delay_export.py:0
#, python-format
msgid "You must set an email address to your user."
msgstr "Vous devez définir une adresse e-mail pour votre utilisateur."
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "You will receive the export file by email as soon as it is finished."
msgstr "Vous recevrez le fichier d'export par courriel dès qu'il sera terminé."
#, python-format
#~ msgid "Please select fields to export..."
#~ msgstr "Veuillez choisir les champs à exporter..."
#, python-format
#~ msgid ""
#~ "\n"
#~ " <p>Your export is available <a href=\"{}\">here</a>.</p>\n"
#~ " <p>It will be automatically deleted the {}.</p>\n"
#~ " <p>&nbsp;</p>\n"
#~ " <p><span style=\"color: #808080;\">\n"
#~ " This is an automated message please do not reply.\n"
#~ " </span></p>\n"
#~ " "
#~ msgstr ""
#~ "\n"
#~ " <p>Votre export est disponible <a href=\"{}\">ici</a>.</"
#~ "p>\n"
#~ " <p>Il sera automatiquement supprimé le {}.</p>\n"
#~ " <p>&nbsp;</p>\n"
#~ " <p><span style=\"color: #808080;\">\n"
#~ " Ceci est un message automatisé, merci de ne pas "
#~ "répondre.\n"
#~ " </span></p>\n"
#~ " "
#, python-format
#~ msgid "Export {} {}"
#~ msgstr "Export {} {}"

View file

@ -0,0 +1,146 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_export_async
#
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: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "(You will receive the export by email)"
msgstr ""
#. module: base_export_async
#: model:mail.template,body_html:base_export_async.delay_export_mail_template
msgid ""
"<p>Your export is available <a t-attf-href=\"{{ object.url }}\" target=\"_blank\">here</a>.</p>\n"
" <p>It will be automatically deleted the <t t-out=\"object.expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">This is an automated message please do not reply.</span>\n"
" </p>\n"
" "
msgstr ""
#. module: base_export_async
#: model:ir.model,name:base_export_async.model_delay_export
msgid "Asynchronous Export"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "Asynchronous export"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_uid
msgid "Created by"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_date
msgid "Created on"
msgstr ""
#. module: base_export_async
#: model:mail.template,name:base_export_async.delay_export_mail_template
msgid "Delay Export"
msgstr ""
#. module: base_export_async
#: model:ir.actions.server,name:base_export_async.to_delete_attachment_ir_actions_server
#: model:ir.cron,cron_name:base_export_async.to_delete_attachment
msgid "Delete Generated Exports"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__display_name
msgid "Display Name"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__expiration_date
msgid "Expiration Date"
msgstr ""
#. module: base_export_async
#: model:mail.template,subject:base_export_async.delay_export_mail_template
msgid "Export {{ object.model_description }} {{ datetime.date.today() }}"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "External ID"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__id
msgid "ID"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export____last_update
msgid "Last Modified on"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_uid
msgid "Last Updated by"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_date
msgid "Last Updated on"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__model_description
msgid "Model Description"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/data_export.esm.js:0
#, python-format
msgid "Please select fields to save export list..."
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__url
msgid "Url"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__user_ids
msgid "Users"
msgstr ""
#. module: base_export_async
#. odoo-python
#: code:addons/base_export_async/models/delay_export.py:0
#, python-format
msgid "You must set an email address to your user."
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "You will receive the export file by email as soon as it is finished."
msgstr ""

View file

@ -0,0 +1,160 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_export_async
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-04-04 11:38+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: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "(You will receive the export by email)"
msgstr "(Verrà inviata l'esportazione vie e-mail)"
#. module: base_export_async
#: model:mail.template,body_html:base_export_async.delay_export_mail_template
msgid ""
"<p>Your export is available <a t-attf-href=\"{{ object.url }}\" target="
"\"_blank\">here</a>.</p>\n"
" <p>It will be automatically deleted the <t t-out=\"object."
"expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">This is an automated message "
"please do not reply.</span>\n"
" </p>\n"
" "
msgstr ""
"<p>L'esportazione è disponibile <a t-attf-href=\"{{ object.url }}\" target="
"\"_blank\">qui</a>.</p>\n"
" <p>Verrà cancellata automaticamente il <t t-out=\"object."
"expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">Questo è un messaggio "
"atomatico, non rispondere.</span>\n"
" </p>\n"
" "
#. module: base_export_async
#: model:ir.model,name:base_export_async.model_delay_export
msgid "Asynchronous Export"
msgstr "Esportazione asincrona"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "Asynchronous export"
msgstr "Esportazione asincrona"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_date
msgid "Created on"
msgstr "Creato il"
#. module: base_export_async
#: model:mail.template,name:base_export_async.delay_export_mail_template
msgid "Delay Export"
msgstr "Ritarda esportazione"
#. module: base_export_async
#: model:ir.actions.server,name:base_export_async.to_delete_attachment_ir_actions_server
#: model:ir.cron,cron_name:base_export_async.to_delete_attachment
msgid "Delete Generated Exports"
msgstr "Cancella esportazioni generate"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__expiration_date
msgid "Expiration Date"
msgstr "Data di scadenza"
#. module: base_export_async
#: model:mail.template,subject:base_export_async.delay_export_mail_template
msgid "Export {{ object.model_description }} {{ datetime.date.today() }}"
msgstr "Esportazione {{ object.model_description }} {{ datetime.date.today() }}"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "External ID"
msgstr "ID esterno"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__id
msgid "ID"
msgstr "ID"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__model_description
msgid "Model Description"
msgstr "Descrizione modello"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/data_export.esm.js:0
#, python-format
msgid "Please select fields to save export list..."
msgstr "Selezionare campi per salvare elenco esportazione..."
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__url
msgid "Url"
msgstr "URL"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__user_ids
msgid "Users"
msgstr "Utenti"
#. module: base_export_async
#. odoo-python
#: code:addons/base_export_async/models/delay_export.py:0
#, python-format
msgid "You must set an email address to your user."
msgstr "Bisogna impostare una e-mail nel proprio utente."
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "You will receive the export file by email as soon as it is finished."
msgstr "Verrà inviato via e-mail il file esportazione appena sarà completato."

View file

@ -0,0 +1,180 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_export_async
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-03-04 16:45+0000\n"
"Last-Translator: Pedro Castro Silva <pedrocs@exo.pt>\n"
"Language-Team: none\n"
"Language: pt\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.3.2\n"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "(You will receive the export by email)"
msgstr "(Receberá a exportação por email)"
#. module: base_export_async
#: model:mail.template,body_html:base_export_async.delay_export_mail_template
msgid ""
"<p>Your export is available <a t-attf-href=\"{{ object.url }}\" target="
"\"_blank\">here</a>.</p>\n"
" <p>It will be automatically deleted the <t t-out=\"object."
"expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">This is an automated message "
"please do not reply.</span>\n"
" </p>\n"
" "
msgstr ""
#. module: base_export_async
#: model:ir.model,name:base_export_async.model_delay_export
msgid "Asynchronous Export"
msgstr "Exportação Assíncrona"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "Asynchronous export"
msgstr "Exportação assíncrona"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_uid
msgid "Created by"
msgstr "Criada por"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_date
msgid "Created on"
msgstr "Criado em"
#. module: base_export_async
#: model:mail.template,name:base_export_async.delay_export_mail_template
msgid "Delay Export"
msgstr ""
#. module: base_export_async
#: model:ir.actions.server,name:base_export_async.to_delete_attachment_ir_actions_server
#: model:ir.cron,cron_name:base_export_async.to_delete_attachment
msgid "Delete Generated Exports"
msgstr "Eliminar Exportações Geradas"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__display_name
msgid "Display Name"
msgstr "Nome a Apresentar"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__expiration_date
msgid "Expiration Date"
msgstr ""
#. module: base_export_async
#: model:mail.template,subject:base_export_async.delay_export_mail_template
msgid "Export {{ object.model_description }} {{ datetime.date.today() }}"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "External ID"
msgstr "ID Externo"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__id
msgid "ID"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export____last_update
msgid "Last Modified on"
msgstr "Última Modificação em"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_uid
msgid "Last Updated by"
msgstr "Última Atualização por"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_date
msgid "Last Updated on"
msgstr "Última Atualização em"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__model_description
msgid "Model Description"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/data_export.esm.js:0
#, python-format
msgid "Please select fields to save export list..."
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__url
msgid "Url"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__user_ids
msgid "Users"
msgstr "Utilizadores"
#. module: base_export_async
#. odoo-python
#: code:addons/base_export_async/models/delay_export.py:0
#, python-format
msgid "You must set an email address to your user."
msgstr "Tem que atribuir um email ao seu utilizador."
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "You will receive the export file by email as soon as it is finished."
msgstr ""
"Receberá o ficheiro de exportação por email assim que este estiver terminado."
#, python-format
#~ msgid "Please select fields to export..."
#~ msgstr "Por favor, selecione os campos a exportar..."
#, python-format
#~ msgid ""
#~ "\n"
#~ " <p>Your export is available <a href=\"{}\">here</a>.</p>\n"
#~ " <p>It will be automatically deleted the {}.</p>\n"
#~ " <p>&nbsp;</p>\n"
#~ " <p><span style=\"color: #808080;\">\n"
#~ " This is an automated message please do not reply.\n"
#~ " </span></p>\n"
#~ " "
#~ msgstr ""
#~ "\n"
#~ " <p>A sua exportação está disponível <a href=\"{}\">aqui</"
#~ "a>.</p>\n"
#~ " <p>Será automaticamente eliminada em {}.</p>\n"
#~ " <p>&nbsp;</p>\n"
#~ " <p><span style=\"color: #808080;\">\n"
#~ " Esta é uma mensagem automática. Por favor, não responda.\n"
#~ " </span></p>\n"
#~ " "
#, python-format
#~ msgid "Export {} {}"
#~ msgstr "Exportar {} {}"

View file

@ -0,0 +1,185 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_export_async
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-07-25 17:43+0000\n"
"Last-Translator: 黎伟杰 <674416404@qq.com>\n"
"Language-Team: none\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.7.1\n"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "(You will receive the export by email)"
msgstr "(您将通过电子邮件收到导出)"
#. module: base_export_async
#: model:mail.template,body_html:base_export_async.delay_export_mail_template
msgid ""
"<p>Your export is available <a t-attf-href=\"{{ object.url }}\" target="
"\"_blank\">here</a>.</p>\n"
" <p>It will be automatically deleted the <t t-out=\"object."
"expiration_date\"></t>.</p>\n"
" <br>\n"
" <p>\n"
" <span style=\"color: #808080;\">This is an automated message "
"please do not reply.</span>\n"
" </p>\n"
" "
msgstr ""
#. module: base_export_async
#: model:ir.model,name:base_export_async.model_delay_export
#, fuzzy
msgid "Asynchronous Export"
msgstr "异步导出"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/xml/base.xml:0
#, python-format
msgid "Asynchronous export"
msgstr "异步导出"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_uid
msgid "Created by"
msgstr "创建者"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__create_date
msgid "Created on"
msgstr "创建时间"
#. module: base_export_async
#: model:mail.template,name:base_export_async.delay_export_mail_template
msgid "Delay Export"
msgstr ""
#. module: base_export_async
#: model:ir.actions.server,name:base_export_async.to_delete_attachment_ir_actions_server
#: model:ir.cron,cron_name:base_export_async.to_delete_attachment
msgid "Delete Generated Exports"
msgstr "删除生成的导出"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__display_name
msgid "Display Name"
msgstr "显示名称"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__expiration_date
msgid "Expiration Date"
msgstr ""
#. module: base_export_async
#: model:mail.template,subject:base_export_async.delay_export_mail_template
msgid "Export {{ object.model_description }} {{ datetime.date.today() }}"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "External ID"
msgstr "外部ID"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__id
msgid "ID"
msgstr "ID"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export____last_update
msgid "Last Modified on"
msgstr "最后修改时间"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_uid
msgid "Last Updated by"
msgstr "最后更新者"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__write_date
msgid "Last Updated on"
msgstr "最后更新时间"
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__model_description
msgid "Model Description"
msgstr ""
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/data_export.esm.js:0
#, python-format
msgid "Please select fields to save export list..."
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__url
msgid "Url"
msgstr ""
#. module: base_export_async
#: model:ir.model.fields,field_description:base_export_async.field_delay_export__user_ids
msgid "Users"
msgstr "用户"
#. module: base_export_async
#. odoo-python
#: code:addons/base_export_async/models/delay_export.py:0
#, python-format
msgid "You must set an email address to your user."
msgstr "您必须为您的用户设置电子邮件地址。"
#. module: base_export_async
#. odoo-javascript
#: code:addons/base_export_async/static/src/js/list_controller.esm.js:0
#, python-format
msgid "You will receive the export file by email as soon as it is finished."
msgstr "完成后,您将通过电子邮件收到导出文件。"
#, python-format
#~ msgid "Please select fields to export..."
#~ msgstr "请选择要导出的字段..."
#, python-format
#~ msgid ""
#~ "\n"
#~ " <p>Your export is available <a href=\"{}\">here</a>.</p>\n"
#~ " <p>It will be automatically deleted the {}.</p>\n"
#~ " <p>&nbsp;</p>\n"
#~ " <p><span style=\"color: #808080;\">\n"
#~ " This is an automated message please do not reply.\n"
#~ " </span></p>\n"
#~ " "
#~ msgstr ""
#~ "\n"
#~ " <p>你的导出可以用 <a href=\"{}\">这里</a>.</p>\n"
#~ " <p>它将自动删除 {}。</p>\n"
#~ " <p>&nbsp;</p>\n"
#~ " <p><span style=\"color: #808080;\">\n"
#~ " 这是一条自动消息,请不要回复。\n"
#~ " </span></p>\n"
#~ " "
#, python-format
#~ msgid "Export {} {}"
#~ msgstr "导出{} {}"
#~ msgid "Allow to delay the export"
#~ msgstr "允许延迟导出"
#~ msgid "The user doesn't have an email address."
#~ msgstr "用户没有电子邮件地址。"

View file

@ -0,0 +1,4 @@
# Copyright 2019 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import delay_export

View file

@ -0,0 +1,147 @@
# Copyright 2019 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import base64
import json
import operator
from dateutil.relativedelta import relativedelta
from odoo import _, api, fields, models
from odoo.exceptions import UserError
from odoo.addons.web.controllers.export import CSVExport, ExcelExport
class DelayExport(models.Model):
_name = "delay.export"
_description = "Asynchronous Export"
user_ids = fields.Many2many("res.users", string="Users", index=True)
model_description = fields.Char()
url = fields.Char()
expiration_date = fields.Date()
@api.model
def delay_export(self, data):
"""Delay the export, called from js"""
params = json.loads(data.get("data"))
if not self.env.user.email:
raise UserError(_("You must set an email address to your user."))
self.with_delay().export(params)
@api.model
def _get_file_content(self, params):
export_format = params.get("format")
items = operator.itemgetter(
"model", "fields", "ids", "domain", "import_compat", "context", "user_ids"
)(params)
(model_name, fields_name, ids, domain, import_compat, context, user_ids) = items
model = self.env[model_name].with_context(
import_compat=import_compat, **context
)
records = model.browse(ids) or model.search(
domain, offset=0, limit=False, order=False
)
if not model._is_an_ordinary_table():
fields_name = [field for field in fields_name if field["name"] != "id"]
field_names = [f["name"] for f in fields_name]
import_data = records.export_data(field_names).get("datas", [])
if import_compat:
columns_headers = field_names
else:
columns_headers = [val["label"].strip() for val in fields_name]
if export_format == "csv":
csv = CSVExport()
return csv.from_data(columns_headers, import_data)
else:
xls = ExcelExport()
return xls.from_data(columns_headers, import_data)
@api.model
def export(self, params):
"""Delayed export of a file sent by email
The ``params`` is a dict of parameters, contains:
* format: csv/excel
* model: model to export
* fields: list of fields to export, a list of dict:
[{'label': '', 'name': ''}]
* ids: list of ids to export
* domain: domain for the export
* context: context for the export (language, ...)
* import_compat: if the export is export/import compatible (boolean)
* user_ids: optional list of user ids who receive the file
"""
content = self._get_file_content(params)
items = operator.itemgetter("model", "context", "format", "user_ids")(params)
model_name, context, export_format, user_ids = items
users = self.env["res.users"].browse(user_ids)
export_record = self.sudo().create({"user_ids": [(6, 0, users.ids)]})
name = "{}.{}".format(model_name, export_format)
attachment = (
self.env["ir.attachment"]
.sudo()
.create(
{
"name": name,
"datas": base64.b64encode(content),
"type": "binary",
"res_model": self._name,
"res_id": export_record.id,
}
)
)
url = "{}/web/content/ir.attachment/{}/datas/{}?download=true".format(
self.env["ir.config_parameter"].sudo().get_param("web.base.url"),
attachment.id,
attachment.name,
)
time_to_live = (
self.env["ir.config_parameter"].sudo().get_param("attachment.ttl", 7)
)
date_today = fields.Date.today()
expiration_date = fields.Date.to_string(
date_today + relativedelta(days=+int(time_to_live))
)
odoo_bot = self.sudo().env.ref("base.partner_root")
email_from = odoo_bot.email
model_description = self.env[model_name]._description
export_record.write(
{
"url": url,
"expiration_date": expiration_date,
"model_description": model_description,
}
)
self.env.ref("base_export_async.delay_export_mail_template").send_mail(
export_record.id,
email_values={
"email_from": email_from,
"reply_to": email_from,
"recipient_ids": [(6, 0, users.mapped("partner_id").ids)],
},
)
@api.model
def cron_delete(self):
time_to_live = (
self.env["ir.config_parameter"].sudo().get_param("attachment.ttl", 7)
)
date_today = fields.Date.today()
date_to_delete = date_today + relativedelta(days=-int(time_to_live))
self.search([("create_date", "<=", date_to_delete)]).unlink()

View file

@ -0,0 +1,2 @@
* Arnaud Pineux (ACSONE SA/NV) authored the initial prototype.
* Guewen Baconnier (Camptocamp)

View file

@ -0,0 +1 @@
Standard Export can be delayed in asynchronous jobs executed in the background and then send by email to the user.

View file

@ -0,0 +1,6 @@
The user is presented with a new checkbox "Asynchronous export"
in the export screen. When selected, the export is delayed in a
background job.
The .csv or .xls file generated by the export will be sent by email
to the user who execute the export.

View file

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_delay_export,delay.export.user,model_delay_export,base.group_user,1,0,0,0
access_delay_export_sudo,delay.export.sudo,model_delay_export,base.group_no_one,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_delay_export delay.export.user model_delay_export base.group_user 1 0 0 0
3 access_delay_export_sudo delay.export.sudo model_delay_export base.group_no_one 1 1 1 1

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="delay_export_user_only" model="ir.rule">
<field name="name">Only user can read delay.export</field>
<field name="model_id" ref="model_delay_export" />
<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">[('user_ids', 'in', user.id)]</field>
</record>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,433 @@
<!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>Base Export 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="base-export-async">
<h1 class="title">Base Export Async</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:85ce335207ce3505a7676a8a78743155f9f8c01d1c6f777fe2308c5e77f00e5a
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/queue/tree/16.0/base_export_async"><img alt="OCA/queue" src="https://img.shields.io/badge/github-OCA%2Fqueue-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/queue-16-0/queue-16-0-base_export_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/queue&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>Standard Export can be delayed in asynchronous jobs executed in the background and then send by email to the user.</p>
<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>The user is presented with a new checkbox “Asynchronous export”
in the export screen. When selected, the export is delayed in a
background job.</p>
<p>The .csv or .xls file generated by the export will be sent by email
to the user who execute the export.</p>
</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/queue/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/queue/issues/new?body=module:%20base_export_async%0Aversion:%2016.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>ACSONE SA/NV</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Arnaud Pineux (ACSONE SA/NV) authored the initial prototype.</li>
<li>Guewen Baconnier (Camptocamp)</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>This module is part of the <a class="reference external" href="https://github.com/OCA/queue/tree/16.0/base_export_async">OCA/queue</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,30 @@
/** @odoo-module */
import {ExportDataDialog} from "@web/views/view_dialogs/export_data_dialog";
import {patch} from "@web/core/utils/patch";
patch(ExportDataDialog.prototype, "base_export_async", {
setup() {
this._super();
this.state.async = false;
},
onToggleExportAsync(value) {
this.state.async = value;
},
async onClickExportButton() {
if (!this.state.exportList.length) {
return this.notification.add(
this.env._t("Please select fields to save export list..."),
{
type: "danger",
}
);
}
await this.props.download(
this.state.exportList,
this.state.isCompatible,
this.availableFormats[this.state.selectedFormat].tag,
this.state.async
);
},
});

View file

@ -0,0 +1,73 @@
/** @odoo-module **/
import {blockUI, unblockUI} from "web.framework";
import Dialog from "web.Dialog";
import {ListController} from "@web/views/list/list_controller";
import {_t} from "web.core";
import {download} from "@web/core/network/download";
import {patch} from "@web/core/utils/patch";
patch(ListController.prototype, "base_export_async", {
async downloadExport(fields, import_compat, format, async = false) {
let ids = false;
if (!this.isDomainSelected) {
const resIds = await this.getSelectedResIds();
ids = resIds.length > 0 && resIds;
}
const exportedFields = fields.map((field) => ({
name: field.name || field.id,
label: field.label || field.string,
store: field.store,
type: field.field_type || field.type,
}));
if (import_compat) {
exportedFields.unshift({name: "id", label: this.env._t("External ID")});
}
if (async) {
/*
Call the delay export if Async is checked
*/
blockUI();
const args = [
{
data: JSON.stringify({
format: format,
model: this.model.root.resModel,
fields: exportedFields,
ids: ids,
domain: this.model.root.domain,
context: this.props.context,
import_compat: import_compat,
user_ids: [this.props.context.uid],
}),
},
];
const orm = this.env.services.orm;
orm.call("delay.export", "delay_export", args).then(function () {
unblockUI();
Dialog.alert(
this,
_t(
"You will receive the export file by email as soon as it is finished."
)
);
});
} else {
await download({
data: {
data: JSON.stringify({
import_compat,
context: this.props.context,
domain: this.model.root.domain,
fields: exportedFields,
groupby: this.model.root.groupBy,
ids,
model: this.model.root.resModel,
}),
},
url: `/web/export/${format}`,
});
}
},
});

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve">
<t
t-name="base_export_async.ExportDataDialogAsync"
t-inherit="web.ExportDataDialog"
t-inherit-mode="extension"
>
<xpath expr="//div[hasclass('o_import_compat')]" position="after">
<CheckBox
id="async_export"
value="state.async"
onChange.bind="onToggleExportAsync"
>
<strong>Asynchronous export </strong> (You will receive the export by email)
</CheckBox>
</xpath>
</t>
</templates>

View file

@ -0,0 +1,4 @@
# Copyright 2019 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import test_base_export_async

View file

@ -0,0 +1,100 @@
# Copyright 2019 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import json
from unittest import mock
from unittest.mock import patch
import freezegun
from dateutil.relativedelta import relativedelta
import odoo.tests.common as common
from odoo import fields
from odoo.addons.web.controllers.export import ExcelExport
data_csv = {
"data": """{"format": "csv", "model": "res.partner",
"fields": [{"name": "id", "label": "External ID"},
{"name": "display_name", "label": "Display Name"},
{"name": "email", "label": "Email"},
{"name": "phone", "label": "Phone"}],
"ids": false,
"domain": [],
"context": {"lang": "en_US", "tz": "Europe/Brussels", "uid": 2},
"import_compat": false,
"user_ids": [6]
}"""
}
data_xls = {
"data": """{"format": "xls", "model": "res.partner",
"fields": [{"name": "id", "label": "External ID"},
{"name": "display_name", "label": "Display Name"},
{"name": "email", "label": "Email"},
{"name": "phone", "label": "Phone"}],
"ids": false,
"domain": [],
"context": {"lang": "en_US", "tz": "Europe/Brussels", "uid": 2},
"import_compat": false,
"user_ids": [6]
}"""
}
class TestBaseExportAsync(common.TransactionCase):
def setUp(self):
super().setUp()
self.delay_export_obj = self.env["delay.export"]
self.job_obj = self.env["queue.job"]
with patch("odoo.http._request_stack") as mock_request_stack:
mock_request = mock.Mock(env=self.env)
mock_request_stack.push(mock_request)
self.addCleanup(mock_request_stack.pop)
def test_delay_export(self):
"""Check that the call create a new JOB"""
nbr_job = len(self.job_obj.search([]))
self.delay_export_obj.delay_export(data_csv)
new_nbr_job = len(self.job_obj.search([]))
self.assertEqual(new_nbr_job, nbr_job + 1)
def test_export_csv(self):
"""Check that the export generate an attachment and email"""
params = json.loads(data_csv.get("data"))
mails = self.env["mail.mail"].search([])
attachments = self.env["ir.attachment"].search([])
self.delay_export_obj.export(params)
new_mail = self.env["mail.mail"].search([]) - mails
new_attachment = self.env["ir.attachment"].search([]) - attachments
self.assertEqual(len(new_mail), 1)
self.assertEqual(new_attachment.name, "res.partner.csv")
def test_export_xls(self):
"""Check that the export generate an attachment and email"""
params = json.loads(data_xls.get("data"))
mails = self.env["mail.mail"].search([])
attachments = self.env["ir.attachment"].search([])
with patch.object(ExcelExport, "from_data", return_value=b"\x41\x42\x43\x44"):
self.delay_export_obj.export(params)
new_mail = self.env["mail.mail"].search([]) - mails
new_attachment = self.env["ir.attachment"].search([]) - attachments
self.assertEqual(len(new_mail), 1)
self.assertEqual(new_attachment.name, "res.partner.xls")
def test_cron_delete(self):
"""Check that cron delete attachment after TTL"""
params = json.loads(data_csv.get("data"))
attachments = self.env["ir.attachment"].search([])
self.delay_export_obj.export(params)
new_attachment = self.env["ir.attachment"].search([]) - attachments
time_to_live = (
self.env["ir.config_parameter"].sudo().get_param("attachment.ttl", 7)
)
date_today = fields.Datetime.now()
date_past_ttl = date_today + relativedelta(days=int(time_to_live))
with freezegun.freeze_time(date_past_ttl):
self.delay_export_obj.cron_delete()
# The attachment must be deleted
self.assertFalse(new_attachment.exists())

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Base_export_async Module - base_export_async
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for base_export_async. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,6 @@
# Dependencies
This addon depends on:
- [web](../../odoo-bringout-oca-ocb-web)
- [queue_job](../../odoo-bringout-oca-queue-queue_job)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon base_export_async or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-queue-base_export_async"
# or
uv pip install odoo-bringout-oca-queue-base_export_async"
```

View file

@ -0,0 +1,12 @@
# Models
Detected core models and extensions in base_export_async.
```mermaid
classDiagram
class delay_export
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: base_export_async. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon base_export_async
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,42 @@
# Security
Access control and security definitions in base_export_async.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../base_export_async/security/ir.model.access.csv)**
- 2 model access rules
## Record Rules
Row-level security rules defined in:
- **[ir_rule.xml](../base_export_async/security/ir_rule.xml)**
## Security Groups & Configuration
Security groups and permissions defined in:
- **[ir_rule.xml](../base_export_async/security/ir_rule.xml)**
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[ir.model.access.csv](../base_export_async/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
- **[ir_rule.xml](../base_export_async/security/ir_rule.xml)**
- Security groups, categories, and XML-based rules
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon base_export_async
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,43 @@
[project]
name = "odoo-bringout-oca-queue-base_export_async"
version = "16.0.0"
description = "Base Export Async - Asynchronous export with job queue"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-web>=16.0.0",
"odoo-bringout-oca-queue-queue_job>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["base_export_async"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]