diff --git a/attachment_queue/README.rst b/attachment_queue/README.rst
new file mode 100644
index 00000000000..ebf7b5acc32
--- /dev/null
+++ b/attachment_queue/README.rst
@@ -0,0 +1,125 @@
+.. image:: https://odoo-community.org/readme-banner-image
+ :target: https://odoo-community.org/get-involved?utm_source=readme
+ :alt: Odoo Community Association
+
+================
+Attachment Queue
+================
+
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:872bf341131657a1bdefbf1672685671ad40af2f9f23886b2b3c19b03e879e7e
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |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/license-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%2Fserver--tools-lightgray.png?logo=github
+ :target: https://github.com/OCA/server-tools/tree/19.0/attachment_queue
+ :alt: OCA/server-tools
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/server-tools-19-0/server-tools-19-0-attachment_queue
+ :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/server-tools&target_branch=19.0
+ :alt: Try me on Runboat
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module adds async processing capabilities to attachments by
+implementing a new model attachment.queue that wraps attachments and
+stores additional information so that it can be processed in an
+asynchronous way.
+
+A use case of this module can be found in the attachment_synchronize
+module.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+Go the menu Settings > Technical > Database Structure > Attachments
+Queue
+
+You can create / see standard attachments with additional fields
+
+Configure the batch limit for attachments that can be sync by the cron
+task at a go:
+
+Settings > Technical > System parameters >
+attachment_queue_cron_batch_limit
+
+|tree view|
+
+This module can be used in combination with attachment_synchronize to
+control file processing workflow
+
+|form view|
+
+.. |tree view| image:: https://raw.githubusercontent.com/OCA/server-tools/19.0/attachment_queue/static/description/tree.png
+.. |form view| image:: https://raw.githubusercontent.com/OCA/server-tools/19.0/attachment_queue/static/description/form.png
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub 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 `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+-------
+
+* Akretion
+
+Contributors
+------------
+
+- Valentin CHEMIERE
+- Florian da Costa
+- Angel Moya
+- Dan Kiplangat
+- Kevin Khao
+
+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-florian-dacosta| image:: https://github.com/florian-dacosta.png?size=40px
+ :target: https://github.com/florian-dacosta
+ :alt: florian-dacosta
+.. |maintainer-sebastienbeau| image:: https://github.com/sebastienbeau.png?size=40px
+ :target: https://github.com/sebastienbeau
+ :alt: sebastienbeau
+
+Current `maintainers `__:
+
+|maintainer-florian-dacosta| |maintainer-sebastienbeau|
+
+This module is part of the `OCA/server-tools `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/attachment_queue/__init__.py b/attachment_queue/__init__.py
new file mode 100644
index 00000000000..aee8895e7a3
--- /dev/null
+++ b/attachment_queue/__init__.py
@@ -0,0 +1,2 @@
+from . import models
+from . import wizards
diff --git a/attachment_queue/__manifest__.py b/attachment_queue/__manifest__.py
new file mode 100644
index 00000000000..c1f208d505b
--- /dev/null
+++ b/attachment_queue/__manifest__.py
@@ -0,0 +1,28 @@
+# Copyright 2015 Florian DA COSTA @ Akretion
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+{
+ "name": "Attachment Queue",
+ "version": "19.0.1.0.0",
+ "author": "Akretion,Odoo Community Association (OCA)",
+ "summary": "Base module adding the concept of queue for processing files",
+ "website": "https://github.com/OCA/server-tools",
+ "maintainers": ["florian-dacosta", "sebastienbeau"],
+ "license": "AGPL-3",
+ "category": "Generic Modules",
+ "depends": ["base", "mail", "queue_job"],
+ "data": [
+ "views/attachment_queue_view.xml",
+ "security/ir.model.access.csv",
+ "data/mail_template.xml",
+ "data/queue_job_channel.xml",
+ "wizards/attachement_queue_reschedule.xml",
+ ],
+ "demo": ["demo/attachment_queue.xml"],
+ "installable": True,
+ "external_dependencies": {
+ "python": [
+ "openupgradelib",
+ ],
+ },
+}
diff --git a/attachment_queue/data/mail_template.xml b/attachment_queue/data/mail_template.xml
new file mode 100644
index 00000000000..e4563399b09
--- /dev/null
+++ b/attachment_queue/data/mail_template.xml
@@ -0,0 +1,16 @@
+
+
+
+ {{object.failure_emails}}
+ Attachment Failure notification
+ The attachment {{object.name}} has failed
+
+ Hello,
+ The attachment {{object.name}} has failed with the following error message :
{{object.state_message}}
+ Regards,
+ ]]>
+
+
diff --git a/attachment_queue/data/queue_job_channel.xml b/attachment_queue/data/queue_job_channel.xml
new file mode 100644
index 00000000000..bb2d16d986e
--- /dev/null
+++ b/attachment_queue/data/queue_job_channel.xml
@@ -0,0 +1,7 @@
+
+
+
+ attachment_queue
+
+
+
diff --git a/attachment_queue/demo/attachment_queue.xml b/attachment_queue/demo/attachment_queue.xml
new file mode 100644
index 00000000000..e0785b24373
--- /dev/null
+++ b/attachment_queue/demo/attachment_queue.xml
@@ -0,0 +1,6 @@
+
+
+
+ Dummy file Used for unitests
+
+
diff --git a/attachment_queue/i18n/attachment_queue.pot b/attachment_queue/i18n/attachment_queue.pot
new file mode 100644
index 00000000000..4d9a70885c8
--- /dev/null
+++ b/attachment_queue/i18n/attachment_queue.pot
@@ -0,0 +1,552 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * attachment_queue
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 18.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: attachment_queue
+#: model:mail.template,body_html:attachment_queue.attachment_failure_notification
+msgid ""
+"Hello,
\n"
+" The attachment ${object.name} has failed with the following error message :
${object.state_message}
\n"
+" Regards,
\n"
+" "
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__access_token
+msgid "Access Token"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_needaction
+msgid "Action Needed"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_ids
+msgid "Activities"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_exception_decoration
+msgid "Activity Exception Decoration"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_state
+msgid "Activity State"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_type_icon
+msgid "Activity Type Icon"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__assigned_attachment_ids
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__assigned_attachment_ids
+msgid "Assigned Attachments"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__attachment_id
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Attachment"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_attachment_count
+msgid "Attachment Count"
+msgstr ""
+
+#. module: attachment_queue
+#: model:mail.template,name:attachment_queue.attachment_failure_notification
+msgid "Attachment Failure notification"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model,name:attachment_queue.model_attachment_queue
+msgid "Attachment Queue"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__local_url
+msgid "Attachment URL"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__attachment_ids
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Attachments"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.actions.act_window,name:attachment_queue.action_attachment_queue
+#: model:ir.ui.menu,name:attachment_queue.menu_attachment_queue
+msgid "Attachments Queue"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Binary"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment
+msgid "Cancel"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__checksum
+msgid "Checksum/SHA1"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__failure_emails
+msgid ""
+"Comma-separated list of email addresses to be notified in case offailure"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__company_id
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Company"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__create_uid
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__create_date
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Creation Month"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__db_datas
+msgid "Database Data"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__date_done
+msgid "Date Done"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__description
+msgid "Description"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__display_name
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields.selection,name:attachment_queue.selection__attachment_queue__state__done
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Done"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
+msgid "Error"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields.selection,name:attachment_queue.selection__attachment_queue__state__failed
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Failed"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__failure_emails
+msgid "Failure Emails"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__datas
+msgid "File Content (base64)"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__raw
+msgid "File Content (raw)"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__file_size
+msgid "File Size"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__file_type
+msgid "File Type"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "File type"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Filter on my documents"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_follower_ids
+msgid "Followers"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_partner_ids
+msgid "Followers (Partners)"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__activity_type_icon
+msgid "Font awesome icon e.g. fa-tasks"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Group By"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__has_message
+msgid "Has Message"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__id
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__id
+msgid "ID"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_exception_icon
+msgid "Icon"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__activity_exception_icon
+msgid "Icon to indicate an exception activity."
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_needaction
+msgid "If checked, new messages require your attention."
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_has_error
+msgid "If checked, some messages have a delivery error."
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__image_height
+msgid "Image Height"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__image_src
+msgid "Image Src"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__image_width
+msgid "Image Width"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__index_content
+msgid "Indexed Content"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_is_follower
+msgid "Is Follower"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__public
+msgid "Is public document"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__write_uid
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__write_date
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__attachment_id
+msgid "Link to ir.attachment model "
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
+msgid "Manual run"
+msgstr ""
+
+#. module: attachment_queue
+#. odoo-python
+#: code:addons/attachment_queue/models/attachment_queue.py:0
+msgid "Manually set to done by %(name)s"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_has_error
+msgid "Message Delivery error"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_ids
+msgid "Messages"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__mimetype
+msgid "Mime Type"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__my_activity_date_deadline
+msgid "My Activity Deadline"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "My Document(s)"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__name
+msgid "Name"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_date_deadline
+msgid "Next Activity Deadline"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_summary
+msgid "Next Activity Summary"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_type_id
+msgid "Next Activity Type"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_needaction_counter
+msgid "Number of Actions"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_has_error_counter
+msgid "Number of errors"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_needaction_counter
+msgid "Number of messages requiring action"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__original_id
+msgid "Original (unoptimized, unresized) attachment"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Owner"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields.selection,name:attachment_queue.selection__attachment_queue__state__pending
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Pending"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment
+msgid "Requeue Attachments"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment
+msgid "Reschedule"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.actions.act_window,name:attachment_queue.action_reschedule_attachment
+msgid "Reschedule Attachment"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_field
+msgid "Resource Field"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_id
+msgid "Resource ID"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_model
+msgid "Resource Model"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_name
+msgid "Resource Name"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_user_id
+msgid "Responsible User"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
+msgid "Set to Done"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__smart_search
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__smart_search
+msgid "Smart Search"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__state
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "State"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__state_message
+msgid "State Message"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__activity_state
+msgid ""
+"Status based on activities\n"
+"Overdue: Due date is already passed\n"
+"Today: Activity date is today\n"
+"Planned: Future activities."
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__store_fname
+msgid "Stored Filename"
+msgstr ""
+
+#. module: attachment_queue
+#: model:mail.template,subject:attachment_queue.attachment_failure_notification
+msgid "The attachment {{object.name}} has failed"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__file_type
+msgid ""
+"The file type determines an import method to be used to parse and transform "
+"data before their import in ERP or an export"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment
+msgid "The selected attachments will be rescheduled."
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__type
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Type"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__activity_exception_decoration
+msgid "Type of the exception activity on record."
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "URL"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__url
+msgid "Url"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__voice_ids
+msgid "Voice"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__website_message_ids
+msgid "Website Messages"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__website_message_ids
+msgid "Website communication history"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model,name:attachment_queue.model_attachment_queue_reschedule
+msgid "Wizard to reschedule a selection of attachments"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__type
+msgid ""
+"You can either upload a file from your computer or copy/paste an internet "
+"link to your file."
+msgstr ""
+
+#. module: attachment_queue
+#. odoo-python
+#: code:addons/attachment_queue/tests/test_models.py:0
+msgid "boom"
+msgstr ""
diff --git a/attachment_queue/i18n/es.po b/attachment_queue/i18n/es.po
new file mode 100644
index 00000000000..43dde64329f
--- /dev/null
+++ b/attachment_queue/i18n/es.po
@@ -0,0 +1,655 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * attachment_queue
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2024-02-12 20:35+0000\n"
+"Last-Translator: Ivorra78 \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: attachment_queue
+#: model:mail.template,body_html:attachment_queue.attachment_failure_notification
+msgid ""
+"\n"
+" Hello,
\n"
+" The attachment ${object.name} has failed with the following error "
+"message :
${object.state_message}
\n"
+" Regards,
\n"
+" "
+msgstr ""
+"\n"
+" Hola,
\n"
+" El archivo adjunto ${object.name}ha fallado con el siguiente mensaje de "
+"error :
${object.state_message}
\n"
+" Saludos,
\n"
+" "
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__access_token
+msgid "Access Token"
+msgstr "Ficha de Acceso"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_needaction
+msgid "Action Needed"
+msgstr "Acción Necesaria"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_ids
+msgid "Activities"
+msgstr "Actividades"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_exception_decoration
+msgid "Activity Exception Decoration"
+msgstr "Decoración de Actividad de Excepción"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_state
+msgid "Activity State"
+msgstr "Estado de la Actividad"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_type_icon
+msgid "Activity Type Icon"
+msgstr "Icono de Tipo de Actividad"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__assigned_attachment_ids
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__assigned_attachment_ids
+msgid "Assigned Attachments"
+msgstr "Archivos Adjuntos Asignados"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__attachment_id
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Attachment"
+msgstr "Archivo Adjunto"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_attachment_count
+msgid "Attachment Count"
+msgstr "Conteo de Adjuntos"
+
+#. module: attachment_queue
+#: model:mail.template,name:attachment_queue.attachment_failure_notification
+msgid "Attachment Failure notification"
+msgstr "Adjuntar Notificación de fallo"
+
+#. module: attachment_queue
+#: model:ir.model,name:attachment_queue.model_attachment_queue
+msgid "Attachment Queue"
+msgstr "Cola de Archivos Adjuntos"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__local_url
+msgid "Attachment URL"
+msgstr "URL del Archivo Adjunto"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__attachment_ids
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Attachments"
+msgstr "Archivos Adjuntos"
+
+#. module: attachment_queue
+#: model:ir.actions.act_window,name:attachment_queue.action_attachment_queue
+#: model:ir.ui.menu,name:attachment_queue.menu_attachment_queue
+msgid "Attachments Queue"
+msgstr "Cola de Archivos Adjuntos"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Binary"
+msgstr "Binario"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment
+msgid "Cancel"
+msgstr "Cancelar"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__changeset_change_ids
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__changeset_change_ids
+msgid "Changeset Changes"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__changeset_ids
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__changeset_ids
+msgid "Changesets"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__checksum
+msgid "Checksum/SHA1"
+msgstr "Verificación de suma/SHA1"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__failure_emails
+msgid ""
+"Comma-separated list of email addresses to be notified in case offailure"
+msgstr ""
+"Lista separada por comas de direcciones de correo electrónico a las que "
+"notificar en caso de fallo"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__company_id
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Company"
+msgstr "Companía"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__count_changesets
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__count_changesets
+msgid "Count Changesets"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__count_pending_changeset_changes
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__count_pending_changeset_changes
+msgid "Count Pending Changeset Changes"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__count_pending_changesets
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__count_pending_changesets
+msgid "Count Pending Changesets"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__create_uid
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__create_uid
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__create_date
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__create_date
+msgid "Created on"
+msgstr "Creado el"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Creation Month"
+msgstr "Mes de Creación"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__db_datas
+msgid "Database Data"
+msgstr "Base de Datos"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__date_done
+msgid "Date Done"
+msgstr "Fecha de Realización"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__description
+msgid "Description"
+msgstr "Descripción"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__display_name
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__display_name
+msgid "Display Name"
+msgstr "Mostrar Nombre"
+
+#. module: attachment_queue
+#: model:ir.model.fields.selection,name:attachment_queue.selection__attachment_queue__state__done
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Done"
+msgstr "Realizado"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
+msgid "Error"
+msgstr "Error"
+
+#. module: attachment_queue
+#: model:ir.model.fields.selection,name:attachment_queue.selection__attachment_queue__state__failed
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Failed"
+msgstr "Fallido"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__failure_emails
+msgid "Failure Emails"
+msgstr "Correos Electrónicos de Error"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__datas
+msgid "File Content (base64)"
+msgstr "Contenido del Archivo (base64)"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__raw
+msgid "File Content (raw)"
+msgstr "Contenido del Archivo (sin procesar)"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__file_size
+msgid "File Size"
+msgstr "Tamaño del Archivo"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__file_type
+msgid "File Type"
+msgstr "Tipo de Archivo"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "File type"
+msgstr "Tipo de archivo"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Filter on my documents"
+msgstr "Filtrar en mis documentos"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_follower_ids
+msgid "Followers"
+msgstr "Seguidores/as"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_partner_ids
+msgid "Followers (Partners)"
+msgstr "Seguidores (Socios)"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__activity_type_icon
+msgid "Font awesome icon e.g. fa-tasks"
+msgstr "Icono de fuente impresionante, por ejemplo fa-tasks"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Group By"
+msgstr "Grupo Por"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__has_message
+msgid "Has Message"
+msgstr "Tiene Mensaje"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__id
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__id
+msgid "ID"
+msgstr "ID"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_exception_icon
+msgid "Icon"
+msgstr "Icono"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__activity_exception_icon
+msgid "Icon to indicate an exception activity."
+msgstr "Icono para indicar la excepción de la actividad."
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_needaction
+msgid "If checked, new messages require your attention."
+msgstr "Si está marcada, nuevos mensajes requieren su atención."
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_has_error
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_has_sms_error
+msgid "If checked, some messages have a delivery error."
+msgstr "Si está marcado, algunos mensajes tienen un error de entrega."
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__image_height
+msgid "Image Height"
+msgstr "Altura de la imagen"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__image_src
+msgid "Image Src"
+msgstr "Origen de la imagen"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__image_width
+msgid "Image Width"
+msgstr "Anchura de la Imagen"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__index_content
+msgid "Indexed Content"
+msgstr "Contenido Indexado"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_is_follower
+msgid "Is Follower"
+msgstr "Es Seguidor/a"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__public
+msgid "Is public document"
+msgstr "Es un documento público"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue____last_update
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule____last_update
+msgid "Last Modified on"
+msgstr "Última modificación el"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__write_uid
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__write_uid
+msgid "Last Updated by"
+msgstr "Última Actualización por"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__write_date
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__write_date
+msgid "Last Updated on"
+msgstr "Última Actualización el"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__attachment_id
+msgid "Link to ir.attachment model "
+msgstr "Enlace al modelo ir.attachment "
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_main_attachment_id
+msgid "Main Attachment"
+msgstr "Archivo Adjunto Principal"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
+msgid "Manual run"
+msgstr "Ejecución manual"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_has_error
+msgid "Message Delivery error"
+msgstr "Error en Entrega de Mensaje"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_ids
+msgid "Messages"
+msgstr "Mensajes"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__mimetype
+msgid "Mime Type"
+msgstr "Tipo Mimo"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__my_activity_date_deadline
+msgid "My Activity Deadline"
+msgstr "Fecha Límite de Mi Actividad"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "My Document(s)"
+msgstr "Mis Documento(s)"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__name
+msgid "Name"
+msgstr "Nombre"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_calendar_event_id
+msgid "Next Activity Calendar Event"
+msgstr "Próximo Evento del Calendario de Actividades"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_date_deadline
+msgid "Next Activity Deadline"
+msgstr "Fecha límite de la Siguiente Actividad"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_summary
+msgid "Next Activity Summary"
+msgstr "Resumen de la Siguiente Actividad"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_type_id
+msgid "Next Activity Type"
+msgstr "Tipo de la Siguiente Actividad"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_needaction_counter
+msgid "Number of Actions"
+msgstr "Número de Acciones"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_has_error_counter
+msgid "Number of errors"
+msgstr "Número de errores"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_needaction_counter
+msgid "Number of messages requiring action"
+msgstr "Número de mensajes que requieren una acción"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr "Número de mensajes con error de entrega"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__original_id
+msgid "Original (unoptimized, unresized) attachment"
+msgstr "Archivo adjunto original (sin optimizar y sin redimensionar)"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Owner"
+msgstr "Propietario"
+
+#. module: attachment_queue
+#: model:ir.model.fields.selection,name:attachment_queue.selection__attachment_queue__state__pending
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Pending"
+msgstr "Pendiente"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment
+msgid "Requeue Attachments"
+msgstr "Volver a poner en cola los Archivos Adjuntos"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment
+msgid "Reschedule"
+msgstr "Reprogramar"
+
+#. module: attachment_queue
+#: model:ir.actions.act_window,name:attachment_queue.action_reschedule_attachment
+msgid "Reschedule Attachment"
+msgstr "Reprogramar Adjunto"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_field
+msgid "Resource Field"
+msgstr "Campo de Recurso"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_id
+msgid "Resource ID"
+msgstr "ID del Recurso"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_model
+msgid "Resource Model"
+msgstr "Modelo del Recurso"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_name
+msgid "Resource Name"
+msgstr "Nombre del Recurso"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_user_id
+msgid "Responsible User"
+msgstr "Usuario Responsable"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_has_sms_error
+msgid "SMS Delivery error"
+msgstr "Error en la Entrega de SMS"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
+msgid "Set to Done"
+msgstr "Establecer como Hecho"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__smart_search
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__smart_search
+msgid "Smart Search"
+msgstr "Búsqueda Inteligente"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__state
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "State"
+msgstr "Estado"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__state_message
+msgid "State Message"
+msgstr "Mensaje de Estado"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__activity_state
+msgid ""
+"Status based on activities\n"
+"Overdue: Due date is already passed\n"
+"Today: Activity date is today\n"
+"Planned: Future activities."
+msgstr ""
+"Estado basado en actividades\n"
+"Vencido: Fecha de vencimiento ya paso\n"
+"Hoy: La fecha de actividad es hoy\n"
+"Planeado: Actividades futuras."
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__store_fname
+msgid "Stored Filename"
+msgstr "Nombre del Archivo Almacenado"
+
+#. module: attachment_queue
+#: model:mail.template,subject:attachment_queue.attachment_failure_notification
+msgid "The attachment {{object.name}} has failed"
+msgstr "El archivo adjunto {{object.name}} ha fallado"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__file_type
+msgid ""
+"The file type determines an import method to be used to parse and transform "
+"data before their import in ERP or an export"
+msgstr ""
+"El tipo de archivo determina el método de importación que se utilizará para "
+"analizar y transformar los datos antes de importarlos al ERP o exportarlos"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__count_pending_changeset_changes
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue_reschedule__count_pending_changeset_changes
+msgid "The number of pending changes of this record"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__count_pending_changesets
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue_reschedule__count_pending_changesets
+msgid "The number of pending changesets of this record"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__count_changesets
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue_reschedule__count_changesets
+msgid "The overall number of changesets of this record"
+msgstr ""
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment
+msgid "The selected attachments will be rescheduled."
+msgstr "Los anexos seleccionados se reprogramarán."
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__type
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Type"
+msgstr "Tipo"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__activity_exception_decoration
+msgid "Type of the exception activity on record."
+msgstr "Tipo de actividad excepcional registrada."
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "URL"
+msgstr "URL"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__url
+msgid "Url"
+msgstr "Url"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__user_can_see_changeset
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__user_can_see_changeset
+msgid "User Can See Changeset"
+msgstr ""
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__website_message_ids
+msgid "Website Messages"
+msgstr "Mensajes de la Página Web"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__website_message_ids
+msgid "Website communication history"
+msgstr "Historial de la comunicación del sitio web"
+
+#. module: attachment_queue
+#: model:ir.model,name:attachment_queue.model_attachment_queue_reschedule
+msgid "Wizard to reschedule a selection of attachments"
+msgstr "Asistente para reprogramar una selección de anexos"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__type
+msgid ""
+"You can either upload a file from your computer or copy/paste an internet "
+"link to your file."
+msgstr ""
+"Puede cargar un archivo desde su ordenador o copiar/pegar un enlace de "
+"Internet a su archivo."
+
+#. module: attachment_queue
+#. odoo-python
+#: code:addons/attachment_queue/tests/test_models.py:0
+#, python-format
+msgid "boom"
+msgstr "auge"
diff --git a/attachment_queue/i18n/it.po b/attachment_queue/i18n/it.po
new file mode 100644
index 00000000000..eddd8c9fbb4
--- /dev/null
+++ b/attachment_queue/i18n/it.po
@@ -0,0 +1,655 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * attachment_queue
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2025-01-16 16:06+0000\n"
+"Last-Translator: mymage \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 5.6.2\n"
+
+#. module: attachment_queue
+#: model:mail.template,body_html:attachment_queue.attachment_failure_notification
+msgid ""
+"\n"
+" Hello,
\n"
+" The attachment ${object.name} has failed with the following error "
+"message :
${object.state_message}
\n"
+" Regards,
\n"
+" "
+msgstr ""
+"\n"
+" Salce,
\n"
+" l'allegato ${object.name} ha un errore con il segente messaggio :
"
+"${object.state_message}
\n"
+" Saluti,
\n"
+" "
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__access_token
+msgid "Access Token"
+msgstr "Token di accesso"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_needaction
+msgid "Action Needed"
+msgstr "Azione richiesta"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_ids
+msgid "Activities"
+msgstr "Attività"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_exception_decoration
+msgid "Activity Exception Decoration"
+msgstr "Decorazione eccezione attività"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_state
+msgid "Activity State"
+msgstr "Stato attività"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_type_icon
+msgid "Activity Type Icon"
+msgstr "Icona tipo attività"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__assigned_attachment_ids
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__assigned_attachment_ids
+msgid "Assigned Attachments"
+msgstr "Allegati assegnati"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__attachment_id
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Attachment"
+msgstr "Allegato"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_attachment_count
+msgid "Attachment Count"
+msgstr "Conteggio allegati"
+
+#. module: attachment_queue
+#: model:mail.template,name:attachment_queue.attachment_failure_notification
+msgid "Attachment Failure notification"
+msgstr "Notifica errore allegato"
+
+#. module: attachment_queue
+#: model:ir.model,name:attachment_queue.model_attachment_queue
+msgid "Attachment Queue"
+msgstr "Coda allegato"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__local_url
+msgid "Attachment URL"
+msgstr "URL allegato"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__attachment_ids
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Attachments"
+msgstr "Allegati"
+
+#. module: attachment_queue
+#: model:ir.actions.act_window,name:attachment_queue.action_attachment_queue
+#: model:ir.ui.menu,name:attachment_queue.menu_attachment_queue
+msgid "Attachments Queue"
+msgstr "Coda allegati"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Binary"
+msgstr "Binaria"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment
+msgid "Cancel"
+msgstr "Annulla"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__changeset_change_ids
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__changeset_change_ids
+msgid "Changeset Changes"
+msgstr "Modifiche dell'insieme di modifiche"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__changeset_ids
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__changeset_ids
+msgid "Changesets"
+msgstr "Insiemi di modifiche"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__checksum
+msgid "Checksum/SHA1"
+msgstr "Checksum/SHA1"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__failure_emails
+msgid ""
+"Comma-separated list of email addresses to be notified in case offailure"
+msgstr ""
+"Elenco di indirizzi e-mail separati da virgola da avvisare in caso di errore"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__company_id
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Company"
+msgstr "Azienda"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__count_changesets
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__count_changesets
+msgid "Count Changesets"
+msgstr "Conta insiemi di modifiche"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__count_pending_changeset_changes
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__count_pending_changeset_changes
+msgid "Count Pending Changeset Changes"
+msgstr "Conteggio modifiche dell'insieme di modifiche in attesa"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__count_pending_changesets
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__count_pending_changesets
+msgid "Count Pending Changesets"
+msgstr "Conteggio insieme di modifiche in attesa"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__create_uid
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__create_uid
+msgid "Created by"
+msgstr "Creato da"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__create_date
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__create_date
+msgid "Created on"
+msgstr "Creato il"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Creation Month"
+msgstr "Mese creazione"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__db_datas
+msgid "Database Data"
+msgstr "Dati database"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__date_done
+msgid "Date Done"
+msgstr "Data completamento"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__description
+msgid "Description"
+msgstr "Descrizione"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__display_name
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__display_name
+msgid "Display Name"
+msgstr "Nome visualizzato"
+
+#. module: attachment_queue
+#: model:ir.model.fields.selection,name:attachment_queue.selection__attachment_queue__state__done
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Done"
+msgstr "Evasa"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
+msgid "Error"
+msgstr "Errore"
+
+#. module: attachment_queue
+#: model:ir.model.fields.selection,name:attachment_queue.selection__attachment_queue__state__failed
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Failed"
+msgstr "Fallito"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__failure_emails
+msgid "Failure Emails"
+msgstr "E-mail fallite"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__datas
+msgid "File Content (base64)"
+msgstr "Contenuto file (base64)"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__raw
+msgid "File Content (raw)"
+msgstr "Contenuto file (raw)"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__file_size
+msgid "File Size"
+msgstr "Dimensione file"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__file_type
+msgid "File Type"
+msgstr "Tipo file"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "File type"
+msgstr "Tipo file"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Filter on my documents"
+msgstr "Filtra sui miei documenti"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_follower_ids
+msgid "Followers"
+msgstr "Seguito da"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_partner_ids
+msgid "Followers (Partners)"
+msgstr "Seguito da (partner)"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__activity_type_icon
+msgid "Font awesome icon e.g. fa-tasks"
+msgstr "Icona Font Awesome es. fa-tasks"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Group By"
+msgstr "Raggruppa per"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__has_message
+msgid "Has Message"
+msgstr "Ha un messaggio"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__id
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__id
+msgid "ID"
+msgstr "ID"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_exception_icon
+msgid "Icon"
+msgstr "Icona"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__activity_exception_icon
+msgid "Icon to indicate an exception activity."
+msgstr "Icona per indicare un'attività eccezione."
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_needaction
+msgid "If checked, new messages require your attention."
+msgstr "Se selezionata, nuovi messaggi richiedono attenzione."
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_has_error
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_has_sms_error
+msgid "If checked, some messages have a delivery error."
+msgstr "Se selezionata, alcuni messaggi hanno un errore di consegna."
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__image_height
+msgid "Image Height"
+msgstr "Altezza immagine"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__image_src
+msgid "Image Src"
+msgstr "Sorgente immagine"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__image_width
+msgid "Image Width"
+msgstr "Larghezza immagine"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__index_content
+msgid "Indexed Content"
+msgstr "Contenuto indicizzato"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_is_follower
+msgid "Is Follower"
+msgstr "Segue"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__public
+msgid "Is public document"
+msgstr "È un documento pubblico"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue____last_update
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule____last_update
+msgid "Last Modified on"
+msgstr "Ultima modifica il"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__write_uid
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__write_uid
+msgid "Last Updated by"
+msgstr "Ultimo aggiornamento di"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__write_date
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__write_date
+msgid "Last Updated on"
+msgstr "Ultimo aggiornamento il"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__attachment_id
+msgid "Link to ir.attachment model "
+msgstr "Collegamento a l modelloir.attachment "
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_main_attachment_id
+msgid "Main Attachment"
+msgstr "Allegato principale"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
+msgid "Manual run"
+msgstr "Escuzione manuale"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_has_error
+msgid "Message Delivery error"
+msgstr "Errore di consegna messaggio"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_ids
+msgid "Messages"
+msgstr "Messaggi"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__mimetype
+msgid "Mime Type"
+msgstr "Tipo MIME"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__my_activity_date_deadline
+msgid "My Activity Deadline"
+msgstr "Scadenza mia attività"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "My Document(s)"
+msgstr "I miei documenti"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__name
+msgid "Name"
+msgstr "Nome"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_calendar_event_id
+msgid "Next Activity Calendar Event"
+msgstr "Evento calendario attività successiva"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_date_deadline
+msgid "Next Activity Deadline"
+msgstr "Scadenza prossima attività"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_summary
+msgid "Next Activity Summary"
+msgstr "Riepilogo prossima attività"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_type_id
+msgid "Next Activity Type"
+msgstr "Tipo prossima attività"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_needaction_counter
+msgid "Number of Actions"
+msgstr "Numero di azioni"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_has_error_counter
+msgid "Number of errors"
+msgstr "Numero di errori"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_needaction_counter
+msgid "Number of messages requiring action"
+msgstr "Numero di messaggi che richiedono un'azione"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr "Numero di messaggi con errore di consegna"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__original_id
+msgid "Original (unoptimized, unresized) attachment"
+msgstr "Allegato originale (non ottimizzato, non ridimensionato)"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Owner"
+msgstr "Proprietario"
+
+#. module: attachment_queue
+#: model:ir.model.fields.selection,name:attachment_queue.selection__attachment_queue__state__pending
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Pending"
+msgstr "In attesa"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment
+msgid "Requeue Attachments"
+msgstr "Riaccoda allegati"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment
+msgid "Reschedule"
+msgstr "Riprogrammare"
+
+#. module: attachment_queue
+#: model:ir.actions.act_window,name:attachment_queue.action_reschedule_attachment
+msgid "Reschedule Attachment"
+msgstr "Riprogramma allegato"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_field
+msgid "Resource Field"
+msgstr "Campo risorsa"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_id
+msgid "Resource ID"
+msgstr "ID risorsa"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_model
+msgid "Resource Model"
+msgstr "Modello risorsa"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_name
+msgid "Resource Name"
+msgstr "Nome risorsa"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__activity_user_id
+msgid "Responsible User"
+msgstr "Utente responsabile"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_has_sms_error
+msgid "SMS Delivery error"
+msgstr "Errore consegna SMS"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
+msgid "Set to Done"
+msgstr "Imposta a eseguito"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__smart_search
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__smart_search
+msgid "Smart Search"
+msgstr "Ricerca intelligente"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__state
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "State"
+msgstr "Stato"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__state_message
+msgid "State Message"
+msgstr "Messaggio stato"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__activity_state
+msgid ""
+"Status based on activities\n"
+"Overdue: Due date is already passed\n"
+"Today: Activity date is today\n"
+"Planned: Future activities."
+msgstr ""
+"Stato in base alle attività\n"
+"Scaduto: la data richiesta è trascorsa\n"
+"Oggi: la data attività è oggi\n"
+"Pianificato: attività future."
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__store_fname
+msgid "Stored Filename"
+msgstr "Nome file memorizzato"
+
+#. module: attachment_queue
+#: model:mail.template,subject:attachment_queue.attachment_failure_notification
+msgid "The attachment {{object.name}} has failed"
+msgstr "L'allegato {{object.name}} ha un errore"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__file_type
+msgid ""
+"The file type determines an import method to be used to parse and transform "
+"data before their import in ERP or an export"
+msgstr ""
+"Il tipo di file determina il metodo di importazione da utilizzare per "
+"elaborare e trasformare i dati prima dell'importazione nell'ERP o per "
+"l'esportazione"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__count_pending_changeset_changes
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue_reschedule__count_pending_changeset_changes
+msgid "The number of pending changes of this record"
+msgstr "Numero di modifiche di questo record in attesa"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__count_pending_changesets
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue_reschedule__count_pending_changesets
+msgid "The number of pending changesets of this record"
+msgstr "Numero di insiemi di modifiche in attesa di questo record"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__count_changesets
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue_reschedule__count_changesets
+msgid "The overall number of changesets of this record"
+msgstr "Numero totale di insiemi di modifiche di questo record"
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_reschedule_attachment
+msgid "The selected attachments will be rescheduled."
+msgstr "L'allegato selezionato verrà riprogrammato."
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__type
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "Type"
+msgstr "Tipo"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__activity_exception_decoration
+msgid "Type of the exception activity on record."
+msgstr "Tipo di attività eccezione sul record."
+
+#. module: attachment_queue
+#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
+msgid "URL"
+msgstr "URL"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__url
+msgid "Url"
+msgstr "URL"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__user_can_see_changeset
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue_reschedule__user_can_see_changeset
+msgid "User Can See Changeset"
+msgstr "L'utente può vedere l'insieme delle modifiche"
+
+#. module: attachment_queue
+#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__website_message_ids
+msgid "Website Messages"
+msgstr "Messaggi sito web"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__website_message_ids
+msgid "Website communication history"
+msgstr "Cronologia comunicazioni sito web"
+
+#. module: attachment_queue
+#: model:ir.model,name:attachment_queue.model_attachment_queue_reschedule
+msgid "Wizard to reschedule a selection of attachments"
+msgstr "Procedura guidata per riprogrammare una selezione di allegati"
+
+#. module: attachment_queue
+#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__type
+msgid ""
+"You can either upload a file from your computer or copy/paste an internet "
+"link to your file."
+msgstr ""
+"È possibile caricare un file dal computer oppure fare copia/incolla di un "
+"collegamento Internet al file."
+
+#. module: attachment_queue
+#. odoo-python
+#: code:addons/attachment_queue/tests/test_models.py:0
+#, python-format
+msgid "boom"
+msgstr "boom"
diff --git a/attachment_queue/models/__init__.py b/attachment_queue/models/__init__.py
new file mode 100644
index 00000000000..89333838a78
--- /dev/null
+++ b/attachment_queue/models/__init__.py
@@ -0,0 +1 @@
+from . import attachment_queue
diff --git a/attachment_queue/models/attachment_queue.py b/attachment_queue/models/attachment_queue.py
new file mode 100644
index 00000000000..6c7bf3494c9
--- /dev/null
+++ b/attachment_queue/models/attachment_queue.py
@@ -0,0 +1,182 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import logging
+
+import psycopg2
+from psycopg2 import OperationalError
+
+from odoo import api, fields, models
+from odoo.exceptions import UserError
+from odoo.service.model import PG_CONCURRENCY_ERRORS_TO_RETRY
+
+from odoo.addons.queue_job.exception import RetryableJobError
+
+_logger = logging.getLogger(__name__)
+
+DEFAULT_ETA_FOR_RETRY = 60 * 60
+STR_ERR_ATTACHMENT_RUNNING = "The attachment is currently being in processing"
+STR_ERROR_DURING_PROCESSING = "Error during processing of attachment_queue id {}: \n"
+
+
+class AttachmentQueue(models.Model):
+ _name = "attachment.queue"
+ _description = "Attachment Queue"
+ _inherits = {"ir.attachment": "attachment_id"}
+ _inherit = ["mail.thread", "mail.activity.mixin"]
+
+ attachment_id = fields.Many2one(
+ "ir.attachment",
+ required=True,
+ ondelete="cascade",
+ help="Link to ir.attachment model ",
+ )
+ file_type = fields.Selection(
+ selection=[],
+ index="btree",
+ help="The file type determines an import method to be used "
+ "to parse and transform data before their import in ERP or an export",
+ )
+ date_done = fields.Datetime()
+ state = fields.Selection(
+ [("pending", "Pending"), ("done", "Done"), ("failed", "Failed")],
+ readonly=False,
+ required=True,
+ default="pending",
+ index="btree",
+ )
+ state_message = fields.Text()
+ failure_emails = fields.Char(
+ compute="_compute_failure_emails",
+ help="Comma-separated list of email addresses to be notified in case offailure",
+ )
+
+ def _job_attrs(self):
+ # Override this method to have file type specific job attributes
+ self.ensure_one()
+ return {"channel": "root.attachment_queue"}
+
+ def _schedule_jobs(self):
+ for el in self:
+ kwargs = el._job_attrs()
+ el.with_delay(**kwargs).run_as_job()
+
+ @api.model_create_multi
+ def create(self, vals_list):
+ res = super().create(vals_list)
+ res._schedule_jobs()
+ return res
+
+ def button_reschedule(self):
+ self.write({"state": "pending", "state_message": ""})
+ self._schedule_jobs()
+
+ def _compute_failure_emails(self):
+ for attach in self:
+ attach.failure_emails = attach._get_failure_emails()
+
+ def _get_failure_emails(self):
+ # to be overriden in submodules implementing the file_type
+ self.ensure_one()
+ return ""
+
+ def button_manual_run(self):
+ """
+ Run the process for an individual attachment queue from a dedicated button
+ """
+ try:
+ self.env.cr.execute(
+ """
+ SELECT id
+ FROM attachment_queue
+ WHERE id = %s
+ FOR UPDATE NOWAIT
+ """,
+ (self.id,),
+ )
+ except psycopg2.OperationalError as exc:
+ raise UserError(self.env._(STR_ERR_ATTACHMENT_RUNNING)) from exc
+ if self.state != "done":
+ self.run()
+
+ def run_as_job(self):
+ """Run the process for an individual attachment queue from a async job"""
+ try:
+ self.env.cr.execute(
+ """
+ SELECT id
+ FROM attachment_queue
+ WHERE id = %s
+ FOR UPDATE NOWAIT
+ """,
+ (self.id,),
+ )
+ except psycopg2.OperationalError as exc:
+ raise RetryableJobError(
+ STR_ERR_ATTACHMENT_RUNNING,
+ seconds=DEFAULT_ETA_FOR_RETRY,
+ ignore_retry=True,
+ ) from exc
+ if self.state != "done":
+ try:
+ with self.env.cr.savepoint():
+ self.run()
+ except OperationalError as err:
+ # re-raise typical transaction serialization error so queue job retries
+ # no need to set attachment as failed since it will be retried.
+ if err.pgcode in PG_CONCURRENCY_ERRORS_TO_RETRY:
+ raise
+ self._set_attachment_failure(err)
+ except RetryableJobError as err:
+ # re-raise Retryable Error to keep the functionality
+ # we still set the attachment as failed here because it may not be
+ # retried (in case max_retries is reached). We would not want a
+ # pending attachment with no related pending job
+ self._set_attachment_failure(err)
+ # a rollback has been made before because of the savepoint.
+ # we need to commit because we re-raise the exception and a rollback
+ # will be performed
+ self.env.cr.commit() # pylint: disable=E8102
+ raise
+ except Exception as err:
+ self._set_attachment_failure(err)
+
+ def _set_attachment_failure(self, error):
+ _logger.warning(STR_ERROR_DURING_PROCESSING.format(self.id) + str(error))
+ self.write({"state": "failed", "state_message": str(error)})
+ emails = self.failure_emails
+ if emails:
+ self.env.ref("attachment_queue.attachment_failure_notification").send_mail(
+ self.id
+ )
+
+ def run(self):
+ """
+ Run the process for an individual attachment queue
+ """
+ self._run()
+ self.write(
+ {
+ "state": "done",
+ "date_done": fields.Datetime.now(),
+ }
+ )
+ return True
+
+ def _run(self):
+ self.ensure_one()
+ _logger.info("Starting processing of attachment queue id %d", self.id)
+
+ def set_done(self):
+ """
+ Manually set to done
+ """
+ message = self.env._(
+ "Manually set to done by %(name)s", name=self.env.user.name
+ )
+ self.write(
+ {
+ "state_message": message,
+ "state": "done",
+ "date_done": fields.Datetime.now(),
+ }
+ )
diff --git a/attachment_queue/pyproject.toml b/attachment_queue/pyproject.toml
new file mode 100644
index 00000000000..4231d0cccb3
--- /dev/null
+++ b/attachment_queue/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/attachment_queue/readme/CONTRIBUTORS.md b/attachment_queue/readme/CONTRIBUTORS.md
new file mode 100644
index 00000000000..61c32fc84ce
--- /dev/null
+++ b/attachment_queue/readme/CONTRIBUTORS.md
@@ -0,0 +1,5 @@
+- Valentin CHEMIERE \<\>
+- Florian da Costa \<\>
+- Angel Moya \<\>
+- Dan Kiplangat \<\>
+- Kevin Khao \<\>
diff --git a/attachment_queue/readme/DESCRIPTION.md b/attachment_queue/readme/DESCRIPTION.md
new file mode 100644
index 00000000000..77894375ff6
--- /dev/null
+++ b/attachment_queue/readme/DESCRIPTION.md
@@ -0,0 +1,7 @@
+This module adds async processing capabilities to attachments by
+implementing a new model attachment.queue that wraps attachments and
+stores additional information so that it can be processed in an
+asynchronous way.
+
+A use case of this module can be found in the attachment_synchronize
+module.
diff --git a/attachment_queue/readme/USAGE.md b/attachment_queue/readme/USAGE.md
new file mode 100644
index 00000000000..df2ec54aefd
--- /dev/null
+++ b/attachment_queue/readme/USAGE.md
@@ -0,0 +1,17 @@
+Go the menu Settings \> Technical \> Database Structure \> Attachments
+Queue
+
+You can create / see standard attachments with additional fields
+
+Configure the batch limit for attachments that can be sync by the cron
+task at a go:
+
+Settings \> Technical \> System parameters \>
+attachment_queue_cron_batch_limit
+
+
+
+This module can be used in combination with attachment_synchronize to
+control file processing workflow
+
+
diff --git a/attachment_queue/security/ir.model.access.csv b/attachment_queue/security/ir.model.access.csv
new file mode 100644
index 00000000000..d638d5e53f9
--- /dev/null
+++ b/attachment_queue/security/ir.model.access.csv
@@ -0,0 +1,4 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_attachment_queue_user,attachment.queue.user,model_attachment_queue,base.group_user,1,0,0,0
+access_attachment_queue_manager,attachment.queue.manager,model_attachment_queue,base.group_no_one,1,1,1,1
+access_attachment_reschedule_wizard,Attachment Queue Reschedule,attachment_queue.model_attachment_queue_reschedule,base.group_no_one,1,1,1,1
diff --git a/attachment_queue/static/description/form.png b/attachment_queue/static/description/form.png
new file mode 100644
index 00000000000..fbc9f6aa644
Binary files /dev/null and b/attachment_queue/static/description/form.png differ
diff --git a/attachment_queue/static/description/icon.png b/attachment_queue/static/description/icon.png
new file mode 100644
index 00000000000..3a0328b516c
Binary files /dev/null and b/attachment_queue/static/description/icon.png differ
diff --git a/attachment_queue/static/description/index.html b/attachment_queue/static/description/index.html
new file mode 100644
index 00000000000..974aa154150
--- /dev/null
+++ b/attachment_queue/static/description/index.html
@@ -0,0 +1,455 @@
+
+
+
+
+
+README.rst
+
+
+
+
+
+
+
+
+
+
+
Attachment Queue
+
+

+
This module adds async processing capabilities to attachments by
+implementing a new model attachment.queue that wraps attachments and
+stores additional information so that it can be processed in an
+asynchronous way.
+
A use case of this module can be found in the attachment_synchronize
+module.
+
Table of contents
+
+
+
+
Go the menu Settings > Technical > Database Structure > Attachments
+Queue
+
You can create / see standard attachments with additional fields
+
Configure the batch limit for attachments that can be sync by the cron
+task at a go:
+
Settings > Technical > System parameters >
+attachment_queue_cron_batch_limit
+

+
This module can be used in combination with attachment_synchronize to
+control file processing workflow
+

+
+
+
+
Bugs are tracked on GitHub 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.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+
+
+
+
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.
+
Current maintainers:
+

+
This module is part of the OCA/server-tools project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
+
+
diff --git a/attachment_queue/static/description/tree.png b/attachment_queue/static/description/tree.png
new file mode 100644
index 00000000000..d4dcc92fe7f
Binary files /dev/null and b/attachment_queue/static/description/tree.png differ
diff --git a/attachment_queue/tests/__init__.py b/attachment_queue/tests/__init__.py
new file mode 100644
index 00000000000..7f25150f672
--- /dev/null
+++ b/attachment_queue/tests/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import test_attachment_queue
diff --git a/attachment_queue/tests/test_attachment_queue.py b/attachment_queue/tests/test_attachment_queue.py
new file mode 100644
index 00000000000..19350f543ac
--- /dev/null
+++ b/attachment_queue/tests/test_attachment_queue.py
@@ -0,0 +1,154 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from unittest import mock
+
+from odoo.exceptions import UserError
+from odoo.modules.registry import Registry
+from odoo.orm.model_classes import add_to_registry
+from odoo.tools import mute_logger
+
+from odoo.addons.base.tests.common import BaseCommon
+from odoo.addons.queue_job.exception import RetryableJobError
+from odoo.addons.queue_job.tests.common import trap_jobs
+
+DUMMY_AQ_VALS = {
+ "datas": "",
+ "name": "dummy_aq.doc",
+}
+MOCK_PATH_RUN = (
+ "odoo.addons.attachment_queue.models.attachment_queue.AttachmentQueue._run"
+)
+
+
+class TestAttachmentBaseQueue(BaseCommon):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ # Odoo 19 native test-model registration. Replaces the
+ # odoo-test-helper FakeModelLoader pattern, which broke on 19
+ # (MetaModel.module_to_models was renamed/privatized). Class-scope
+ # is required: add_to_registry mutates the shared Registry singleton.
+ from .test_models import AttachmentQueue as FakeAttachmentQueue
+
+ add_to_registry(cls.registry, FakeAttachmentQueue)
+ cls.registry._setup_models__(cls.env.cr, ["attachment.queue"])
+ cls.registry.init_models(
+ cls.env.cr, ["attachment.queue"], {"models_to_check": True}
+ )
+ cls.addClassCleanup(cls.registry.__delitem__, "attachment.queue")
+ cls.aq_model = cls.env["attachment.queue"]
+
+ def _create_dummy_attachment(self, override=False, no_job=False):
+ override = override or {}
+ vals = DUMMY_AQ_VALS.copy()
+ vals.update(override)
+ if no_job:
+ return (
+ self.env["attachment.queue"].with_context(queue_job__no_delay=True)
+ ).create(vals)
+ return self.env["attachment.queue"].create(vals)
+
+ def test_job_created(self):
+ with trap_jobs() as trap:
+ attachment = self._create_dummy_attachment()
+ trap.assert_enqueued_job(
+ attachment.run_as_job,
+ )
+
+ def test_aq_locked_job(self):
+ """
+ If an attachment is already running, and a job tries to run it,
+ retry later
+ """
+ attachment = self.env.ref("attachment_queue.dummy_attachment_queue")
+ with Registry(self.env.cr.dbname).cursor() as new_cr:
+ new_cr.execute(
+ """
+ SELECT id
+ FROM attachment_queue
+ WHERE id = %s
+ FOR UPDATE NOWAIT
+ """,
+ (attachment.id,),
+ )
+ with self.assertRaises(RetryableJobError), mute_logger("odoo.sql_db"):
+ attachment.run_as_job()
+
+ def test_aq_locked_button(self):
+ """If an attachment is already running, and a user tries to run it manually,
+ raise error window"""
+ attachment = self.env.ref("attachment_queue.dummy_attachment_queue")
+ with Registry(self.env.cr.dbname).cursor() as new_cr:
+ new_cr.execute(
+ """
+ SELECT id
+ FROM attachment_queue
+ WHERE id = %s
+ FOR UPDATE NOWAIT
+ """,
+ (attachment.id,),
+ )
+ with self.assertRaises(UserError), mute_logger("odoo.sql_db"):
+ attachment.button_manual_run()
+
+ def test_run_ok(self):
+ """Attachment queue should have correct state and result"""
+ partners_initial = len(self.env["res.partner"].search([]))
+ with mock.patch.object(
+ type(self.aq_model),
+ "_run",
+ self.env["attachment.queue"].mock_run_create_partners,
+ ):
+ attachment = self._create_dummy_attachment(no_job=True)
+ partners_after = len(self.env["res.partner"].search([]))
+ self.assertEqual(partners_after, partners_initial + 10)
+ self.assertEqual(attachment.state, "done")
+
+ def test_run_fails(self):
+ """Attachment queue should have correct state/error message"""
+ with (
+ mock.patch.object(
+ type(self.aq_model), "_run", self.env["attachment.queue"].mock_run_fail
+ ),
+ mute_logger("odoo.addons.attachment_queue.models.attachment_queue"),
+ ):
+ attachment = self._create_dummy_attachment(no_job=True)
+ self.assertEqual(attachment.state, "failed")
+ self.assertEqual(attachment.state_message, "boom")
+
+ def test_run_fails_rollback(self):
+ """In case of failure, no side effects should occur"""
+ partners_initial = len(self.env["res.partner"].search([]))
+ with (
+ mock.patch.object(
+ type(self.aq_model),
+ "_run",
+ self.env["attachment.queue"].mock_run_create_partners_and_fail,
+ ),
+ mute_logger("odoo.addons.attachment_queue.models.attachment_queue"),
+ ):
+ self._create_dummy_attachment(no_job=True)
+ partners_after = len(self.env["res.partner"].search([]))
+ self.assertEqual(partners_after, partners_initial)
+ failure_email = self.env["mail.mail"].search(
+ [("subject", "ilike", "dummy_aq.doc")]
+ )
+ self.assertEqual(failure_email.email_to, "test@test.com")
+
+ def test_set_done(self):
+ """Test set_done manually"""
+ attachment = self._create_dummy_attachment()
+ self.assertEqual(attachment.state, "pending")
+ attachment.set_done()
+ self.assertEqual(attachment.state, "done")
+
+ def test_reschedule_wizard(self):
+ attachment = self.env.ref("attachment_queue.dummy_attachment_queue")
+ attachment.write({"state": "failed"})
+ wizard = (
+ self.env["attachment.queue.reschedule"]
+ .with_context(active_model="attachment.queue", active_ids=attachment.ids)
+ .create({})
+ )
+ wizard.reschedule()
+ self.assertEqual(attachment.state, "pending")
diff --git a/attachment_queue/tests/test_models.py b/attachment_queue/tests/test_models.py
new file mode 100644
index 00000000000..0d9b8e72d28
--- /dev/null
+++ b/attachment_queue/tests/test_models.py
@@ -0,0 +1,23 @@
+# Copyright 2023 Akretion
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+from odoo import models
+from odoo.exceptions import UserError
+
+
+class AttachmentQueue(models.Model):
+ _inherit = "attachment.queue"
+ _name = "attachment.queue"
+
+ def mock_run_fail(self):
+ raise UserError(self.env._("boom"))
+
+ def mock_run_create_partners(self):
+ for x in range(10):
+ self.env["res.partner"].create({"name": str(x)})
+
+ def mock_run_create_partners_and_fail(self):
+ self.mock_run_create_partners()
+ raise UserError(self.env._("boom"))
+
+ def _get_failure_emails(self):
+ return "test@test.com"
diff --git a/attachment_queue/views/attachment_queue_view.xml b/attachment_queue/views/attachment_queue_view.xml
new file mode 100644
index 00000000000..eee5ad077af
--- /dev/null
+++ b/attachment_queue/views/attachment_queue_view.xml
@@ -0,0 +1,171 @@
+
+
+
+ attachment.queue
+
+ primary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ attachment.queue
+
+
+
+
+
+
+
+
+
+
+
+
+ attachment.queue
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Attachments Queue
+ ir.actions.act_window
+ attachment.queue
+ attachment-queue
+ list,form
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+ form
+
+
+
+
+
+
diff --git a/attachment_queue/wizards/__init__.py b/attachment_queue/wizards/__init__.py
new file mode 100644
index 00000000000..72fc1ea9a2d
--- /dev/null
+++ b/attachment_queue/wizards/__init__.py
@@ -0,0 +1 @@
+from . import attachement_queue_reschedule
diff --git a/attachment_queue/wizards/attachement_queue_reschedule.py b/attachment_queue/wizards/attachement_queue_reschedule.py
new file mode 100644
index 00000000000..dc2cb5b6d8d
--- /dev/null
+++ b/attachment_queue/wizards/attachement_queue_reschedule.py
@@ -0,0 +1,29 @@
+# Copyright 2013-2020 Camptocamp SA
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
+
+from odoo import fields, models
+
+
+class AttachmentQueueReschedule(models.TransientModel):
+ _name = "attachment.queue.reschedule"
+ _description = "Wizard to reschedule a selection of attachments"
+
+ def _default_attachment_ids(self):
+ res = False
+ context = self.env.context
+ if context.get("active_model") == "attachment.queue" and context.get(
+ "active_ids"
+ ):
+ res = context["active_ids"]
+ return res
+
+ attachment_ids = fields.Many2many(
+ comodel_name="attachment.queue",
+ string="Attachments",
+ default=lambda r: r._default_attachment_ids(),
+ )
+
+ def reschedule(self):
+ attachments = self.attachment_ids
+ attachments.button_reschedule()
+ return {"type": "ir.actions.act_window_close"}
diff --git a/attachment_queue/wizards/attachement_queue_reschedule.xml b/attachment_queue/wizards/attachement_queue_reschedule.xml
new file mode 100644
index 00000000000..3af076e8b58
--- /dev/null
+++ b/attachment_queue/wizards/attachement_queue_reschedule.xml
@@ -0,0 +1,32 @@
+
+
+
+ Reschedule Attachments
+ attachment.queue.reschedule
+
+
+
+
+
+
+ Reschedule Attachment
+ attachment.queue.reschedule
+ form
+
+ new
+
+
+