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 + +![tree view](../static/description/tree.png) + +This module can be used in combination with attachment_synchronize to +control file processing workflow + +![form view](../static/description/form.png) 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 + + + +
+ + + +Odoo Community Association + +
+

Attachment Queue

+ +

Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

+

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

+ +
+

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

+
+
+

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

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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:

+

florian-dacosta 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/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 + + +