diff --git a/README.md b/README.md index e4892df7417..2547e9864a9 100644 --- a/README.md +++ b/README.md @@ -21,10 +21,11 @@ Available addons ---------------- addon | version | maintainers | summary --- | --- | --- | --- +[attachment_delete_restrict](attachment_delete_restrict/) | 18.0.1.0.0 | yostashiro Kev-Roche | Restrict Deletion of Attachments [attachment_queue](attachment_queue/) | 18.0.1.0.0 | florian-dacosta sebastienbeau | Base module adding the concept of queue for processing files [attachment_synchronize](attachment_synchronize/) | 18.0.1.0.0 | florian-dacosta sebastienbeau GSLabIt bealdav | Attachment Synchronize [attachment_unindex_content](attachment_unindex_content/) | 18.0.1.0.0 | moylop260 ebirbe luisg123v | Disable indexing of attachments -[auditlog](auditlog/) | 18.0.2.0.5 | | Audit Log +[auditlog](auditlog/) | 18.0.2.0.6 | | Audit Log [auto_backup](auto_backup/) | 18.0.1.0.1 | | Backups database [autovacuum_message_attachment](autovacuum_message_attachment/) | 18.0.1.0.1 | florian-dacosta | Automatically delete old mail messages and attachments [base_cron_exclusion](base_cron_exclusion/) | 18.0.1.0.1 | LoisRForgeFlow ChrisOForgeFlow | Allow you to select scheduled actions that should not run simultaneously. @@ -49,7 +50,7 @@ addon | version | maintainers | summary [database_size](database_size/) | 18.0.1.0.2 | | Database Size [dbfilter_from_header](dbfilter_from_header/) | 18.0.1.0.0 | | Filter databases with HTTP headers [excel_import_export](excel_import_export/) | 18.0.1.0.0 | kittiu | Base module for developing Excel import/export/report -[fetchmail_attach_from_folder](fetchmail_attach_from_folder/) | 18.0.1.0.0 | NL66278 | Attach mails in an IMAP folder to existing objects +[fetchmail_attach_from_folder](fetchmail_attach_from_folder/) | 18.0.1.1.0 | NL66278 | Attach mails in an IMAP folder to existing objects [fetchmail_notify_error_to_sender](fetchmail_notify_error_to_sender/) | 18.0.1.0.0 | | If fetching mails gives error, send an email to sender [html_text](html_text/) | 18.0.1.0.0 | | Generate excerpts from any HTML field [iap_alternative_provider](iap_alternative_provider/) | 18.0.1.0.0 | sebastienbeau | Base module for providing alternative provider for iap apps @@ -58,10 +59,12 @@ addon | version | maintainers | summary [module_analysis](module_analysis/) | 18.0.1.0.0 | legalsylvain | Add analysis tools regarding installed modules to know which installed modules comes from Odoo Core, OCA, or are custom modules [module_auto_update](module_auto_update/) | 18.0.1.0.0 | | Automatically update Odoo modules [module_change_auto_install](module_change_auto_install/) | 18.0.1.0.3 | legalsylvain | Customize auto installables modules by configuration +[odoo_test_xmlrunner](odoo_test_xmlrunner/) | 18.0.1.0.0 | | This module override Odoo testing method to run them with xmlrunner tool. [onchange_helper](onchange_helper/) | 18.0.1.0.1 | | Technical module that ease execution of onchange in Python code [rpc_helper](rpc_helper/) | 18.0.1.0.1 | simahawk | Helpers for disabling RPC calls [scheduler_error_mailer](scheduler_error_mailer/) | 18.0.1.0.0 | | Scheduler Error Mailer [sentry](sentry/) | 18.0.1.0.3 | barsi naglis versada moylop260 fernandahf | Report Odoo errors to Sentry +[sequence_python](sequence_python/) | 18.0.1.0.0 | | Calculate a sequence number from a Python expression [session_db](session_db/) | 18.0.1.0.1 | sbidoul | Store sessions in DB [test_auditlog](test_auditlog/) | 18.0.1.0.3 | | Additional unit tests for Audit Log based on accounting models [test_base_time_window](test_base_time_window/) | 18.0.1.0.0 | | Test Base model to handle time windows diff --git a/attachment_delete_restrict/README.rst b/attachment_delete_restrict/README.rst new file mode 100644 index 00000000000..19de923ebf3 --- /dev/null +++ b/attachment_delete_restrict/README.rst @@ -0,0 +1,130 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +================================ +Restrict Deletion of Attachments +================================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:a4e29150a223680c72cff93c087f590c9262df96019691a8f3ee6e92b34c2fdd + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/18.0/attachment_delete_restrict + :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-18-0/server-tools-18-0-attachment_delete_restrict + :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=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module provides the ability to restrict the deletion of the +attachments at different levels. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Select level: +------------- + +1. Go to *Settings > General Settings> Permission section*. +2. Choose the level of *Restrict Delete Attachment* for all models by + default or for models with "default" restriction level. + +Five levels: +------------ + +- Default : Use global configuration +- Owner : Owner and admins only +- Custom : Certain groups or users per related model. +- Owner + Custom : Owner, admins and Certain groups or users per related + model. +- None : all users can delete them + +Only Custom and Owner + Custom need specific configuration on models. + +For Custom and Owner + Custom levels: +------------------------------------- + +1. Go to *Settings > Technical > Database Structure > Models*. +2. Open a model for which attachment deletion should be restricted. +3. Select 'Restrict Attachment Deletion', and assign 'Attachment + Deletion Groups' and/or 'Attachment Deletion Users' as necessary (if + no assignment, no one can delete the attachments of this model). + +For assigning 'Attachment Deletion Groups'/'Attachment Deletion Users' +to the model, you can alternatively add the model in the 'Attachment +Deletion Models' tab in the respective group/user form. + +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 +------- + +* Quartile +* Akretion + +Contributors +------------ + +- Yoshi Tashiro +- Kévin Roche +- Sébastien BEAU + +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-yostashiro| image:: https://github.com/yostashiro.png?size=40px + :target: https://github.com/yostashiro + :alt: yostashiro +.. |maintainer-Kev-Roche| image:: https://github.com/Kev-Roche.png?size=40px + :target: https://github.com/Kev-Roche + :alt: Kev-Roche + +Current `maintainers `__: + +|maintainer-yostashiro| |maintainer-Kev-Roche| + +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_delete_restrict/__init__.py b/attachment_delete_restrict/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/attachment_delete_restrict/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/attachment_delete_restrict/__manifest__.py b/attachment_delete_restrict/__manifest__.py new file mode 100644 index 00000000000..b72d354bd50 --- /dev/null +++ b/attachment_delete_restrict/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright 2021 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Restrict Deletion of Attachments", + "version": "18.0.1.0.0", + "depends": [ + "base", + "base_setup", + ], + "website": "https://github.com/OCA/server-tools", + "author": "Quartile, Akretion, Odoo Community Association (OCA)", + "category": "Tools", + "license": "AGPL-3", + "maintainers": ["yostashiro", "Kev-Roche"], + "data": [ + "views/ir_model_views.xml", + "views/res_groups_views.xml", + "views/res_users_views.xml", + "views/res_config_setting_views.xml", + ], + "installable": True, +} diff --git a/attachment_delete_restrict/i18n/attachment_delete_restrict.pot b/attachment_delete_restrict/i18n/attachment_delete_restrict.pot new file mode 100644 index 00000000000..a2a7c32e442 --- /dev/null +++ b/attachment_delete_restrict/i18n/attachment_delete_restrict.pot @@ -0,0 +1,200 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * attachment_delete_restrict +# +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_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Authorized Groups:" +msgstr "" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Authorized Users:" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_ir_attachment +msgid "Attachment" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__delete_attachment_group_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_group_ids +msgid "Attachment Deletion Groups" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__delete_attachment_model_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__delete_attachment_model_ids +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.view_groups_form +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.view_users_form +msgid "Attachment Deletion Models" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__delete_attachment_user_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_user_ids +msgid "Attachment Deletion Users" +msgstr "" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Authorized Groups and Users" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__custom +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__custom +msgid "Custom: For each model, selected groups and users can delete them" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_restrict_delete_attachment +msgid "Define a default value for Attachments Deletion" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_ir_model +msgid "Models" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__none +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__none +msgid "No restriction: All users / groups can delete them" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__owner_custom +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__owner_custom +msgid "" +"Owner + Custom: Creator and admin can delete them + for each model, selected" +" groups and users can delete them" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__owner +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__owner +msgid "Owner: Only creator and admin can delete them" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__restrict_delete_attachment +msgid "Restrict Attachment Deletion" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_restrict_delete_attachment +msgid "Restrict Delete Attachments" +msgstr "" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Restrict Deletion on Attachments" +msgstr "" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Restrict Deletion on attachment" +msgstr "" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Select default level of delete restriction on attachments" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__smart_search +msgid "Smart Search" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_users__delete_attachment_model_ids +msgid "" +"The user can delete the attachments related to the models assigned here. " +"Restrict Attachment Deletion must be'Custom' or 'Owner + Custom' for the " +"model to be selected here." +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_group_ids +msgid "The users in the groups selected here can delete all the attachments." +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__delete_attachment_group_ids +msgid "" +"The users in the groups selected here can delete the attachments related to " +"this model." +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_groups__delete_attachment_model_ids +msgid "" +"The users of the group can delete the attachments related to the models " +"assigned here. Restrict Attachment Deletion must be'Custom' or 'Owner + " +"Custom' for the model to be selected here." +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_user_ids +msgid "The users selected here can delete all the attachments" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__delete_attachment_user_ids +msgid "" +"The users selected here can delete the attachments related to this model." +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__default +msgid "Use global configuration" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_users +msgid "User" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__restrict_delete_attachment +msgid "" +"When selected, the deletion of the attachments related to this model is " +"restricted to certain users." +msgstr "" + +#. module: attachment_delete_restrict +#. odoo-python +#: code:addons/attachment_delete_restrict/models/ir_attachment.py:0 +msgid "" +"You are not allowed to delete this attachment.\n" +"\n" +"Users with the delete permission:\n" +"%s" +msgstr "" diff --git a/attachment_delete_restrict/i18n/es_AR.po b/attachment_delete_restrict/i18n/es_AR.po new file mode 100644 index 00000000000..350126ff174 --- /dev/null +++ b/attachment_delete_restrict/i18n/es_AR.po @@ -0,0 +1,290 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * attachment_delete_restrict +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-09-04 06:07+0000\n" +"Last-Translator: Ignacio Buioli \n" +"Language-Team: none\n" +"Language: es_AR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_groups +msgid "Access Groups" +msgstr "Grupos de Acceso" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_ir_attachment +msgid "Attachment" +msgstr "Adjunto" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__delete_attachment_group_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_group_ids +msgid "Attachment Deletion Groups" +msgstr "Grupos de Eliminación de Adjuntos" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__delete_attachment_model_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__delete_attachment_model_ids +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.view_groups_form +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.view_users_form +msgid "Attachment Deletion Models" +msgstr "Modelo de Eliminación de Adjuntos" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__delete_attachment_user_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_user_ids +msgid "Attachment Deletion Users" +msgstr "Usuarios de Eliminación de Adjuntos" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Authorized Groups:" +msgstr "Grupos Autorizados:" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Authorized Users:" +msgstr "Usuarios Autorizados:" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__changeset_change_ids +msgid "Changeset Changes" +msgstr "Cambios del Conjunto de Cambios" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__changeset_ids +msgid "Changesets" +msgstr "Conjunto de Cambios" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_config_settings +msgid "Config Settings" +msgstr "Ajustes Configuración" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__count_pending_changeset_changes +msgid "Count Pending Changeset Changes" +msgstr "Cuenta de los Cambios Pendientes de los Conjuntos de Cambios" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__count_pending_changesets +msgid "Count Pending Changesets" +msgstr "Cuenta de los Conjuntos de Cambios Pendientes" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__custom +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__custom +msgid "Custom: For each model, selected groups and users can delete them" +msgstr "" +"Personalizado: Para cada modelo, los grupos y usuarios seleccionados pueden " +"eliminarlos" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_restrict_delete_attachment +msgid "Define a default value for Attachments Deletion" +msgstr "Define un valor preterminado para la Eliminación de Adjuntos" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__display_name +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__display_name +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__display_name +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__display_name +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__id +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__id +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__id +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__id +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__id +msgid "ID" +msgstr "ID" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment____last_update +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model____last_update +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings____last_update +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups____last_update +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users____last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_ir_model +msgid "Models" +msgstr "Modelos" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__none +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__none +msgid "No restriction: All users / groups can delete them" +msgstr "No hay resitricción: Todos los usuarios / grupos pueden eliminarlos" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__owner_custom +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__owner_custom +msgid "" +"Owner + Custom: Creator and admin can delete them + for each model, selected" +" groups and users can delete them" +msgstr "" +"Propietario + Personalizado: El creador y administrador puede eliminarlos + " +"para cada modelo, los grupos y usuarios seleccionados pueden eliminarlos" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__owner +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__owner +msgid "Owner: Only creator and admin can delete them" +msgstr "Propietario: Solo el creador y el administrador puede eliminarlos" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__restrict_delete_attachment +msgid "Restrict Attachment Deletion" +msgstr "Restringir Eliminación de Adjuntos" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_restrict_delete_attachment +msgid "Restrict Delete Attachments" +msgstr "Restringir Eliminar Adjuntos" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Restrict Deletion on attachment" +msgstr "Restringir la Eliminación en adjunto" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Select default level of delete restriction on attachments" +msgstr "" +"Seleccione el nivel predeterminado de restricción de eliminación de archivos " +"adjuntos" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__smart_search +msgid "Smart Search" +msgstr "Búsqueda Inteligente" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_users__delete_attachment_model_ids +msgid "" +"The user can delete the attachments related to the models assigned here. In " +"general settings, 'Restrict Delete Attachment' must be set as 'custom' to " +"activate this setting." +msgstr "" +"El usuario puede eliminar los archivos adjuntos relacionados con los modelos " +"asignados aquí. En la configuración general, 'Restringir eliminar adjunto' " +"debe configurarse como 'Personalizado' para activar esta configuración." + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_group_ids +msgid "The users in the groups selected here can delete all the attachments." +msgstr "" +"Los usuarios en los grupos seleccionados acá pueden eliminar todos los " +"adjuntos." + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__delete_attachment_group_ids +msgid "" +"The users in the groups selected here can delete the attachments related to " +"this model." +msgstr "" +"Los usuarios en los grupos seleccionados acá pueden eliminar los adjuntos " +"relacionados a este modelo." + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_groups__delete_attachment_model_ids +msgid "" +"The users of the group can delete the attachments related to the models " +"assigned here. In general settings, 'Restrict Delete Attachment' must be set" +" as 'custom' to activate this setting." +msgstr "" +"Los usuarios del grupo pueden eliminar los archivos adjuntos relacionados " +"con los modelos asignados acá. En la configuración general, 'Restringir " +"eliminar adjuntos' debe configurarse como 'Personalizado' para activar esta " +"configuración." + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_user_ids +msgid "The users selected here can delete all the attachments" +msgstr "Los usuarios seleccionados acá pueden eliminar todos los adjuntos" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__delete_attachment_user_ids +msgid "" +"The users selected here can delete the attachments related to this model." +msgstr "" +"Los usuarios seleccionados acá pueden eliminar los adjuntos relacionados a " +"este modelo." + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__default +msgid "Use global configuration" +msgstr "Usar configuración global" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__user_can_see_changeset +msgid "User Can See Changeset" +msgstr "El Usuario Puede ver Conjuntos de Cambios" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_users +msgid "Users" +msgstr "Usuarios" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__restrict_delete_attachment +msgid "" +"When selected, the deletion of the attachments related to this model is " +"restricted to certain users." +msgstr "" +"Cuando se selecciona, la eliminación de los archivos adjuntos relacionados " +"con este modelo está restringida a ciertos usuarios." + +#. module: attachment_delete_restrict +#: code:addons/attachment_delete_restrict/models/ir_attachment.py:0 +#, python-format +msgid "" +"You are not allowed to delete this attachment.\n" +"\n" +"Users with the delete permission:\n" +"%s" +msgstr "" +"No tiene permitido eliminar este archivo adjunto\n" +"\n" +"Usuarios con permisos de eliminación:\n" +"%s" diff --git a/attachment_delete_restrict/i18n/fr.po b/attachment_delete_restrict/i18n/fr.po new file mode 100644 index 00000000000..ccaf58a6442 --- /dev/null +++ b/attachment_delete_restrict/i18n/fr.po @@ -0,0 +1,287 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * attachment_delete_restrict +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-07-11 14:14+0000\n" +"PO-Revision-Date: 2022-07-11 16:16+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: Poedit 3.1.1\n" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_groups +msgid "Access Groups" +msgstr "Groupes d'accès" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_ir_attachment +msgid "Attachment" +msgstr "Pièce jointe" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__delete_attachment_group_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_group_ids +msgid "Attachment Deletion Groups" +msgstr "Groupe avec droit de suppression de PJ" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__delete_attachment_model_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__delete_attachment_model_ids +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.view_groups_form +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.view_users_form +msgid "Attachment Deletion Models" +msgstr "Modèle avec restrictions de suppression de PJ" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__delete_attachment_user_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_user_ids +msgid "Attachment Deletion Users" +msgstr "Utilisateurs avec droit de suppression de PJ" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Authorized Groups:" +msgstr "Groupes autorisés:" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Authorized Users:" +msgstr "Utilisateurs autorisés:" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__changeset_change_ids +msgid "Changeset Changes" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__changeset_ids +msgid "Changesets" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_config_settings +msgid "Config Settings" +msgstr "Paramètres de config" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__count_pending_changeset_changes +msgid "Count Pending Changeset Changes" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__count_pending_changesets +msgid "Count Pending Changesets" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__custom +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__custom +msgid "Custom: For each model, selected groups and users can delete them" +msgstr "" +"Personnalisé: Pour chaque modèle, sélectionner les groupes et/ou " +"utilisateurs ayant le droit" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_restrict_delete_attachment +msgid "Define a default value for Attachments Deletion" +msgstr "Définir une valeur par défaut pour la suppression des pièces jointes" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__display_name +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__display_name +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__display_name +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__display_name +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__id +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__id +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__id +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__id +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__id +msgid "ID" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment____last_update +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model____last_update +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings____last_update +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups____last_update +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users____last_update +msgid "Last Modified on" +msgstr "Dernière modification le" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_ir_model +msgid "Models" +msgstr "Modèles" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__none +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__none +msgid "No restriction: All users / groups can delete them" +msgstr "Aucune restrictions: Tous les utilisateurs / groupes peuvent supprimer" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__owner_custom +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__owner_custom +msgid "" +"Owner + Custom: Creator and admin can delete them + for each model, selected " +"groups and users can delete them" +msgstr "" +"Propriétaire + Personnalisé : Le créateur et l'administrateur peuvent les " +"supprimer + pour chaque modèle, les groupes et utilisateurs sélectionnés " +"peuvent les supprimer" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__owner +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__owner +msgid "Owner: Only creator and admin can delete them" +msgstr "" +"Propriétaire : Seuls le créateur et l'administrateur peuvent les supprimer" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__restrict_delete_attachment +msgid "Restrict Attachment Deletion" +msgstr "Suppression de PJs Limitée" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_restrict_delete_attachment +msgid "Restrict Delete Attachments" +msgstr "Suppression de PJs Limitée" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Restrict Deletion on attachment" +msgstr "Restreindre la suppression de PJs" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Select default level of delete restriction on attachments" +msgstr "Sélectionner le niveau de restriction sur les pièces jointes" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__smart_search +msgid "Smart Search" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_users__delete_attachment_model_ids +msgid "" +"The user can delete the attachments related to the models assigned here. In " +"general settings, 'Restrict Delete Attachment' must be set as 'custom' to " +"activate this setting." +msgstr "" +"L'utilisateur peut supprimer les pièces jointes reliées au modèle assigné " +"ici. Dans la configuration générale, \"Restreindre la suppression de PJs\" " +"doit être à \"Personnalisé\" pour que cela s'active." + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_group_ids +msgid "The users in the groups selected here can delete all the attachments." +msgstr "" +"Les utilisateurs de ce groupe peuvent supprimer toutes les pièces jointes." + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__delete_attachment_group_ids +msgid "" +"The users in the groups selected here can delete the attachments related to " +"this model." +msgstr "" +"Les utilisateurs de ces groupes peuvent supprimer les pièces jointes de ce " +"modèle." + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_groups__delete_attachment_model_ids +msgid "" +"The users of the group can delete the attachments related to the models " +"assigned here. In general settings, 'Restrict Delete Attachment' must be set " +"as 'custom' to activate this setting." +msgstr "" +"Les utilisateurs de ce groupe peuvent supprimer les pièces jointes reliées " +"au modèle assigné ici. Dans la configuration générale, \"Restreindre la " +"suppression de PJs\" doit être à \"Personnalisé\" pour que cela s'active." + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_user_ids +msgid "The users selected here can delete all the attachments" +msgstr "Ces utilisateurs peuvent supprimer toutes les pièces jointes" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__delete_attachment_user_ids +msgid "" +"The users selected here can delete the attachments related to this model." +msgstr "Ces utilisateurs peuvent supprimer les pièces jointes de ce modèle." + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__default +msgid "Use global configuration" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__user_can_see_changeset +msgid "User Can See Changeset" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_users +msgid "Users" +msgstr "Utilisateurs" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__restrict_delete_attachment +msgid "" +"When selected, the deletion of the attachments related to this model is " +"restricted to certain users." +msgstr "" +"Une fois sélectionné, la suppression de pièces jointes de ce modèle est " +"restreinte à certains utilisateurs." + +#. module: attachment_delete_restrict +#: code:addons/attachment_delete_restrict/models/ir_attachment.py:0 +#, python-format +msgid "" +"You are not allowed to delete this attachment.\n" +"\n" +"Users with the delete permission:\n" +"%s" +msgstr "" +"Vous n'êtes pas autorisé à supprimer cette pièce jointe.\n" +"\n" +"Utilisateurs ayant la permission:\n" +"%s" diff --git a/attachment_delete_restrict/i18n/it.po b/attachment_delete_restrict/i18n/it.po new file mode 100644 index 00000000000..ebe248e04b4 --- /dev/null +++ b/attachment_delete_restrict/i18n/it.po @@ -0,0 +1,299 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * attachment_delete_restrict +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-06-04 16:26+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.10.4\n" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_groups +msgid "Access Groups" +msgstr "Gruppi di accesso" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_ir_attachment +msgid "Attachment" +msgstr "Allegato" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__delete_attachment_group_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_group_ids +msgid "Attachment Deletion Groups" +msgstr "Gruppi cancellazione allegato" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__delete_attachment_model_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__delete_attachment_model_ids +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.view_groups_form +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.view_users_form +msgid "Attachment Deletion Models" +msgstr "Modelli cancellazione allegato" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__delete_attachment_user_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_user_ids +msgid "Attachment Deletion Users" +msgstr "Utenti cancellazione allegato" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Authorized Groups:" +msgstr "Gruppi autorizzati:" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Authorized Users:" +msgstr "Utenti autorizzati:" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__changeset_change_ids +msgid "Changeset Changes" +msgstr "Modifiche dell'insieme di modifiche" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__changeset_ids +msgid "Changesets" +msgstr "Insiemi di modifiche" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni configurazione" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__count_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__count_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__count_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__count_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__count_changesets +msgid "Count Changesets" +msgstr "Conteggio insieme di modifiche" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__count_pending_changeset_changes +msgid "Count Pending Changeset Changes" +msgstr "Conteggio modifiche dell'insieme di modifiche in attesa" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__count_pending_changesets +msgid "Count Pending Changesets" +msgstr "Conteggio insieme di modifiche in attesa" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__custom +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__custom +msgid "Custom: For each model, selected groups and users can delete them" +msgstr "" +"Personalizzato: per ogni modello, gruppi e utenti selezionati lo possono " +"cancellare" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_restrict_delete_attachment +msgid "Define a default value for Attachments Deletion" +msgstr "Definire un valore predefinito per la cancellazione allegati" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_ir_model +msgid "Models" +msgstr "Modelli" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__none +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__none +msgid "No restriction: All users / groups can delete them" +msgstr "Nessuna restrizione: tutti gli utenti / gruppi li possono cancellare" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__owner_custom +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__owner_custom +msgid "" +"Owner + Custom: Creator and admin can delete them + for each model, selected" +" groups and users can delete them" +msgstr "" +"Proprietario + personalizzato: il creatore e l'amministratore li possono " +"cancellare + per ogni modello, gruppi e utenti selezionati" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__owner +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__owner +msgid "Owner: Only creator and admin can delete them" +msgstr "Proprietario: solo il creatore e l'amministratore li possono cancellare" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__restrict_delete_attachment +msgid "Restrict Attachment Deletion" +msgstr "Limita cancellazione allegato" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_restrict_delete_attachment +msgid "Restrict Delete Attachments" +msgstr "Limita cancellazione allegati" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Restrict Deletion on attachment" +msgstr "Limita la cancellazione sugli allegati" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Select default level of delete restriction on attachments" +msgstr "" +"Selezionare il livello predefinito della limitazione di cancellazione sugli " +"allegati" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__smart_search +msgid "Smart Search" +msgstr "Ricerca intelligente" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_attachment__count_pending_changeset_changes +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__count_pending_changeset_changes +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__count_pending_changeset_changes +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_groups__count_pending_changeset_changes +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_users__count_pending_changeset_changes +msgid "The number of pending changes of this record" +msgstr "Numero di modifiche di questo record in attesa" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_attachment__count_pending_changesets +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__count_pending_changesets +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__count_pending_changesets +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_groups__count_pending_changesets +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_users__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_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_attachment__count_changesets +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__count_changesets +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__count_changesets +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_groups__count_changesets +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_users__count_changesets +msgid "The overall number of changesets of this record" +msgstr "Numero totale di insiemi di modifiche di questo record" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_users__delete_attachment_model_ids +msgid "" +"The user can delete the attachments related to the models assigned here. " +"Restrict Attachment Deletion must be'Custom' or 'Owner + Custom' for the " +"model to be selected here." +msgstr "" +"L'utente può eliminare gli allegati relativi ai modelli assegnati qui. " +"L'opzione \"Limita eliminazione allegati\" deve essere \"Personalizzata\" o " +"\"Proprietario + personalizzata\" affinché il modello venga selezionato qui." + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_group_ids +msgid "The users in the groups selected here can delete all the attachments." +msgstr "" +"Gli utenti nei gruppi selezionati qui possono eliminare tutti gli allegati." + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__delete_attachment_group_ids +msgid "" +"The users in the groups selected here can delete the attachments related to " +"this model." +msgstr "" +"Gli utenti nei gruppi selezionati qui possono eliminare gli allegati " +"relativi a questo modello." + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_groups__delete_attachment_model_ids +msgid "" +"The users of the group can delete the attachments related to the models " +"assigned here. Restrict Attachment Deletion must be'Custom' or 'Owner + " +"Custom' for the model to be selected here." +msgstr "" +"Gli utenti del gruppo possono eliminare gli allegati relativi ai modelli " +"assegnati qui. L'opzione \"Limita eliminazione allegati\" deve essere " +"\"Personalizzata\" o \"Proprietario + personalizzata\" affinché il modello " +"venga selezionato qui." + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_user_ids +msgid "The users selected here can delete all the attachments" +msgstr "Gli utenti selezionati qui possono eliminare tutti gli allegati" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__delete_attachment_user_ids +msgid "" +"The users selected here can delete the attachments related to this model." +msgstr "" +"Gli utenti selezionati qui possono eliminare gli allegati relativi a questo " +"modello." + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__default +msgid "Use global configuration" +msgstr "Usa configurazione globale" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_users +msgid "User" +msgstr "Utente" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__user_can_see_changeset +msgid "User Can See Changeset" +msgstr "L'utente può vedere l'insieme delle modifiche" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__restrict_delete_attachment +msgid "" +"When selected, the deletion of the attachments related to this model is " +"restricted to certain users." +msgstr "" +"Quando selezionata, la cancellazione degli allegati relativi a questo " +"modello è limitata ad alcuni utenti." + +#. module: attachment_delete_restrict +#. odoo-python +#: code:addons/attachment_delete_restrict/models/ir_attachment.py:0 +#, python-format +msgid "" +"You are not allowed to delete this attachment.\n" +"\n" +"Users with the delete permission:\n" +"%s" +msgstr "" +"Non si è autorizzati ad eliminare questo allegato.\n" +"\n" +"Utenti con permesso di cancellazione:\n" +"%s" diff --git a/attachment_delete_restrict/i18n/ja.po b/attachment_delete_restrict/i18n/ja.po new file mode 100644 index 00000000000..0dca63d19d8 --- /dev/null +++ b/attachment_delete_restrict/i18n/ja.po @@ -0,0 +1,288 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * attachment_delete_restrict +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-08-29 14:47+0000\n" +"PO-Revision-Date: 2021-08-29 14:47+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_groups +msgid "Access Groups" +msgstr "アクセスグループ" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_ir_attachment +msgid "Attachment" +msgstr "添付" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__delete_attachment_group_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_group_ids +msgid "Attachment Deletion Groups" +msgstr "添付削除グループ" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__delete_attachment_model_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__delete_attachment_model_ids +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.view_groups_form +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.view_users_form +msgid "Attachment Deletion Models" +msgstr "添付削除モデル" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__delete_attachment_user_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_user_ids +msgid "Attachment Deletion Users" +msgstr "添付削除ユーザ" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Authorized Groups:" +msgstr "" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Authorized Users:" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__changeset_change_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__changeset_change_ids +msgid "Changeset Changes" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__changeset_ids +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__changeset_ids +msgid "Changesets" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__count_pending_changeset_changes +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__count_pending_changeset_changes +msgid "Count Pending Changeset Changes" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__count_pending_changesets +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__count_pending_changesets +msgid "Count Pending Changesets" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__custom +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__custom +msgid "Custom: For each model, selected groups and users can delete them" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_restrict_delete_attachment +#, fuzzy +msgid "Define a default value for Attachments Deletion" +msgstr "添付削除を制限" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__display_name +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__display_name +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__display_name +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__display_name +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__display_name +msgid "Display Name" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__id +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__id +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__id +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__id +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__id +msgid "ID" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment____last_update +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model____last_update +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings____last_update +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups____last_update +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users____last_update +msgid "Last Modified on" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_ir_model +msgid "Models" +msgstr "モデル" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__none +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__none +msgid "No restriction: All users / groups can delete them" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__owner_custom +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__owner_custom +msgid "" +"Owner + Custom: Creator and admin can delete them + for each model, selected " +"groups and users can delete them" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__owner +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__owner +msgid "Owner: Only creator and admin can delete them" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__restrict_delete_attachment +msgid "Restrict Attachment Deletion" +msgstr "添付削除を制限" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_restrict_delete_attachment +#, fuzzy +msgid "Restrict Delete Attachments" +msgstr "添付削除を制限" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +#, fuzzy +msgid "Restrict Deletion on attachment" +msgstr "添付削除を制限" + +#. module: attachment_delete_restrict +#: model_terms:ir.ui.view,arch_db:attachment_delete_restrict.res_config_settings_view_form +msgid "Select default level of delete restriction on attachments" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__smart_search +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__smart_search +msgid "Smart Search" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_users__delete_attachment_model_ids +msgid "" +"The user can delete the attachments related to the models assigned here. In " +"general settings, 'Restrict Delete Attachment' must be set as 'custom' to " +"activate this setting." +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_group_ids +#, fuzzy +msgid "The users in the groups selected here can delete all the attachments." +msgstr "" +"ここで選択されたグループのユーザはこのモデルに関連する添付を削除することがで" +"きます。" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__delete_attachment_group_ids +msgid "" +"The users in the groups selected here can delete the attachments related to " +"this model." +msgstr "" +"ここで選択されたグループのユーザはこのモデルに関連する添付を削除することがで" +"きます。" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_groups__delete_attachment_model_ids +#, fuzzy +msgid "" +"The users of the group can delete the attachments related to the models " +"assigned here. In general settings, 'Restrict Delete Attachment' must be set " +"as 'custom' to activate this setting." +msgstr "" +"グループのユーザはここで割り当てられたモデルの添付を削除することができます。" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_user_ids +#, fuzzy +msgid "The users selected here can delete all the attachments" +msgstr "" +"ここで選択されたユーザはこのモデルに関連する添付を削除することができます。" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__delete_attachment_user_ids +msgid "" +"The users selected here can delete the attachments related to this model." +msgstr "" +"ここで選択されたユーザはこのモデルに関連する添付を削除することができます。" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__default +msgid "Use global configuration" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_groups__user_can_see_changeset +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_users__user_can_see_changeset +msgid "User Can See Changeset" +msgstr "" + +#. module: attachment_delete_restrict +#: model:ir.model,name:attachment_delete_restrict.model_res_users +msgid "Users" +msgstr "ユーザ" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__restrict_delete_attachment +msgid "" +"When selected, the deletion of the attachments related to this model is " +"restricted to certain users." +msgstr "" +"選択された場合、このモデルに関連する添付の削除は許可されたユーザのみに制限さ" +"れます。" + +#. module: attachment_delete_restrict +#: code:addons/attachment_delete_restrict/models/ir_attachment.py:0 +#, python-format +msgid "" +"You are not allowed to delete this attachment.\n" +"\n" +"Users with the delete permission:\n" +"%s" +msgstr "" +"この添付の削除権限がありません。\n" +"\n" +"削除権限を持つユーザ:\n" +"%s" + +#~ msgid "" +#~ "The user can delete the attachments related to the models assigned here." +#~ msgstr "ユーザはここで割り当てられたモデルの添付を削除することができます。" diff --git a/attachment_delete_restrict/models/__init__.py b/attachment_delete_restrict/models/__init__.py new file mode 100644 index 00000000000..53b5a8681e4 --- /dev/null +++ b/attachment_delete_restrict/models/__init__.py @@ -0,0 +1,5 @@ +from . import ir_attachment +from . import ir_model +from . import res_groups +from . import res_users +from . import res_config diff --git a/attachment_delete_restrict/models/ir_attachment.py b/attachment_delete_restrict/models/ir_attachment.py new file mode 100644 index 00000000000..74221ce2628 --- /dev/null +++ b/attachment_delete_restrict/models/ir_attachment.py @@ -0,0 +1,83 @@ +# Copyright 2021 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo import _, models +from odoo.exceptions import ValidationError + + +class IrAttachment(models.Model): + _inherit = "ir.attachment" + + def _check_delete_attachment(self, model=None): + if model: + restrict = model.restrict_delete_attachment + else: + restrict = ( + self.env["ir.config_parameter"] + .sudo() + .get_param( + "attachment_delete_restrict.global_restrict_delete_attachment" + ) + ) + if restrict == "owner": + self._check_owner_delete_attachment() + elif restrict == "custom": + self._check_custom_delete_attachment(model) + elif restrict == "owner_custom": + self._check_custom_delete_attachment(model, allow_owner_and_admin=True) + + def _raise_delete_attachment_error(self, allowed_users): + raise ValidationError( + _( + "You are not allowed to delete this attachment.\n\nUsers with " + "the delete permission:\n%s" + ) + % ("\n".join(allowed_users.mapped("name")) or "None") + ) + + def _check_owner_delete_attachment(self): + if not ( + self.create_uid == self.env.user + or self.env.user.has_group("base.group_system") + ): + return self._raise_delete_attachment_error( + self.create_uid | self.env.ref("base.group_system").users + ) + + def _check_custom_delete_attachment(self, model=None, allow_owner_and_admin=False): + if model: + groups = model.delete_attachment_group_ids + users = model.delete_attachment_user_ids + else: + groups = self.env[ + "res.config.settings" + ]._get_global_delete_attachment_groups() + users = self.env[ + "res.config.settings" + ]._get_global_delete_attachment_users() + if allow_owner_and_admin: + users += self.create_uid + groups += self.env.ref("base.group_system") + allowed_users = groups.users | users + if self.env.user not in allowed_users: + return self._raise_delete_attachment_error(allowed_users) + + def unlink(self): + if self.env.su: + return super().unlink() + res_models = list(set(self.filtered("res_model").mapped("res_model"))) + if res_models: + models = self.env["ir.model"].sudo().search([("model", "in", res_models)]) + name2models = {m.model: m for m in models} + for rec in self: + if rec.res_model: + model = name2models[rec.res_model] + if ( + model.restrict_delete_attachment == "default" + or not model.restrict_delete_attachment + ): + rec.sudo()._check_delete_attachment() + else: + rec.sudo()._check_delete_attachment(model) + return super().unlink() diff --git a/attachment_delete_restrict/models/ir_model.py b/attachment_delete_restrict/models/ir_model.py new file mode 100644 index 00000000000..e188077ad13 --- /dev/null +++ b/attachment_delete_restrict/models/ir_model.py @@ -0,0 +1,49 @@ +# Copyright 2021 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + +RESTRICT_DELETE_ATTACH = [ + ("default", "Use global configuration"), + ("owner", "Owner: Only creator and admin can delete them"), + ("custom", "Custom: For each model, selected groups and users can delete them"), + ( + "owner_custom", + "Owner + Custom: Creator and admin can delete them + for " + "each model, selected groups and users can delete them", + ), + ("none", "No restriction: All users / groups can delete them"), +] + + +class IrModel(models.Model): + _inherit = "ir.model" + + restrict_delete_attachment = fields.Selection( + selection=RESTRICT_DELETE_ATTACH, + string="Restrict Attachment Deletion", + help="When selected, the deletion of the attachments related to this model is " + "restricted to certain users.", + default="default", + ) + + delete_attachment_group_ids = fields.Many2many( + "res.groups", + string="Attachment Deletion Groups", + relation="delete_attachment_group_rel", + help="The users in the groups selected here can delete the attachments related " + "to this model.", + ) + + delete_attachment_user_ids = fields.Many2many( + "res.users", + string="Attachment Deletion Users", + relation="delete_attachment_user_rel", + help="The users selected here can delete the attachments related to this " + "model.", + ) + + def _onchange_restrict_delete_attachment(self): + if self.restrict_delete_attachment not in ["custom", "owner_custom"]: + self.delete_attachment_group_ids = False + self.delete_attachment_user_ids = False diff --git a/attachment_delete_restrict/models/res_config.py b/attachment_delete_restrict/models/res_config.py new file mode 100644 index 00000000000..8c2477c9f75 --- /dev/null +++ b/attachment_delete_restrict/models/res_config.py @@ -0,0 +1,88 @@ +# Copyright (C) 2022 Akretion (). +# @author Kévin Roche +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from ast import literal_eval + +from odoo import api, fields, models + +from .ir_model import RESTRICT_DELETE_ATTACH + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + global_restrict_delete_attachment = fields.Selection( + selection=RESTRICT_DELETE_ATTACH[1:], + config_parameter="attachment_delete_restrict.global_restrict_delete_attachment", + readonly=False, + required=True, + default="none", + string="Restrict Delete Attachments", + help="Define a default value for Attachments Deletion", + ) + + global_delete_attachment_group_ids = fields.Many2many( + "res.groups", + string="Attachment Deletion Groups", + help="The users in the groups selected here can delete all the attachments.", + readonly=False, + compute_sudo=True, + compute="_compute_global_delete_attachment_group_ids", + inverse="_inverse_global_delete_attachment_group_ids", + ) + global_delete_attachment_user_ids = fields.Many2many( + "res.users", + string="Attachment Deletion Users", + help="The users selected here can delete all the attachments", + readonly=False, + compute_sudo=True, + compute="_compute_global_delete_attachment_user_ids", + inverse="_inverse_global_delete_attachment_user_ids", + ) + + def _get_global_delete_attachment_groups(self): + str_group_ids = self.env["ir.config_parameter"].get_param( + "attachment_delete_restrict.global_delete_attachment_group_ids" + ) + groups_ids = literal_eval(str_group_ids or "[]") + return self.env["res.groups"].search([("id", "in", groups_ids)]) + + @api.depends("global_restrict_delete_attachment") + def _compute_global_delete_attachment_group_ids(self): + groups = self._get_global_delete_attachment_groups() + for setting in self: + if "custom" in setting.global_restrict_delete_attachment: + setting.global_delete_attachment_group_ids = groups + else: + setting.global_delete_attachment_group_ids = None + + def _inverse_global_delete_attachment_group_ids(self): + for setting in self: + self.env["ir.config_parameter"].set_param( + "attachment_delete_restrict.global_delete_attachment_group_ids", + str(setting.global_delete_attachment_group_ids.ids), + ) + + def _get_global_delete_attachment_users(self): + str_user_ids = self.env["ir.config_parameter"].get_param( + "attachment_delete_restrict.global_delete_attachment_user_ids" + ) + user_ids = literal_eval(str_user_ids or "[]") + return self.env["res.users"].search([("id", "in", user_ids)]) + + @api.depends("global_restrict_delete_attachment") + def _compute_global_delete_attachment_user_ids(self): + users = self._get_global_delete_attachment_users() + for setting in self: + if "custom" in setting.global_restrict_delete_attachment: + setting.global_delete_attachment_user_ids = users + else: + setting.global_delete_attachment_user_ids = None + + def _inverse_global_delete_attachment_user_ids(self): + for setting in self: + self.env["ir.config_parameter"].set_param( + "attachment_delete_restrict.global_delete_attachment_user_ids", + str(setting.global_delete_attachment_user_ids.ids), + ) diff --git a/attachment_delete_restrict/models/res_groups.py b/attachment_delete_restrict/models/res_groups.py new file mode 100644 index 00000000000..a7cf1ba33b4 --- /dev/null +++ b/attachment_delete_restrict/models/res_groups.py @@ -0,0 +1,17 @@ +# Copyright 2021 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResGroups(models.Model): + _inherit = "res.groups" + + delete_attachment_model_ids = fields.Many2many( + "ir.model", + relation="delete_attachment_group_rel", + string="Attachment Deletion Models", + help="The users of the group can delete the attachments related to " + "the models assigned here. Restrict Attachment Deletion must be" + "'Custom' or 'Owner + Custom' for the model to be selected here.", + ) diff --git a/attachment_delete_restrict/models/res_users.py b/attachment_delete_restrict/models/res_users.py new file mode 100644 index 00000000000..b3c95864a78 --- /dev/null +++ b/attachment_delete_restrict/models/res_users.py @@ -0,0 +1,17 @@ +# Copyright 2021 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResUsers(models.Model): + _inherit = "res.users" + + delete_attachment_model_ids = fields.Many2many( + "ir.model", + relation="delete_attachment_user_rel", + string="Attachment Deletion Models", + help="The user can delete the attachments related to the models " + "assigned here. Restrict Attachment Deletion must be" + "'Custom' or 'Owner + Custom' for the model to be selected here.", + ) diff --git a/attachment_delete_restrict/pyproject.toml b/attachment_delete_restrict/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/attachment_delete_restrict/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/attachment_delete_restrict/readme/CONFIGURE.md b/attachment_delete_restrict/readme/CONFIGURE.md new file mode 100644 index 00000000000..45deb03b968 --- /dev/null +++ b/attachment_delete_restrict/readme/CONFIGURE.md @@ -0,0 +1,28 @@ +## Select level: + +1. Go to *Settings \> General Settings\> Permission section*. +2. Choose the level of *Restrict Delete Attachment* for all models by + default or for models with "default" restriction level. + +## Five levels: + +- Default : Use global configuration +- Owner : Owner and admins only +- Custom : Certain groups or users per related model. +- Owner + Custom : Owner, admins and Certain groups or users per related + model. +- None : all users can delete them + +Only Custom and Owner + Custom need specific configuration on models. + +## For Custom and Owner + Custom levels: + +1. Go to *Settings \> Technical \> Database Structure \> Models*. +2. Open a model for which attachment deletion should be restricted. +3. Select 'Restrict Attachment Deletion', and assign 'Attachment + Deletion Groups' and/or 'Attachment Deletion Users' as necessary (if + no assignment, no one can delete the attachments of this model). + +For assigning 'Attachment Deletion Groups'/'Attachment Deletion Users' +to the model, you can alternatively add the model in the 'Attachment +Deletion Models' tab in the respective group/user form. diff --git a/attachment_delete_restrict/readme/CONTRIBUTORS.md b/attachment_delete_restrict/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..3c11d9deb8d --- /dev/null +++ b/attachment_delete_restrict/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- Yoshi Tashiro \<\> +- Kévin Roche \<\> +- Sébastien BEAU \<\> diff --git a/attachment_delete_restrict/readme/DESCRIPTION.md b/attachment_delete_restrict/readme/DESCRIPTION.md new file mode 100644 index 00000000000..4db32eec628 --- /dev/null +++ b/attachment_delete_restrict/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This module provides the ability to restrict the deletion of the +attachments at different levels. diff --git a/attachment_delete_restrict/static/description/icon.png b/attachment_delete_restrict/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/attachment_delete_restrict/static/description/icon.png differ diff --git a/attachment_delete_restrict/static/description/index.html b/attachment_delete_restrict/static/description/index.html new file mode 100644 index 00000000000..367733f568b --- /dev/null +++ b/attachment_delete_restrict/static/description/index.html @@ -0,0 +1,477 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Restrict Deletion of Attachments

+ +

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

+

This module provides the ability to restrict the deletion of the +attachments at different levels.

+

Table of contents

+ +
+

Configuration

+
+

Select level:

+
    +
  1. Go to Settings > General Settings> Permission section.
  2. +
  3. Choose the level of Restrict Delete Attachment for all models by +default or for models with “default” restriction level.
  4. +
+
+
+

Five levels:

+
    +
  • Default : Use global configuration
  • +
  • Owner : Owner and admins only
  • +
  • Custom : Certain groups or users per related model.
  • +
  • Owner + Custom : Owner, admins and Certain groups or users per related +model.
  • +
  • None : all users can delete them
  • +
+

Only Custom and Owner + Custom need specific configuration on models.

+
+
+

For Custom and Owner + Custom levels:

+
    +
  1. Go to Settings > Technical > Database Structure > Models.
  2. +
  3. Open a model for which attachment deletion should be restricted.
  4. +
  5. Select ‘Restrict Attachment Deletion’, and assign ‘Attachment +Deletion Groups’ and/or ‘Attachment Deletion Users’ as necessary (if +no assignment, no one can delete the attachments of this model).
  6. +
+

For assigning ‘Attachment Deletion Groups’/’Attachment Deletion Users’ +to the model, you can alternatively add the model in the ‘Attachment +Deletion Models’ tab in the respective group/user form.

+
+
+
+

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

+
    +
  • Quartile
  • +
  • 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:

+

yostashiro Kev-Roche

+

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_delete_restrict/tests/__init__.py b/attachment_delete_restrict/tests/__init__.py new file mode 100644 index 00000000000..c6f40a3f2fb --- /dev/null +++ b/attachment_delete_restrict/tests/__init__.py @@ -0,0 +1 @@ +from . import test_attachment_delete_restrict diff --git a/attachment_delete_restrict/tests/test_attachment_delete_restrict.py b/attachment_delete_restrict/tests/test_attachment_delete_restrict.py new file mode 100644 index 00000000000..d4944b0a368 --- /dev/null +++ b/attachment_delete_restrict/tests/test_attachment_delete_restrict.py @@ -0,0 +1,178 @@ +# Copyright 2021 Quartile Limited +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import Command +from odoo.exceptions import ValidationError +from odoo.tests import TransactionCase, tagged + + +class AbstractCase: + def test_restrict_none(self): + self._set_restrict_mode("none") + self.attachment.with_user(self.user).unlink() + + def test_restrict_custom_user(self): + self._set_restrict_mode("custom") + with self.assertRaises(ValidationError): + self.attachment.with_user(self.user).unlink() + self._allow_user() + self.attachment.with_user(self.user).unlink() + + def test_restrict_custom_user_with_sudo(self): + self._set_restrict_mode("custom") + self.attachment.with_user(self.user).sudo().unlink() + + def test_restrict_custom_group(self): + self._set_restrict_mode("custom") + with self.assertRaises(ValidationError): + self.attachment.with_user(self.user).unlink() + self._allow_group() + self.attachment.with_user(self.user).unlink() + + def test_restrict_owner(self): + self._set_restrict_mode("owner") + with self.assertRaises(ValidationError): + self.attachment.with_user(self.user).unlink() + self.attachment.with_user(self.user_owner).unlink() + + def test_restrict_owner_admin(self): + self._set_restrict_mode("owner") + self.attachment.with_user(self.user_admin).unlink() + + def test_restrict_owner_and_custom_user_forbidden(self): + self._set_restrict_mode("owner_custom") + with self.assertRaises(ValidationError): + self.attachment.with_user(self.user).unlink() + + def test_restrict_owner_and_custom_user_owner(self): + self._set_restrict_mode("owner_custom") + self.attachment.with_user(self.user_owner).unlink() + + def test_restrict_owner_and_custom_user_admin(self): + self._set_restrict_mode("owner_custom") + self.attachment.with_user(self.user_admin).unlink() + + def test_restrict_owner_and_custom_user(self): + self._set_restrict_mode("owner_custom") + with self.assertRaises(ValidationError): + self.attachment.with_user(self.user).unlink() + self._allow_user() + self.attachment.with_user(self.user).unlink() + + def test_restrict_owner_and_custom_user_group(self): + self._set_restrict_mode("owner_custom") + with self.assertRaises(ValidationError): + self.attachment.with_user(self.user).unlink() + self._allow_group() + self.attachment.with_user(self.user).unlink() + + +@tagged("post_install", "-at_install") +class TestAttachmentDeleteAbstract(TransactionCase): + allow_inherited_tests_method = True + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.param = cls.env["ir.config_parameter"] + cls.param.set_param( + "attachment_delete_restrict.global_restrict_delete_attachment", "none" + ) + cls.partner_model = cls.env["ir.model"].search([("model", "=", "res.partner")]) + cls.partner_1 = cls.env["res.partner"].create({"name": "partner_1"}) + cls.group = cls.env.ref("base.group_user") + cls.user_owner = cls.env["res.users"].create( + { + "name": "test owner user", + "login": "test-owner@example.com", + "groups_id": [ + Command.set( + [ + cls.env.ref("base.group_user").id, + cls.env.ref("base.group_partner_manager").id, + ] + ) + ], + } + ) + cls.user = cls.env["res.users"].create( + { + "name": "test user", + "login": "test2@example.com", + "groups_id": [ + Command.set( + [ + cls.env.ref("base.group_user").id, + cls.env.ref("base.group_partner_manager").id, + ] + ) + ], + } + ) + cls.user_admin = cls.env["res.users"].create( + { + "name": "User admin", + "login": "admin@example.com", + "groups_id": [ + Command.set( + [ + cls.env.ref("base.group_system").id, + cls.env.ref("base.group_user").id, + cls.env.ref("base.group_partner_manager").id, + ] + ) + ], + } + ) + cls.attachment = ( + cls.env["ir.attachment"] + .with_user(cls.user_owner) + .create( + { + "name": "test attachment 2", + "type": "binary", + "res_model": "res.partner", + "res_id": cls.partner_1.id, + } + ) + ) + + def _set_restrict_mode(self, restrict_mode): + raise NotImplementedError + + def _allow_user(self): + raise NotImplementedError + + def _allow_group(self): + raise NotImplementedError + + +class TestAttachmentDeleteGlobal(TestAttachmentDeleteAbstract, AbstractCase): + def _set_restrict_mode(self, restrict_mode): + self.param.set_param( + "attachment_delete_restrict.global_restrict_delete_attachment", + restrict_mode, + ) + + def _allow_user(self): + self.param.set_param( + "attachment_delete_restrict.global_delete_attachment_user_ids", + self.user.ids, + ) + + def _allow_group(self): + self.param.set_param( + "attachment_delete_restrict.global_delete_attachment_group_ids", + self.group.ids, + ) + + +class TestAttachmentDeleteModel(TestAttachmentDeleteAbstract, AbstractCase): + def _set_restrict_mode(self, restrict_mode): + self.partner_model.write({"restrict_delete_attachment": restrict_mode}) + + def _allow_user(self): + self.partner_model.write({"delete_attachment_user_ids": [(4, self.user.id)]}) + + def _allow_group(self): + self.partner_model.write({"delete_attachment_group_ids": [(4, self.group.id)]}) diff --git a/attachment_delete_restrict/views/ir_model_views.xml b/attachment_delete_restrict/views/ir_model_views.xml new file mode 100644 index 00000000000..c5faef34978 --- /dev/null +++ b/attachment_delete_restrict/views/ir_model_views.xml @@ -0,0 +1,29 @@ + + + + ir.model form + ir.model + + + + + + + + + + + + + + + + diff --git a/attachment_delete_restrict/views/res_config_setting_views.xml b/attachment_delete_restrict/views/res_config_setting_views.xml new file mode 100644 index 00000000000..bbcb99bb171 --- /dev/null +++ b/attachment_delete_restrict/views/res_config_setting_views.xml @@ -0,0 +1,50 @@ + + + + res.config.settings.attachment.delete.restrict + res.config.settings + + + + + + + +
+ Authorized Groups: +
+ +
+ Authorized Users: +
+ +
+
+
+
+
+
+
diff --git a/attachment_delete_restrict/views/res_groups_views.xml b/attachment_delete_restrict/views/res_groups_views.xml new file mode 100644 index 00000000000..3de88487049 --- /dev/null +++ b/attachment_delete_restrict/views/res_groups_views.xml @@ -0,0 +1,24 @@ + + + + res.groups.form + res.groups + + + + + + + + + + + + diff --git a/attachment_delete_restrict/views/res_users_views.xml b/attachment_delete_restrict/views/res_users_views.xml new file mode 100644 index 00000000000..e650756dd3c --- /dev/null +++ b/attachment_delete_restrict/views/res_users_views.xml @@ -0,0 +1,24 @@ + + + + res.users.form + res.users + + + + + + + + + + + + diff --git a/auditlog/README.rst b/auditlog/README.rst index 37615e91c2d..42312cf1196 100644 --- a/auditlog/README.rst +++ b/auditlog/README.rst @@ -11,7 +11,7 @@ Audit Log !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:5d80401c7f72e7744b093dc1e4ee6fc2eec010879861d75c844494808dc0e867 + !! source digest: sha256:eff893d734bc46c69f3872737aa234d2a2aaf763da5259ac3e977f22d1e4f3a9 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/auditlog/__manifest__.py b/auditlog/__manifest__.py index 990eefc417e..629376ca5bf 100644 --- a/auditlog/__manifest__.py +++ b/auditlog/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Audit Log", - "version": "18.0.2.0.5", + "version": "18.0.2.0.6", "author": "ABF OSIELL, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/server-tools", diff --git a/auditlog/static/description/index.html b/auditlog/static/description/index.html index 09bfb84c421..141e62d3af5 100644 --- a/auditlog/static/description/index.html +++ b/auditlog/static/description/index.html @@ -372,7 +372,7 @@

Audit Log

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:5d80401c7f72e7744b093dc1e4ee6fc2eec010879861d75c844494808dc0e867 +!! source digest: sha256:eff893d734bc46c69f3872737aa234d2a2aaf763da5259ac3e977f22d1e4f3a9 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module allows the administrator to log user operations performed on diff --git a/auditlog/tests/test_auditlog.py b/auditlog/tests/test_auditlog.py index 58e38b71cfb..e4c3aeaa18b 100644 --- a/auditlog/tests/test_auditlog.py +++ b/auditlog/tests/test_auditlog.py @@ -10,6 +10,12 @@ class AuditlogCommon: + """Base case with basic log creation tests""" + + # Ensure that test cases that inherit from this class run the methods + # that it provides. + allow_inherited_tests_method = True + def test_LogCreation(self): """First test, caching some data.""" self.groups_rule.subscribe() diff --git a/auto_backup/i18n/sl.po b/auto_backup/i18n/sl.po index 922adb25ca3..4700542f1dc 100644 --- a/auto_backup/i18n/sl.po +++ b/auto_backup/i18n/sl.po @@ -9,15 +9,16 @@ msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-03 10:08+0000\n" -"PO-Revision-Date: 2018-03-03 10:08+0000\n" -"Last-Translator: OCA Transbot , 2018\n" +"PO-Revision-Date: 2026-01-22 18:41+0000\n" +"Last-Translator: Matjaz Mozetic \n" "Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" +"X-Generator: Weblate 5.15.2\n" #. module: auto_backup #: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_conf_form @@ -147,7 +148,7 @@ msgstr "" #. module: auto_backup #: model:ir.model.fields,field_description:auto_backup.field_db_backup__display_name msgid "Display Name" -msgstr "Prikazni naziv" +msgstr "Prikazani naziv" #. module: auto_backup #. odoo-python diff --git a/base_view_inheritance_extension/i18n/tr.po b/base_view_inheritance_extension/i18n/tr.po index bd0e58da97f..5976f538885 100644 --- a/base_view_inheritance_extension/i18n/tr.po +++ b/base_view_inheritance_extension/i18n/tr.po @@ -9,14 +9,15 @@ msgstr "" "Project-Id-Version: Odoo Server 9.0c\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-12-29 03:39+0000\n" -"PO-Revision-Date: 2016-12-29 03:39+0000\n" -"Last-Translator: Ahmet Altinisik , 2016\n" +"PO-Revision-Date: 2026-01-22 08:50+0000\n" +"Last-Translator: Betül Öğmen \n" "Language-Team: Turkish (https://www.transifex.com/oca/teams/23907/tr/)\n" "Language: tr\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.15.2\n" #. module: base_view_inheritance_extension #: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form @@ -26,17 +27,17 @@ msgstr "İş ortağı formu" #. module: base_view_inheritance_extension #: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form msgid "Phone numbers" -msgstr "" +msgstr "Telefon numaraları" #. module: base_view_inheritance_extension #: model:ir.model.fields,field_description:base_view_inheritance_extension.field_ir_ui_view__smart_search msgid "Smart Search" -msgstr "" +msgstr "Akıllı Arama" #. module: base_view_inheritance_extension #: model:ir.model,name:base_view_inheritance_extension.model_ir_ui_view msgid "View" -msgstr "" +msgstr "Görünüm" #~ msgid "ir.ui.view" #~ msgstr "ir.ui.view" diff --git a/database_cleanup/i18n/sl.po b/database_cleanup/i18n/sl.po index 67ca280462f..f30ca52849e 100644 --- a/database_cleanup/i18n/sl.po +++ b/database_cleanup/i18n/sl.po @@ -9,15 +9,16 @@ msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-03 10:08+0000\n" -"PO-Revision-Date: 2018-03-03 10:08+0000\n" -"Last-Translator: OCA Transbot , 2018\n" +"PO-Revision-Date: 2026-01-22 18:41+0000\n" +"Last-Translator: Matjaz Mozetic \n" "Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" +"X-Generator: Weblate 5.15.2\n" #. module: database_cleanup #: model:ir.model,name:database_cleanup.model_cleanup_create_indexes_line @@ -164,7 +165,7 @@ msgstr "Čiščenje podatkovne baze" #: model:ir.model.fields,field_description:database_cleanup.field_cleanup_purge_wizard_module__display_name #: model:ir.model.fields,field_description:database_cleanup.field_cleanup_purge_wizard_table__display_name msgid "Display Name" -msgstr "Prikazni naziv" +msgstr "Prikazani naziv" #. module: database_cleanup #: model:ir.model.fields,field_description:database_cleanup.field_cleanup_create_indexes_line__field_id diff --git a/fetchmail_attach_from_folder/README.rst b/fetchmail_attach_from_folder/README.rst index 2b3fd02d886..efecb7f4e02 100644 --- a/fetchmail_attach_from_folder/README.rst +++ b/fetchmail_attach_from_folder/README.rst @@ -11,7 +11,7 @@ Email gateway - folders !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:e4c93058a6151bbc67ceadf75cf0fee376e22dbd28e548bc91887592979779de + !! source digest: sha256:ab65e43855bfb568a640043322dc68354fa2d392958a160fb7b4b14d4c5ed9c0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/fetchmail_attach_from_folder/__manifest__.py b/fetchmail_attach_from_folder/__manifest__.py index 5ade469c5fe..0a786bb1cc6 100644 --- a/fetchmail_attach_from_folder/__manifest__.py +++ b/fetchmail_attach_from_folder/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Email gateway - folders", "summary": "Attach mails in an IMAP folder to existing objects", - "version": "18.0.1.0.0", + "version": "18.0.1.1.0", "author": "Therp BV,Odoo Community Association (OCA)", "maintainers": ["NL66278"], "website": "https://github.com/OCA/server-tools", diff --git a/fetchmail_attach_from_folder/i18n/de.po b/fetchmail_attach_from_folder/i18n/de.po index da0d9713ec3..a33fb1652e5 100644 --- a/fetchmail_attach_from_folder/i18n/de.po +++ b/fetchmail_attach_from_folder/i18n/de.po @@ -44,7 +44,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/wizard/attach_mail_manually.py:0 -#, python-format msgid "Attach emails manually" msgstr "" @@ -86,22 +85,6 @@ msgstr "" msgid "Cancel" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_change_ids -msgid "Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_ids -msgid "Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__folders_only msgid "" @@ -112,7 +95,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Confirm connection first." msgstr "" @@ -124,55 +106,28 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not create archive folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format -msgid "Could not fetch %(msgid)s in folder %(folder)s on server %(server)s" +msgid "" +"Could not fetch %(message_uid)s in folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not open folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not search folder %(folder)s on server %(server)s" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "Count Changesets" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "Count Pending Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "Count Pending Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__object_id msgid "Create a New Record" @@ -332,18 +287,9 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Invalid folder %s!" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder____last_update -#, fuzzy -msgid "Last Modified on" -msgstr "Zuletzt aktualisiert am" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__write_uid #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__write_uid @@ -364,7 +310,7 @@ msgid "Match Algorithm" msgstr "" #. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__msgid +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__message_uid msgid "Message id" msgstr "" @@ -463,6 +409,11 @@ msgstr "" msgid "Server Type" msgstr "" +#. module: fetchmail_attach_from_folder +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__x_server_type_env_default +msgid "Server Type Env Default" +msgstr "" + #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__smart_search #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__smart_search @@ -511,35 +462,11 @@ msgstr "" msgid "The model to attach emails to" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "The number of pending changes of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "The number of pending changesets of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "The overall number of changesets of this record" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__path msgid "" -"The path to your mail folder. Typically would be something like 'INBOX." -"myfolder'" +"The path to your mail folder. Typically would be something like " +"'INBOX.myfolder'" msgstr "" #. module: fetchmail_attach_from_folder @@ -555,7 +482,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Unable to retrieve folders." msgstr "" @@ -564,14 +490,6 @@ msgstr "" msgid "Use 1st match" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__user_can_see_changeset -msgid "User Can See Changeset" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__wizard_id msgid "Wizard" @@ -601,3 +519,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:fetchmail_attach_from_folder.view_email_server_form msgid "to,from" msgstr "" + +#, fuzzy +#~ msgid "Last Modified on" +#~ msgstr "Zuletzt aktualisiert am" diff --git a/fetchmail_attach_from_folder/i18n/es.po b/fetchmail_attach_from_folder/i18n/es.po index 17aa02352bd..f73cd740e90 100644 --- a/fetchmail_attach_from_folder/i18n/es.po +++ b/fetchmail_attach_from_folder/i18n/es.po @@ -44,7 +44,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/wizard/attach_mail_manually.py:0 -#, python-format msgid "Attach emails manually" msgstr "" @@ -86,22 +85,6 @@ msgstr "" msgid "Cancel" msgstr "Cancelar" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_change_ids -msgid "Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_ids -msgid "Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__folders_only msgid "" @@ -112,7 +95,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Confirm connection first." msgstr "" @@ -124,55 +106,28 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not create archive folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format -msgid "Could not fetch %(msgid)s in folder %(folder)s on server %(server)s" +msgid "" +"Could not fetch %(message_uid)s in folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not open folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not search folder %(folder)s on server %(server)s" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "Count Changesets" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "Count Pending Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "Count Pending Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__object_id msgid "Create a New Record" @@ -332,18 +287,9 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Invalid folder %s!" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder____last_update -#, fuzzy -msgid "Last Modified on" -msgstr "Última actualización en" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__write_uid #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__write_uid @@ -364,7 +310,7 @@ msgid "Match Algorithm" msgstr "" #. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__msgid +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__message_uid msgid "Message id" msgstr "" @@ -463,6 +409,11 @@ msgstr "" msgid "Server Type" msgstr "" +#. module: fetchmail_attach_from_folder +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__x_server_type_env_default +msgid "Server Type Env Default" +msgstr "" + #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__smart_search #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__smart_search @@ -511,35 +462,11 @@ msgstr "" msgid "The model to attach emails to" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "The number of pending changes of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "The number of pending changesets of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "The overall number of changesets of this record" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__path msgid "" -"The path to your mail folder. Typically would be something like 'INBOX." -"myfolder'" +"The path to your mail folder. Typically would be something like " +"'INBOX.myfolder'" msgstr "" #. module: fetchmail_attach_from_folder @@ -555,7 +482,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Unable to retrieve folders." msgstr "" @@ -564,14 +490,6 @@ msgstr "" msgid "Use 1st match" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__user_can_see_changeset -msgid "User Can See Changeset" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__wizard_id msgid "Wizard" @@ -601,3 +519,7 @@ msgstr "o" #: model_terms:ir.ui.view,arch_db:fetchmail_attach_from_folder.view_email_server_form msgid "to,from" msgstr "" + +#, fuzzy +#~ msgid "Last Modified on" +#~ msgstr "Última actualización en" diff --git a/fetchmail_attach_from_folder/i18n/fetchmail_attach_from_folder.pot b/fetchmail_attach_from_folder/i18n/fetchmail_attach_from_folder.pot index b0b1187e5c2..878fbd2c4f8 100644 --- a/fetchmail_attach_from_folder/i18n/fetchmail_attach_from_folder.pot +++ b/fetchmail_attach_from_folder/i18n/fetchmail_attach_from_folder.pot @@ -107,7 +107,8 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -msgid "Could not fetch %(msgid)s in folder %(folder)s on server %(server)s" +msgid "" +"Could not fetch %(message_uid)s in folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder @@ -304,7 +305,7 @@ msgid "Match Algorithm" msgstr "" #. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__msgid +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__message_uid msgid "Message id" msgstr "" diff --git a/fetchmail_attach_from_folder/i18n/fr.po b/fetchmail_attach_from_folder/i18n/fr.po index 667b1a4fc5e..2d926f5f919 100644 --- a/fetchmail_attach_from_folder/i18n/fr.po +++ b/fetchmail_attach_from_folder/i18n/fr.po @@ -44,7 +44,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/wizard/attach_mail_manually.py:0 -#, python-format msgid "Attach emails manually" msgstr "" @@ -86,22 +85,6 @@ msgstr "" msgid "Cancel" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_change_ids -msgid "Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_ids -msgid "Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__folders_only msgid "" @@ -112,7 +95,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Confirm connection first." msgstr "" @@ -124,55 +106,28 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not create archive folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format -msgid "Could not fetch %(msgid)s in folder %(folder)s on server %(server)s" +msgid "" +"Could not fetch %(message_uid)s in folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not open folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not search folder %(folder)s on server %(server)s" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "Count Changesets" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "Count Pending Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "Count Pending Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__object_id msgid "Create a New Record" @@ -332,18 +287,9 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Invalid folder %s!" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder____last_update -#, fuzzy -msgid "Last Modified on" -msgstr "Dernière mise à jour le" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__write_uid #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__write_uid @@ -364,7 +310,7 @@ msgid "Match Algorithm" msgstr "" #. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__msgid +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__message_uid msgid "Message id" msgstr "" @@ -463,6 +409,11 @@ msgstr "" msgid "Server Type" msgstr "" +#. module: fetchmail_attach_from_folder +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__x_server_type_env_default +msgid "Server Type Env Default" +msgstr "" + #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__smart_search #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__smart_search @@ -511,35 +462,11 @@ msgstr "" msgid "The model to attach emails to" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "The number of pending changes of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "The number of pending changesets of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "The overall number of changesets of this record" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__path msgid "" -"The path to your mail folder. Typically would be something like 'INBOX." -"myfolder'" +"The path to your mail folder. Typically would be something like " +"'INBOX.myfolder'" msgstr "" #. module: fetchmail_attach_from_folder @@ -555,7 +482,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Unable to retrieve folders." msgstr "" @@ -564,14 +490,6 @@ msgstr "" msgid "Use 1st match" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__user_can_see_changeset -msgid "User Can See Changeset" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__wizard_id msgid "Wizard" @@ -601,3 +519,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:fetchmail_attach_from_folder.view_email_server_form msgid "to,from" msgstr "" + +#, fuzzy +#~ msgid "Last Modified on" +#~ msgstr "Dernière mise à jour le" diff --git a/fetchmail_attach_from_folder/i18n/fr_CA.po b/fetchmail_attach_from_folder/i18n/fr_CA.po index bd4e60e9af7..3fea44e85e4 100644 --- a/fetchmail_attach_from_folder/i18n/fr_CA.po +++ b/fetchmail_attach_from_folder/i18n/fr_CA.po @@ -44,7 +44,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/wizard/attach_mail_manually.py:0 -#, python-format msgid "Attach emails manually" msgstr "" @@ -86,22 +85,6 @@ msgstr "" msgid "Cancel" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_change_ids -msgid "Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_ids -msgid "Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__folders_only msgid "" @@ -112,7 +95,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Confirm connection first." msgstr "" @@ -124,55 +106,28 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not create archive folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format -msgid "Could not fetch %(msgid)s in folder %(folder)s on server %(server)s" +msgid "" +"Could not fetch %(message_uid)s in folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not open folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not search folder %(folder)s on server %(server)s" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "Count Changesets" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "Count Pending Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "Count Pending Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__object_id msgid "Create a New Record" @@ -332,17 +287,9 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Invalid folder %s!" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder____last_update -msgid "Last Modified on" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__write_uid #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__write_uid @@ -363,7 +310,7 @@ msgid "Match Algorithm" msgstr "" #. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__msgid +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__message_uid msgid "Message id" msgstr "" @@ -462,6 +409,11 @@ msgstr "" msgid "Server Type" msgstr "" +#. module: fetchmail_attach_from_folder +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__x_server_type_env_default +msgid "Server Type Env Default" +msgstr "" + #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__smart_search #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__smart_search @@ -510,35 +462,11 @@ msgstr "" msgid "The model to attach emails to" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "The number of pending changes of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "The number of pending changesets of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "The overall number of changesets of this record" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__path msgid "" -"The path to your mail folder. Typically would be something like 'INBOX." -"myfolder'" +"The path to your mail folder. Typically would be something like " +"'INBOX.myfolder'" msgstr "" #. module: fetchmail_attach_from_folder @@ -554,7 +482,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Unable to retrieve folders." msgstr "" @@ -563,14 +490,6 @@ msgstr "" msgid "Use 1st match" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__user_can_see_changeset -msgid "User Can See Changeset" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__wizard_id msgid "Wizard" diff --git a/fetchmail_attach_from_folder/i18n/it.po b/fetchmail_attach_from_folder/i18n/it.po index 8ef2d80b10c..993eab6e64b 100644 --- a/fetchmail_attach_from_folder/i18n/it.po +++ b/fetchmail_attach_from_folder/i18n/it.po @@ -45,7 +45,6 @@ msgstr "Allegati assegnati" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/wizard/attach_mail_manually.py:0 -#, python-format msgid "Attach emails manually" msgstr "Allega e-mail manualmente" @@ -89,22 +88,6 @@ msgstr "" msgid "Cancel" msgstr "Annulla" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_change_ids -msgid "Changeset Changes" -msgstr "Modifiche dell'insieme di modifiche" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_ids -msgid "Changesets" -msgstr "Insiemi di modifiche" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__folders_only msgid "" @@ -117,7 +100,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Confirm connection first." msgstr "Prima confermare la connessione." @@ -129,57 +111,28 @@ msgstr "Confermata" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not create archive folder %(folder)s on server %(server)s" msgstr "Impossibile creare la cartella %(folder)s nel server %(server)s" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format -msgid "Could not fetch %(msgid)s in folder %(folder)s on server %(server)s" +msgid "" +"Could not fetch %(message_uid)s in folder %(folder)s on server %(server)s" msgstr "" -"Impossibile recuperare %(msgid)s nella cartella %(folder)s nel server " -"%(server)s" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not open folder %(folder)s on server %(server)s" msgstr "Impossibile aprire la cartella %(folder)s nel server %(server)s" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not search folder %(folder)s on server %(server)s" msgstr "Impossibile cercare la cartella %(folder)s nel server %(server)s" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "Count Changesets" -msgstr "Conta insiemi di modifiche" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "Count Pending Changeset Changes" -msgstr "Conteggio modifiche dell'insieme di modifiche in attesa" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "Count Pending Changesets" -msgstr "Conteggio insieme di modifiche in attesa" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__object_id msgid "Create a New Record" @@ -207,7 +160,8 @@ msgstr "Data" #. module: fetchmail_attach_from_folder #: model:ir.model,name:fetchmail_attach_from_folder.model_fetchmail_server_folder msgid "Define folders (IMAP mailboxes) from which to fetch mail." -msgstr "Definire le cartelle (cassette posta IMAP) dalle quali ricevere e-mail." +msgstr "" +"Definire le cartelle (cassette posta IMAP) dalle quali ricevere e-mail." #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__delete_matching @@ -345,17 +299,9 @@ msgstr "Server di posta in arrivo" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Invalid folder %s!" msgstr "Cartella non valida %s!" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder____last_update -msgid "Last Modified on" -msgstr "Ultima modifica il" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__write_uid #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__write_uid @@ -376,7 +322,7 @@ msgid "Match Algorithm" msgstr "Algoritmo di corrispondenza" #. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__msgid +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__message_uid msgid "Message id" msgstr "ID messaggio" @@ -481,6 +427,11 @@ msgstr "Server" msgid "Server Type" msgstr "Tipo server" +#. module: fetchmail_attach_from_folder +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__x_server_type_env_default +msgid "Server Type Env Default" +msgstr "" + #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__smart_search #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__smart_search @@ -536,38 +487,14 @@ msgstr "" msgid "The model to attach emails to" msgstr "Modello a cui allegare l'email" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "The number of pending changes of this record" -msgstr "Numero di modifiche di questo record in attesa" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "The number of pending changesets of this record" -msgstr "Numero di insiemi di modifiche in attesa di questo record" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "The overall number of changesets of this record" -msgstr "Numero totale di insiemi di modifiche di questo record" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__path msgid "" -"The path to your mail folder. Typically would be something like 'INBOX." -"myfolder'" +"The path to your mail folder. Typically would be something like " +"'INBOX.myfolder'" msgstr "" -"Percorso alla cartella e-mail. Normalmente è qualcosa del tipo 'INBOX." -"miacartella'" +"Percorso alla cartella e-mail. Normalmente è qualcosa del tipo " +"'INBOX.miacartella'" #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__archive_path @@ -584,7 +511,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Unable to retrieve folders." msgstr "Impossibile ottenere le cartelle." @@ -593,14 +519,6 @@ msgstr "Impossibile ottenere le cartelle." msgid "Use 1st match" msgstr "Utilizza la prima corrispondenza" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__user_can_see_changeset -msgid "User Can See Changeset" -msgstr "L'utente può vedere l'insieme delle modifiche" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__wizard_id msgid "Wizard" @@ -630,3 +548,39 @@ msgstr "o" #: model_terms:ir.ui.view,arch_db:fetchmail_attach_from_folder.view_email_server_form msgid "to,from" msgstr "a,da" + +#~ msgid "Changeset Changes" +#~ msgstr "Modifiche dell'insieme di modifiche" + +#~ msgid "Changesets" +#~ msgstr "Insiemi di modifiche" + +#, python-format +#~ msgid "Could not fetch %(msgid)s in folder %(folder)s on server %(server)s" +#~ msgstr "" +#~ "Impossibile recuperare %(msgid)s nella cartella %(folder)s nel server " +#~ "%(server)s" + +#~ msgid "Count Changesets" +#~ msgstr "Conta insiemi di modifiche" + +#~ msgid "Count Pending Changeset Changes" +#~ msgstr "Conteggio modifiche dell'insieme di modifiche in attesa" + +#~ msgid "Count Pending Changesets" +#~ msgstr "Conteggio insieme di modifiche in attesa" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" + +#~ msgid "The number of pending changes of this record" +#~ msgstr "Numero di modifiche di questo record in attesa" + +#~ msgid "The number of pending changesets of this record" +#~ msgstr "Numero di insiemi di modifiche in attesa di questo record" + +#~ msgid "The overall number of changesets of this record" +#~ msgstr "Numero totale di insiemi di modifiche di questo record" + +#~ msgid "User Can See Changeset" +#~ msgstr "L'utente può vedere l'insieme delle modifiche" diff --git a/fetchmail_attach_from_folder/i18n/pt_BR.po b/fetchmail_attach_from_folder/i18n/pt_BR.po index 334d4326b54..93a846de7e7 100644 --- a/fetchmail_attach_from_folder/i18n/pt_BR.po +++ b/fetchmail_attach_from_folder/i18n/pt_BR.po @@ -10,8 +10,8 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-09-29 11:14+0000\n" "PO-Revision-Date: 2024-05-29 16:35+0000\n" -"Last-Translator: Rodrigo Macedo \n" +"Last-Translator: Rodrigo Macedo " +"\n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/oca/OCA-server-" "tools-8-0/language/pt_BR/)\n" "Language: pt_BR\n" @@ -47,7 +47,7 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/wizard/attach_mail_manually.py:0 -#, fuzzy, python-format +#, fuzzy msgid "Attach emails manually" msgstr "Anexar mail manualmente" @@ -89,22 +89,6 @@ msgstr "" msgid "Cancel" msgstr "Cancelar" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_change_ids -msgid "Changeset Changes" -msgstr "Mudanças no conjunto de alterações" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_ids -msgid "Changesets" -msgstr "Conjunto de alterações" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__folders_only msgid "" @@ -115,7 +99,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Confirm connection first." msgstr "" @@ -127,55 +110,28 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not create archive folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format -msgid "Could not fetch %(msgid)s in folder %(folder)s on server %(server)s" +msgid "" +"Could not fetch %(message_uid)s in folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not open folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not search folder %(folder)s on server %(server)s" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "Count Changesets" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "Count Pending Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "Count Pending Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__object_id msgid "Create a New Record" @@ -339,18 +295,9 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Invalid folder %s!" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder____last_update -#, fuzzy -msgid "Last Modified on" -msgstr "Última atualização em" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__write_uid #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__write_uid @@ -371,7 +318,7 @@ msgid "Match Algorithm" msgstr "" #. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__msgid +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__message_uid msgid "Message id" msgstr "Identificação da mensagem" @@ -470,6 +417,11 @@ msgstr "Servidor" msgid "Server Type" msgstr "" +#. module: fetchmail_attach_from_folder +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__x_server_type_env_default +msgid "Server Type Env Default" +msgstr "" + #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__smart_search #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__smart_search @@ -518,38 +470,14 @@ msgstr "" msgid "The model to attach emails to" msgstr "O modelo para anexar emails ao" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "The number of pending changes of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "The number of pending changesets of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "The overall number of changesets of this record" -msgstr "O número total de conjuntos de alterações deste registro" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__path msgid "" -"The path to your mail folder. Typically would be something like 'INBOX." -"myfolder'" +"The path to your mail folder. Typically would be something like " +"'INBOX.myfolder'" msgstr "" -"O caminho para sua pasta de mail. Tipicamente seria alguma coisa como 'INBOX." -"myfolder'" +"O caminho para sua pasta de mail. Tipicamente seria alguma coisa como " +"'INBOX.myfolder'" #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__archive_path @@ -565,7 +493,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Unable to retrieve folders." msgstr "" @@ -574,14 +501,6 @@ msgstr "" msgid "Use 1st match" msgstr "Use a 1a combinação" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__user_can_see_changeset -msgid "User Can See Changeset" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__wizard_id msgid "Wizard" @@ -612,6 +531,19 @@ msgstr "ou" msgid "to,from" msgstr "para,de" +#~ msgid "Changeset Changes" +#~ msgstr "Mudanças no conjunto de alterações" + +#~ msgid "Changesets" +#~ msgstr "Conjunto de alterações" + +#, fuzzy +#~ msgid "Last Modified on" +#~ msgstr "Última atualização em" + +#~ msgid "The overall number of changesets of this record" +#~ msgstr "O número total de conjuntos de alterações deste registro" + #~ msgid "Flag nonmatching" #~ msgstr "Sinal sem correspondente" diff --git a/fetchmail_attach_from_folder/i18n/ru.po b/fetchmail_attach_from_folder/i18n/ru.po index 2474b5bd1ef..2c31bbf6716 100644 --- a/fetchmail_attach_from_folder/i18n/ru.po +++ b/fetchmail_attach_from_folder/i18n/ru.po @@ -46,7 +46,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/wizard/attach_mail_manually.py:0 -#, python-format msgid "Attach emails manually" msgstr "" @@ -88,22 +87,6 @@ msgstr "" msgid "Cancel" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_change_ids -msgid "Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_ids -msgid "Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__folders_only msgid "" @@ -114,7 +97,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Confirm connection first." msgstr "" @@ -126,55 +108,28 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not create archive folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format -msgid "Could not fetch %(msgid)s in folder %(folder)s on server %(server)s" +msgid "" +"Could not fetch %(message_uid)s in folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not open folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not search folder %(folder)s on server %(server)s" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "Count Changesets" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "Count Pending Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "Count Pending Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__object_id msgid "Create a New Record" @@ -334,17 +289,9 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Invalid folder %s!" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder____last_update -msgid "Last Modified on" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__write_uid #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__write_uid @@ -365,7 +312,7 @@ msgid "Match Algorithm" msgstr "" #. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__msgid +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__message_uid msgid "Message id" msgstr "" @@ -464,6 +411,11 @@ msgstr "" msgid "Server Type" msgstr "" +#. module: fetchmail_attach_from_folder +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__x_server_type_env_default +msgid "Server Type Env Default" +msgstr "" + #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__smart_search #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__smart_search @@ -512,35 +464,11 @@ msgstr "" msgid "The model to attach emails to" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "The number of pending changes of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "The number of pending changesets of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "The overall number of changesets of this record" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__path msgid "" -"The path to your mail folder. Typically would be something like 'INBOX." -"myfolder'" +"The path to your mail folder. Typically would be something like " +"'INBOX.myfolder'" msgstr "" #. module: fetchmail_attach_from_folder @@ -556,7 +484,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Unable to retrieve folders." msgstr "" @@ -565,14 +492,6 @@ msgstr "" msgid "Use 1st match" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__user_can_see_changeset -msgid "User Can See Changeset" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__wizard_id msgid "Wizard" diff --git a/fetchmail_attach_from_folder/i18n/sl.po b/fetchmail_attach_from_folder/i18n/sl.po index 313221cedba..31f78f4263c 100644 --- a/fetchmail_attach_from_folder/i18n/sl.po +++ b/fetchmail_attach_from_folder/i18n/sl.po @@ -46,7 +46,7 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/wizard/attach_mail_manually.py:0 -#, fuzzy, python-format +#, fuzzy msgid "Attach emails manually" msgstr "Ročno pripenjanje e-pošte" @@ -88,22 +88,6 @@ msgstr "" msgid "Cancel" msgstr "Preklic" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_change_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_change_ids -msgid "Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__changeset_ids -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__changeset_ids -msgid "Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__folders_only msgid "" @@ -114,7 +98,6 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Confirm connection first." msgstr "" @@ -126,55 +109,28 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not create archive folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format -msgid "Could not fetch %(msgid)s in folder %(folder)s on server %(server)s" +msgid "" +"Could not fetch %(message_uid)s in folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not open folder %(folder)s on server %(server)s" msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Could not search folder %(folder)s on server %(server)s" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "Count Changesets" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "Count Pending Changeset Changes" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "Count Pending Changesets" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__object_id msgid "Create a New Record" @@ -340,18 +296,9 @@ msgstr "" #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server_folder.py:0 -#, python-format msgid "Invalid folder %s!" msgstr "" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail____last_update -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder____last_update -#, fuzzy -msgid "Last Modified on" -msgstr "Zadnjič posodobljeno" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__write_uid #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__write_uid @@ -372,7 +319,7 @@ msgid "Match Algorithm" msgstr "" #. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__msgid +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__message_uid msgid "Message id" msgstr "ID sporočila" @@ -471,6 +418,11 @@ msgstr "Strežnik" msgid "Server Type" msgstr "" +#. module: fetchmail_attach_from_folder +#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__x_server_type_env_default +msgid "Server Type Env Default" +msgstr "" + #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__smart_search #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__smart_search @@ -526,35 +478,11 @@ msgstr "" msgid "The model to attach emails to" msgstr "Model, ki mu pripenjamo e-pošto" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changeset_changes -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changeset_changes -msgid "The number of pending changes of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_pending_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_pending_changesets -msgid "The number of pending changesets of this record" -msgstr "" - -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server__count_changesets -#: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__count_changesets -msgid "The overall number of changesets of this record" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,help:fetchmail_attach_from_folder.field_fetchmail_server_folder__path msgid "" -"The path to your mail folder. Typically would be something like 'INBOX." -"myfolder'" +"The path to your mail folder. Typically would be something like " +"'INBOX.myfolder'" msgstr "Pot do e-poštne mape. Običajno je to nekaj kot 'INBOX.mojamapa'" #. module: fetchmail_attach_from_folder @@ -570,7 +498,6 @@ msgstr "Stanje, ki se dodeli sporočilom prenesenim iz te mape." #. module: fetchmail_attach_from_folder #. odoo-python #: code:addons/fetchmail_attach_from_folder/models/fetchmail_server.py:0 -#, python-format msgid "Unable to retrieve folders." msgstr "" @@ -579,14 +506,6 @@ msgstr "" msgid "Use 1st match" msgstr "Uporabi 1. ujemanje" -#. module: fetchmail_attach_from_folder -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server__user_can_see_changeset -#: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_server_folder__user_can_see_changeset -msgid "User Can See Changeset" -msgstr "" - #. module: fetchmail_attach_from_folder #: model:ir.model.fields,field_description:fetchmail_attach_from_folder.field_fetchmail_attach_mail_manually_mail__wizard_id msgid "Wizard" @@ -617,6 +536,10 @@ msgstr "ali" msgid "to,from" msgstr "to,from" +#, fuzzy +#~ msgid "Last Modified on" +#~ msgstr "Zadnjič posodobljeno" + #~ msgid "Flag nonmatching" #~ msgstr "Označi ne ujemajoča" diff --git a/fetchmail_attach_from_folder/models/fetchmail_server.py b/fetchmail_attach_from_folder/models/fetchmail_server.py index 7df4ba7a3e3..a42f8c35644 100644 --- a/fetchmail_attach_from_folder/models/fetchmail_server.py +++ b/fetchmail_attach_from_folder/models/fetchmail_server.py @@ -4,6 +4,7 @@ import re from odoo import _, api, fields, models +from odoo.exceptions import UserError _logger = logging.getLogger(__name__) @@ -30,7 +31,11 @@ def parse_list_response(line): if this.state != "done": this.folders_available = _("Confirm connection first.") continue - connection = this.connect() + try: + connection = this.connect() + except UserError: + this.folders_available = _("Confirm connection first.") + continue list_result = connection.list() if list_result[0] != "OK": this.folders_available = _("Unable to retrieve folders.") diff --git a/fetchmail_attach_from_folder/models/fetchmail_server_folder.py b/fetchmail_attach_from_folder/models/fetchmail_server_folder.py index 072a709396a..eb173d757f3 100644 --- a/fetchmail_attach_from_folder/models/fetchmail_server_folder.py +++ b/fetchmail_attach_from_folder/models/fetchmail_server_folder.py @@ -180,22 +180,26 @@ def get_criteria(self): def retrieve_imap_folder(self, connection): """Retrieve all mails for one IMAP folder.""" self.ensure_one() - msgids = self.get_msgids(connection, self.get_criteria()) - for msgid in msgids[0].split(): + message_uids = self.get_message_uids(connection, self.get_criteria()) + for message_uid in message_uids[0].split(): # We will accept exceptions for single messages try: self.env.cr.execute("savepoint apply_matching") - self.apply_matching(connection, msgid) + self.apply_matching(connection, message_uid) self.env.cr.execute("release savepoint apply_matching") except Exception: self.env.cr.execute("rollback to savepoint apply_matching") _logger.exception( - "Failed to fetch mail %(msgid)s from server %(server)s", - {"msgid": msgid, "server": self.server_id.name}, + "Failed to fetch mail %(message_uid)s from server %(server)s", + {"message_uid": message_uid, "server": self.server_id.name}, ) - def get_msgids(self, connection, criteria): + def get_message_uids(self, connection, criteria): """Return imap ids of messages to process""" + # Note that these message_uids are linked to the folder on + # the imap server. They have nothing at all todo with the + # message_id field that is part of the message itself, and the + # two should not be confused. self.ensure_one() server = self.server_id _logger.info( @@ -207,7 +211,8 @@ def get_msgids(self, connection, criteria): _("Could not open folder %(folder)s on server %(server)s") % {"folder": self.path, "server": server.name} ) - result, msgids = connection.search(None, criteria) + charset = None # Generally we do not need to set a charset. + result, message_uids = connection.uid("search", charset, criteria) if result != "OK": raise UserError( _("Could not search folder %(folder)s on server %(server)s") @@ -217,14 +222,14 @@ def get_msgids(self, connection, criteria): "finished checking for emails in folder %(folder)s on server %(server)s", {"folder": self.path, "server": server.name}, ) - return msgids + return message_uids - def apply_matching(self, connection, msgid): + def apply_matching(self, connection, message_uid): """Return id of object matched (which will be the thread_id).""" self.ensure_one() thread_id = None thread_model = self.env["mail.thread"] - message_org = self.fetch_msg(connection, msgid) + message_org = self.fetch_msg(connection, message_uid) if self.match_algorithm == "odoo_standard": thread_id = thread_model.message_process( self.model_id.model, @@ -242,9 +247,9 @@ def apply_matching(self, connection, msgid): matched = True if thread_id else False if matched: self.run_server_action(thread_id) - self.update_msg(connection, msgid, matched=matched) - if self.archive_path: - self._archive_msg(connection, msgid) + self.update_msg(connection, message_uid, matched=matched) + if self.archive_path and not self.delete_matching: + self._archive_msg(connection, message_uid) return thread_id # Can be None if no match found. def run_server_action(self, matched_object_ids): @@ -263,34 +268,38 @@ def run_server_action(self, matched_object_ids): } ).run() - def fetch_msg(self, connection, msgid): + def fetch_msg(self, connection, message_uid): """Select a single message from a folder.""" self.ensure_one() - result, msgdata = connection.fetch(msgid, "(RFC822)") + result, msgdata = connection.uid("fetch", message_uid, "(RFC822)") if result != "OK": raise UserError( - _("Could not fetch %(msgid)s in folder %(folder)s on server %(server)s") - % {"msgid": msgid, "folder": self.path, "server": self.server_id.name} + _( + "Could not fetch %(message_uid)s in folder %(folder)s" + " on server %(server)s", + message_uid=message_uid, + folder=self.path, + server=self.server_id.name, + ) ) message_org = msgdata[0][1] # rfc822 message source return message_org - def update_msg(self, connection, msgid, matched=True, flagged=False): + def update_msg(self, connection, message_uid, matched=True, flagged=False): """Update msg in imap folder depending on match and settings.""" if matched: if self.delete_matching: - connection.store(msgid, "+FLAGS", "\\DELETED") + connection.uid("store", message_uid, "+FLAGS", "\\DELETED") elif flagged and self.flag_nonmatching: - connection.store(msgid, "-FLAGS", "\\FLAGGED") + connection.uid("store", message_uid, "-FLAGS", "\\FLAGGED") else: if self.flag_nonmatching: - connection.store(msgid, "+FLAGS", "\\FLAGGED") + connection.uid("store", message_uid, "+FLAGS", "\\FLAGGED") - def _archive_msg(self, connection, msgid): + def _archive_msg(self, connection, message_uid): """Archive message. Folder should already have been created.""" - self.ensure_one() - connection.copy(msgid, self.archive_path) - connection.store(msgid, "+FLAGS", "\\Deleted") + connection.uid("copy", message_uid, self.archive_path) + connection.uid("store", message_uid, "+FLAGS", "\\Deleted") connection.expunge() @api.model @@ -331,10 +340,11 @@ def _find_match(self, message_dict): matches = matcher.search_matches(self, message_dict) if not matches: _logger.info( - "No match found for message %(subject)s with msgid %(msgid)s", + "No match found for message %(subject)s" + " with message_uid %(message_uid)s", { "subject": message_dict.get("subject", "no subject"), - "msgid": message_dict.get("message_id", "no msgid"), + "message_uid": message_dict.get("message_id", "no message_uid"), }, ) return None diff --git a/fetchmail_attach_from_folder/static/description/index.html b/fetchmail_attach_from_folder/static/description/index.html index 0c8dc0c3110..5066fe23a49 100644 --- a/fetchmail_attach_from_folder/static/description/index.html +++ b/fetchmail_attach_from_folder/static/description/index.html @@ -372,7 +372,7 @@

Email gateway - folders

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:e4c93058a6151bbc67ceadf75cf0fee376e22dbd28e548bc91887592979779de +!! source digest: sha256:ab65e43855bfb568a640043322dc68354fa2d392958a160fb7b4b14d4c5ed9c0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

Adds the possibility to attach emails from a certain IMAP folder to diff --git a/fetchmail_attach_from_folder/tests/test_match_algorithms.py b/fetchmail_attach_from_folder/tests/test_match_algorithms.py index 394e7fb2ebb..2666a10ecf9 100644 --- a/fetchmail_attach_from_folder/tests/test_match_algorithms.py +++ b/fetchmail_attach_from_folder/tests/test_match_algorithms.py @@ -1,5 +1,6 @@ # Copyright - 2015-2018 Therp BV . # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# pylint: disable=method-required-super from unittest.mock import MagicMock, patch from odoo.tests.common import TransactionCase @@ -39,21 +40,38 @@ class MockConnection: def select(self, path=None): return ("OK",) - def store(self, msgid, msg_item, value): + def create(self, path): + """Mock creating a folder.""" + return ("OK",) + + def store(self, message_uid, msg_item, value): """Mock store command.""" return "OK" - def fetch(self, msgid, parts): + def copy(self, message_uid, folder_path): + """Mock copy command.""" + return "OK" + + def fetch(self, message_uid, parts): """Return RFC822 formatted message.""" return ("OK", MSG_BODY) def search(self, charset, criteria): - """Return some msgid's.""" + """Return some message uid's.""" return ("OK", ["123 456"]) def close(self): pass + def expunge(self): + """Mock an IMAP4.expunge action""" + return ("OK", None) + + def uid(self, command, *args): + """Return from the appropiate mocked method.""" + method = getattr(self, command) + return method(*args) + class TestMatchAlgorithms(TransactionCase): @classmethod @@ -144,8 +162,8 @@ def test_apply_matching_exact(self): folder = self.folder folder.match_algorithm = "email_exact" connection = MockConnection() - msgid = "<485a8041-d560-a981-5afc-d31c1f136748@acme.com>" - folder.apply_matching(connection, msgid) + message_uid = "<485a8041-d560-a981-5afc-d31c1f136748@acme.com>" + folder.apply_matching(connection, message_uid) def test_retrieve_imap_folder_domain(self): folder = self.folder @@ -153,6 +171,12 @@ def test_retrieve_imap_folder_domain(self): connection = MockConnection() folder.retrieve_imap_folder(connection) + def test_archive_messages(self): + folder = self.folder + folder.archive_path = "archived_messages" + connection = MockConnection() + folder.retrieve_imap_folder(connection) + def test_non_action(self): connection = MockConnection() self.folder.action_id = False @@ -227,6 +251,7 @@ def _mock_connection(self): mock_conn = MagicMock() mock_conn.select.return_value = ("OK",) mock_conn.search.return_value = ("OK", [b"1"]) + mock_conn.uid.return_value = ("OK", [b"1"]) mock_conn.fetch.return_value = ( "OK", [(b"1 (RFC822 {123}", b"Mocked raw email content")], @@ -237,7 +262,7 @@ def _mock_connection(self): ) return mock_conn - def _mock_fetch_msg(self, connection, msgid): + def _mock_fetch_msg(self, connection, message_uid): """Return a tuple like the real fetch_msg: (dict, bytes)""" mail_message = { "subject": "Test", @@ -258,7 +283,9 @@ def test_default_get_populates_mail_ids(self, mock_connect): patch.object( self.folder.__class__, "fetch_msg", side_effect=self._mock_fetch_msg ), - patch.object(self.folder.__class__, "get_msgids", return_value=[b"1"]), + patch.object( + self.folder.__class__, "get_message_uids", return_value=[b"1"] + ), patch.object(self.folder.__class__, "get_criteria", return_value="ALL"), ): wizard = self.Wizard.with_context(folder_id=self.folder.id).create({}) @@ -273,7 +300,7 @@ def test_attach_mails_only_with_object_id(self, mock_connect): with patch.object( self.folder.__class__, "fetch_msg", - side_effect=lambda conn, msgid: ( + side_effect=lambda conn, message_uid: ( { "subject": "With Object", "date": "2025-07-23", @@ -291,7 +318,7 @@ def test_attach_mails_only_with_object_id(self, mock_connect): 0, 0, { - "msgid": "1", + "message_uid": "1", "subject": "No Object", "object_id": False, }, @@ -300,7 +327,7 @@ def test_attach_mails_only_with_object_id(self, mock_connect): 0, 0, { - "msgid": "2", + "message_uid": "2", "subject": "With Object", "object_id": f"res.partner,{self.partner.id}", }, @@ -318,7 +345,7 @@ def test_attach_mails_only_with_object_id(self, mock_connect): def test_prepare_mail_returns_expected_dict(self): """Test _prepare_mail returns correct structure.""" folder = self.folder - msgid = "123" + message_uid = "123" mail_message = { "subject": "Test", "date": "2025-07-23", @@ -326,9 +353,9 @@ def test_prepare_mail_returns_expected_dict(self): "body": "

Body

", } - result = self.Wizard._prepare_mail(folder, msgid, mail_message) + result = self.Wizard._prepare_mail(folder, message_uid, mail_message) expected = { - "msgid": "123", + "message_uid": "123", "subject": "Test", "date": "2025-07-23", "body": "

Body

", @@ -342,7 +369,9 @@ def test_wizard_name_is_translated(self): with ( patch.object(FetchmailServer, "connect", return_value=MagicMock()), patch.object(self.folder.__class__, "fetch_msg", return_value=({}, b"raw")), - patch.object(self.folder.__class__, "get_msgids", return_value=[b"1"]), + patch.object( + self.folder.__class__, "get_message_uids", return_value=[b"1"] + ), patch.object(self.folder.__class__, "get_criteria", return_value="ALL"), ): wizard = self.Wizard.with_context(folder_id=self.folder.id).create({}) diff --git a/fetchmail_attach_from_folder/wizard/attach_mail_manually.py b/fetchmail_attach_from_folder/wizard/attach_mail_manually.py index 7eaffadaad5..5d1355a922a 100644 --- a/fetchmail_attach_from_folder/wizard/attach_mail_manually.py +++ b/fetchmail_attach_from_folder/wizard/attach_mail_manually.py @@ -20,9 +20,9 @@ class AttachMailManually(models.TransientModel): ) @api.model - def _prepare_mail(self, folder, msgid, mail_message): + def _prepare_mail(self, folder, message_uid, mail_message): return { - "msgid": msgid, + "message_uid": message_uid, "subject": mail_message.get("subject", ""), "date": mail_message.get("date") or False, "body": mail_message.get("body", ""), @@ -43,11 +43,11 @@ def default_get(self, fields_list): connection = folder.server_id.connect() connection.select(folder.path) criteria = "FLAGGED" if folder.flag_nonmatching else folder.get_criteria() - msgids = folder.get_msgids(connection, criteria) - for msgid in msgids[0].split(): - mail_message, message_org = folder.fetch_msg(connection, msgid) + message_uids = folder.get_message_uids(connection, criteria) + for message_uid in message_uids[0].split(): + mail_message, message_org = folder.fetch_msg(connection, message_uid) defaults["mail_ids"].append( - (0, 0, self._prepare_mail(folder, msgid, mail_message)) + (0, 0, self._prepare_mail(folder, message_uid, mail_message)) ) connection.close() return defaults @@ -61,11 +61,11 @@ def attach_mails(self): for mail in self.mail_ids: if not mail.object_id: continue - msgid = mail.msgid - mail_message, message_org = folder.fetch_msg(connection, msgid) + message_uid = mail.message_uid + mail_message, message_org = folder.fetch_msg(connection, message_uid) folder.attach_mail(mail.object_id, mail_message) folder.update_msg( - connection, msgid, matched=True, flagged=folder.flag_nonmatching + connection, message_uid, matched=True, flagged=folder.flag_nonmatching ) connection.close() return {"type": "ir.actions.act_window_close"} @@ -97,7 +97,7 @@ class AttachMailManuallyMail(models.TransientModel): _description = __doc__ wizard_id = fields.Many2one("fetchmail.attach.mail.manually", readonly=True) - msgid = fields.Char("Message id", readonly=True) + message_uid = fields.Char("Message id", readonly=True) subject = fields.Char(readonly=True) date = fields.Datetime(readonly=True) email_from = fields.Char("From", readonly=True) diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst new file mode 100644 index 00000000000..9c7913840b0 --- /dev/null +++ b/odoo_test_xmlrunner/README.rst @@ -0,0 +1,209 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +====================== +Unittest xUnit reports +====================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:43d1f3fd22d63205a1755865145c5af7d858b24ac2c1683e7dfd8e791535373f + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/18.0/odoo_test_xmlrunner + :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-18-0/server-tools-18-0-odoo_test_xmlrunner + :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=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module generate unittest reports using unittest-xml-reporting tool. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +Install python library https://pypi.org/project/unittest-xml-reporting/ + +The module is automatically installed on the Odoo instance. + +Usage +===== + +Run the native Odoo tests +------------------------- + +Run the native Odoo tests. See the `Odoo +documentation `__ +for more information. + +Gitlab CI usage example +~~~~~~~~~~~~~~~~~~~~~~~ + +Add the following job to your ``.gitlab-ci.yml`` file: + +.. code:: yaml + + + stages: + - test + + variables: + POSTGRES_DB: odoo + POSTGRES_USER: odoo + POSTGRES_PASSWORD: odoo + POSTGRES_HOST_AUTH_METHOD: trust + + test: + stage: test + image: + name: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest + services: + - name: postgres:15 + tags: + - gitlab-org-docker + script: + # install odoo and run tests + - oca_install_addons && oca_init_test_database && oca_run_tests + # generate coverage report + - coverage html -d htmlcov && coverage xml -o coverage.xml + # read line-rate from coverage.xml and print it as percentage + - total=$(grep -oP ']*line-rate="\K[0-9.]+' coverage.xml | head -n 1 | awk '{print $1 * 100}') && echo "total ${total}%" + coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/' + artifacts: + paths: + - htmlcov/* + when: always + reports: + junit: test_results/*.xml + coverage_report: + coverage_format: cobertura + path: coverage.xml + +Github Actions usage example +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Add the following job to your ``.github/workflows/main.yml`` file: + +.. code:: yaml + + name: tests + + permissions: + contents: read + checks: write + id-token: write + + on: + push: + branches: ["main"] + tags: ["*"] + pull_request: + + jobs: + test: + runs-on: ubuntu-22.04 + container: ${{ matrix.container }} + name: ${{ matrix.name }} + strategy: + fail-fast: false + matrix: + include: + - container: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest + name: test with Odoo + services: + postgres: + image: postgres:12.0 + env: + POSTGRES_USER: odoo + POSTGRES_PASSWORD: odoo + POSTGRES_DB: odoo + ports: + - 5432:5432 + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + - name: Install addons and dependencies + run: oca_install_addons + - name: Check licenses + run: manifestoo -d . check-licenses + - name: Check development status + run: manifestoo -d . check-dev-status --default-dev-status=Beta + - name: Initialize test db + run: oca_init_test_database + - name: Run tests + run: oca_run_tests + - uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + - name: Publish Test Report + uses: mikepenz/action-junit-report@v4 + if: success() || failure() # always run even if the previous step fails + with: + report_paths: 'test_results/*.xml' + +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 +------- + +* Smile + +Other credits +------------- + +- `Smile `__: + + - Martin Deconinck martin.deconinck@smile.fr + +- `Akretion `__: + + - Florian Mounier florian.mounier@akretion.com + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +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/odoo_test_xmlrunner/__init__.py b/odoo_test_xmlrunner/__init__.py new file mode 100644 index 00000000000..382130c7586 --- /dev/null +++ b/odoo_test_xmlrunner/__init__.py @@ -0,0 +1 @@ +from . import odoo_tests # F401 imported but unused diff --git a/odoo_test_xmlrunner/__manifest__.py b/odoo_test_xmlrunner/__manifest__.py new file mode 100644 index 00000000000..395b79fc803 --- /dev/null +++ b/odoo_test_xmlrunner/__manifest__.py @@ -0,0 +1,18 @@ +{ + "name": "Unittest xUnit reports", + "version": "18.0.1.0.0", + "depends": ["base"], + "author": "Smile, Odoo Community Association (OCA)", + "license": "AGPL-3", + "summary": """ + This module override Odoo testing method to run them with xmlrunner tool. + """, + "website": "https://github.com/OCA/server-tools", + "category": "Tools", + "sequence": 20, + "installable": True, + "application": False, + "external_dependencies": { + "python": ["unittest-xml-reporting"], + }, +} diff --git a/odoo_test_xmlrunner/i18n/it.po b/odoo_test_xmlrunner/i18n/it.po new file mode 100644 index 00000000000..73388557f6d --- /dev/null +++ b/odoo_test_xmlrunner/i18n/it.po @@ -0,0 +1,14 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" diff --git a/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot b/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot new file mode 100644 index 00000000000..aadee09bfed --- /dev/null +++ b/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot @@ -0,0 +1,13 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +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" diff --git a/odoo_test_xmlrunner/odoo_tests/__init__.py b/odoo_test_xmlrunner/odoo_tests/__init__.py new file mode 100644 index 00000000000..571c37ecce6 --- /dev/null +++ b/odoo_test_xmlrunner/odoo_tests/__init__.py @@ -0,0 +1 @@ +from . import loader # F401 imported but unused diff --git a/odoo_test_xmlrunner/odoo_tests/loader.py b/odoo_test_xmlrunner/odoo_tests/loader.py new file mode 100644 index 00000000000..5ce61cc4e23 --- /dev/null +++ b/odoo_test_xmlrunner/odoo_tests/loader.py @@ -0,0 +1,51 @@ +import os + +from odoo.tools import config + +if config["test_enable"]: + from xmlrunner import XMLTestRunner + from xmlrunner.result import _XMLTestResult + + from odoo.tests.result import OdooTestResult + from odoo.tests.suite import OdooSuite + + unpatched_run = OdooSuite.run + + def run(self, result): + # Override : Get and create a config dir + test_result_directory = config.get("test_result_directory", "test_results") + # create test result directory if not exists + if not os.path.exists(test_result_directory): + os.makedirs(test_result_directory) + + # Suite run method will be called by the XMLTestRunner, + # so we need to run the original run method + unpatched_sub_run = self.run + self.run = lambda result, debug=False: unpatched_run(self, result, debug) + # Override : XMLTestRunner to run the tests and generate XML reports + try: + results = XMLTestRunner( + output=test_result_directory, + verbosity=2, + ).run(self) + finally: + self.run = unpatched_sub_run + + result.update(results) + return result + + OdooSuite.run = run + + unpatched_update = OdooTestResult.update + + def update(self, other): + # Adapt _XMLTestResult to OdooTestResult + if isinstance(other, _XMLTestResult): + self.failures_count += len(other.failures) + self.errors_count += len(other.errors) + self.skipped += len(other.skipped) + self.testsRun += other.testsRun + else: + unpatched_update(self, other) + + OdooTestResult.update = update diff --git a/odoo_test_xmlrunner/pyproject.toml b/odoo_test_xmlrunner/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/odoo_test_xmlrunner/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/odoo_test_xmlrunner/readme/CONFIGURATION.md b/odoo_test_xmlrunner/readme/CONFIGURATION.md new file mode 100644 index 00000000000..ebd8c0c3852 --- /dev/null +++ b/odoo_test_xmlrunner/readme/CONFIGURATION.md @@ -0,0 +1,2 @@ +Add to your odoo Configuration file: +- **test_result_directory** (default: *test_results*) : The path (created if not exists) where the reports will be written to. diff --git a/odoo_test_xmlrunner/readme/CREDITS.md b/odoo_test_xmlrunner/readme/CREDITS.md new file mode 100644 index 00000000000..25c6a27a7d8 --- /dev/null +++ b/odoo_test_xmlrunner/readme/CREDITS.md @@ -0,0 +1,4 @@ +- [Smile](https://smile.eu/fr): + - Martin Deconinck +- [Akretion](https://akretion.com): + - Florian Mounier diff --git a/odoo_test_xmlrunner/readme/DESCRIPTION.md b/odoo_test_xmlrunner/readme/DESCRIPTION.md new file mode 100644 index 00000000000..a6e2fc9ef35 --- /dev/null +++ b/odoo_test_xmlrunner/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module generate unittest reports using unittest-xml-reporting tool. diff --git a/odoo_test_xmlrunner/readme/INSTALL.md b/odoo_test_xmlrunner/readme/INSTALL.md new file mode 100644 index 00000000000..bd127a850b9 --- /dev/null +++ b/odoo_test_xmlrunner/readme/INSTALL.md @@ -0,0 +1,3 @@ +Install python library https://pypi.org/project/unittest-xml-reporting/ + +The module is automatically installed on the Odoo instance. diff --git a/odoo_test_xmlrunner/readme/USAGE.md b/odoo_test_xmlrunner/readme/USAGE.md new file mode 100644 index 00000000000..6e22e01c08a --- /dev/null +++ b/odoo_test_xmlrunner/readme/USAGE.md @@ -0,0 +1,108 @@ + +## Run the native Odoo tests + +Run the native Odoo tests. See the [Odoo documentation](https://www.odoo.com/documentation/17.0/fr/developer/reference/backend/testing.html) for more information. + +### Gitlab CI usage example + +Add the following job to your `.gitlab-ci.yml` file: + +```yaml + +stages: + - test + +variables: + POSTGRES_DB: odoo + POSTGRES_USER: odoo + POSTGRES_PASSWORD: odoo + POSTGRES_HOST_AUTH_METHOD: trust + +test: + stage: test + image: + name: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest + services: + - name: postgres:15 + tags: + - gitlab-org-docker + script: + # install odoo and run tests + - oca_install_addons && oca_init_test_database && oca_run_tests + # generate coverage report + - coverage html -d htmlcov && coverage xml -o coverage.xml + # read line-rate from coverage.xml and print it as percentage + - total=$(grep -oP ']*line-rate="\K[0-9.]+' coverage.xml | head -n 1 | awk '{print $1 * 100}') && echo "total ${total}%" + coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/' + artifacts: + paths: + - htmlcov/* + when: always + reports: + junit: test_results/*.xml + coverage_report: + coverage_format: cobertura + path: coverage.xml +``` +### Github Actions usage example + +Add the following job to your `.github/workflows/main.yml` file: + +```yaml +name: tests + +permissions: + contents: read + checks: write + id-token: write + +on: + push: + branches: ["main"] + tags: ["*"] + pull_request: + +jobs: + test: + runs-on: ubuntu-22.04 + container: ${{ matrix.container }} + name: ${{ matrix.name }} + strategy: + fail-fast: false + matrix: + include: + - container: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest + name: test with Odoo + services: + postgres: + image: postgres:12.0 + env: + POSTGRES_USER: odoo + POSTGRES_PASSWORD: odoo + POSTGRES_DB: odoo + ports: + - 5432:5432 + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + - name: Install addons and dependencies + run: oca_install_addons + - name: Check licenses + run: manifestoo -d . check-licenses + - name: Check development status + run: manifestoo -d . check-dev-status --default-dev-status=Beta + - name: Initialize test db + run: oca_init_test_database + - name: Run tests + run: oca_run_tests + - uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + - name: Publish Test Report + uses: mikepenz/action-junit-report@v4 + if: success() || failure() # always run even if the previous step fails + with: + report_paths: 'test_results/*.xml' + +``` diff --git a/odoo_test_xmlrunner/requirements.txt b/odoo_test_xmlrunner/requirements.txt new file mode 100644 index 00000000000..718199204e9 --- /dev/null +++ b/odoo_test_xmlrunner/requirements.txt @@ -0,0 +1 @@ +unittest-xml-reporting diff --git a/odoo_test_xmlrunner/static/description/icon.png b/odoo_test_xmlrunner/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/odoo_test_xmlrunner/static/description/icon.png differ diff --git a/odoo_test_xmlrunner/static/description/index.html b/odoo_test_xmlrunner/static/description/index.html new file mode 100644 index 00000000000..e71f15fb742 --- /dev/null +++ b/odoo_test_xmlrunner/static/description/index.html @@ -0,0 +1,560 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Unittest xUnit reports

+ +

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

+

This module generate unittest reports using unittest-xml-reporting tool.

+

Table of contents

+ +
+

Installation

+

Install python library https://pypi.org/project/unittest-xml-reporting/

+

The module is automatically installed on the Odoo instance.

+
+
+

Usage

+
+

Run the native Odoo tests

+

Run the native Odoo tests. See the Odoo +documentation +for more information.

+
+

Gitlab CI usage example

+

Add the following job to your .gitlab-ci.yml file:

+
+stages:
+  - test
+
+variables:
+  POSTGRES_DB: odoo
+  POSTGRES_USER: odoo
+  POSTGRES_PASSWORD: odoo
+  POSTGRES_HOST_AUTH_METHOD: trust
+
+test:
+  stage: test
+  image:
+    name: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest
+  services:
+    - name: postgres:15
+  tags:
+    - gitlab-org-docker
+  script:
+    # install odoo and run tests
+    - oca_install_addons && oca_init_test_database && oca_run_tests
+    # generate coverage report
+    - coverage html -d htmlcov && coverage xml -o coverage.xml
+    # read line-rate from coverage.xml and print it as percentage
+    - total=$(grep -oP '<coverage[^>]*line-rate="\K[0-9.]+' coverage.xml | head -n 1 | awk '{print $1 * 100}') && echo "total ${total}%"
+  coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
+  artifacts:
+    paths:
+      - htmlcov/*
+    when: always
+    reports:
+      junit: test_results/*.xml
+      coverage_report:
+          coverage_format: cobertura
+          path: coverage.xml
+
+
+
+

Github Actions usage example

+

Add the following job to your .github/workflows/main.yml file:

+
+name: tests
+
+permissions:
+    contents: read
+    checks: write
+    id-token: write
+
+on:
+  push:
+    branches: ["main"]
+    tags: ["*"]
+  pull_request:
+
+jobs:
+  test:
+    runs-on: ubuntu-22.04
+    container: ${{ matrix.container }}
+    name: ${{ matrix.name }}
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+          - container: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest
+            name: test with Odoo
+    services:
+      postgres:
+        image: postgres:12.0
+        env:
+          POSTGRES_USER: odoo
+          POSTGRES_PASSWORD: odoo
+          POSTGRES_DB: odoo
+        ports:
+          - 5432:5432
+    steps:
+      - uses: actions/checkout@v3
+        with:
+          persist-credentials: false
+      - name: Install addons and dependencies
+        run: oca_install_addons
+      - name: Check licenses
+        run: manifestoo -d . check-licenses
+      - name: Check development status
+        run: manifestoo -d . check-dev-status --default-dev-status=Beta
+      - name: Initialize test db
+        run: oca_init_test_database
+      - name: Run tests
+        run: oca_run_tests
+      - uses: codecov/codecov-action@v4
+        with:
+          token: ${{ secrets.CODECOV_TOKEN }}
+      - name: Publish Test Report
+        uses: mikepenz/action-junit-report@v4
+        if: success() || failure() # always run even if the previous step fails
+        with:
+          report_paths: 'test_results/*.xml'
+
+
+
+
+
+

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

+
    +
  • Smile
  • +
+
+
+

Other credits

+ +
+
+

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.

+

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/requirements.txt b/requirements.txt index 2ffa3961279..5d1fefa6f23 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,3 +9,4 @@ paramiko<4.0.0 pygount pysftp sentry_sdk>=2.0.0,<=2.22.0 +unittest-xml-reporting diff --git a/sequence_python/README.rst b/sequence_python/README.rst new file mode 100644 index 00000000000..820df473009 --- /dev/null +++ b/sequence_python/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 + +=============================== +Sequence from Python expression +=============================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:75b6e7f4bb5eec0f62dfee2e39357c3255133a9f7e30bce48dff133241e73d3c + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/18.0/sequence_python + :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-18-0/server-tools-18-0-sequence_python + :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=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to generate a sequence by a Python formula +expression. + +Besides common Python functions and operators, it provides several +functions like 'random' and 'uuid' in the expression, as well as +variables such as the next number in the sequence. These are also listed +next to the input field on the sequence form view. + +If you want to add more variables for use in the expression, you can +extend this module. + +Use cases for this module could be: + +- You want to generate alphanumeric numbering +- You want to apply some math to the number to prevent customers from + knowing their place in the sequence +- You want to use UUID + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +- Go to the form view of an ir.sequence record +- Go to the Python tab +- Enable the 'Use Python' checkbox +- Change the default 'number' expression to something more fancy. + +Examples: + +.. code:: python + + # To separate the Odoo-generated number with hyphens eg. 0-0-0-0-1 + '-'.join(number_padded) + + # To have an UUID as the sequence value + uuid.uuid4().hex + + # To use an 8-digit binary number + '{0:#010b}'.format(number + 300)[2:] + +And so on. + +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 +------- + +* Sunflower IT + +Contributors +------------ + +- Tom Blauwendraat +- Francesco Apruzzese +- `Heliconia Solutions Pvt. Ltd. `__ + + - Bhavesh Heliconia + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/server-tools `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sequence_python/__init__.py b/sequence_python/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/sequence_python/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sequence_python/__manifest__.py b/sequence_python/__manifest__.py new file mode 100644 index 00000000000..c60003340d1 --- /dev/null +++ b/sequence_python/__manifest__.py @@ -0,0 +1,13 @@ +# Copyright 2020 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + "name": "Sequence from Python expression", + "summary": """Calculate a sequence number from a Python expression""", + "author": "Sunflower IT,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/server-tools", + "version": "18.0.1.0.0", + "license": "AGPL-3", + "category": "Generic Modules", + "depends": ["base"], + "data": ["views/ir_sequence.xml"], +} diff --git a/sequence_python/i18n/ca.po b/sequence_python/i18n/ca.po new file mode 100644 index 00000000000..904e5b917f3 --- /dev/null +++ b/sequence_python/i18n/ca.po @@ -0,0 +1,129 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sequence_python +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "number: The next number of the sequence (integer)" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"number_padded: Padded string of the next number of the sequence" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"random: The Python random module, eg. to use " +"random.randint(0, 9)" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "sequence: Odoo record of the sequence being used" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"string: The Python string module, eg. to use " +"random.choices(string.ascii_letters + string.digits, k=4)" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"uuid: The Python uuid module, eg. to use " +"uuid.uuid4()" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "Aside from this, you may use several" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__display_name +msgid "Display Name" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "Help with Python expressions" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__id +msgid "ID" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code_preview +msgid "Preview" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "Python Code" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code +msgid "Python expression" +msgstr "" + +#. module: sequence_python +#: model:ir.model,name:sequence_python.model_ir_sequence +msgid "Sequence" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__smart_search +msgid "Smart Search" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"The expression you type here will be evaluated as the next number. The " +"following variables can be used:" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__use_python_code +msgid "Use Python" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,help:sequence_python.field_ir_sequence__python_code +msgid "Write Python code that generates the sequence body." +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "builtin Python functions" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "number" +msgstr "" diff --git a/sequence_python/i18n/es_AR.po b/sequence_python/i18n/es_AR.po new file mode 100644 index 00000000000..22bc069b2bd --- /dev/null +++ b/sequence_python/i18n/es_AR.po @@ -0,0 +1,141 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sequence_python +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-09-05 01:07+0000\n" +"Last-Translator: Ignacio Buioli \n" +"Language-Team: none\n" +"Language: es_AR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "number: The next number of the sequence (integer)" +msgstr "number: El siguiente número de la secuencia (entero)" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"number_padded: Padded string of the next number of the sequence" +msgstr "" +"number_padded: Relleno del siguiente número de la secuencia" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"random: The Python random module, eg. to use " +"random.randint(0, 9)" +msgstr "" +"random: El módulo aleatorio de Python, ej. para utilizar " +"random.randint(0, 9)" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "sequence: Odoo record of the sequence being used" +msgstr "" +"sequence: Registro Odoo de la secuencia que se está utilizando" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"string: The Python string module, eg. to use " +"random.choices(string.ascii_letters + string.digits, k=4)" +msgstr "" +"string: El módulo string de Python, ej. para utilizar " +"random.choices(string.ascii_letters + string.digits, k=4)" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"uuid: The Python uuid module, eg. to use " +"uuid.uuid4()" +msgstr "" +"uuid: El módulo uuid de Python, ej. para utilizar uuid." +"uuid4()" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "Aside from this, you may use several" +msgstr "Aparte de esto, puede utilizar varios" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "Help with Python expressions" +msgstr "Ayuda con expresiones Python" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__id +msgid "ID" +msgstr "ID" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence____last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code_preview +msgid "Preview" +msgstr "Previsualización" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "Python Code" +msgstr "Código de Python" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code +msgid "Python expression" +msgstr "Expresión de Python" + +#. module: sequence_python +#: model:ir.model,name:sequence_python.model_ir_sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__smart_search +msgid "Smart Search" +msgstr "Búsqueda Inteligente" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"The expression you type here will be evaluated as the next number. The " +"following variables can be used:" +msgstr "" +"La expresión que escriba acá se evaluará como el siguiente número. Se pueden " +"utilizar las siguientes variables:" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__use_python_code +msgid "Use Python" +msgstr "Usar Python" + +#. module: sequence_python +#: model:ir.model.fields,help:sequence_python.field_ir_sequence__python_code +msgid "Write Python code that generates the sequence body." +msgstr "Escriba el código de Python que genera el cuerpo de la secuencia." + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "builtin Python functions" +msgstr "Funciones de Python incorporadas" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "number" +msgstr "number" diff --git a/sequence_python/i18n/it.po b/sequence_python/i18n/it.po new file mode 100644 index 00000000000..b524452beb5 --- /dev/null +++ b/sequence_python/i18n/it.po @@ -0,0 +1,126 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sequence_python +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-11-13 10: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: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "number: The next number of the sequence (integer)" +msgstr "number: il numero successivo della sequenza (intero)" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"number_padded: Padded string of the next number of the sequence" +msgstr "" +"number_padded: stringa riempita del numero successivo della " +"sequenza" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"random: The Python random module, eg. to use " +"random.randint(0, 9)" +msgstr "" +"random: il modulo random Python, es. da usare random." +"randint(0, 9)" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "sequence: Odoo record of the sequence being used" +msgstr "sequence: record Odoo della sequenza in uso" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"string: The Python string module, eg. to use " +"random.choices(string.ascii_letters + string.digits, k=4)" +msgstr "" +"string: il modulo stringa Python, es.da usare random." +"choices(string.ascii_letters + string.digits, k=4)" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"uuid: The Python uuid module, eg. to use " +"uuid.uuid4()" +msgstr "" +"uuid: il modulo uuid Python da usare, es. da usare uuid." +"uuid4()" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "Aside from this, you may use several" +msgstr "Oltre a questo, si possono usare diversi" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "Help with Python expressions" +msgstr "Aiuto con espressioni Python" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code_preview +msgid "Preview" +msgstr "Anteprima" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "Python Code" +msgstr "Codice Python" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code +msgid "Python expression" +msgstr "Espressione Python" + +#. module: sequence_python +#: model:ir.model,name:sequence_python.model_ir_sequence +msgid "Sequence" +msgstr "Sequenza" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__smart_search +msgid "Smart Search" +msgstr "Ricerca intelligente" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"The expression you type here will be evaluated as the next number. The " +"following variables can be used:" +msgstr "" +"L'espressione inserita qui verrà valutata come il numero successivo. Si " +"possono usare le seguenti variabili:" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__use_python_code +msgid "Use Python" +msgstr "Usa Python" + +#. module: sequence_python +#: model:ir.model.fields,help:sequence_python.field_ir_sequence__python_code +msgid "Write Python code that generates the sequence body." +msgstr "Scrivere il codice Python che genera il corpo della sequenza." + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "builtin Python functions" +msgstr "funzioni Python incorporate" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "number" +msgstr "numero" diff --git a/sequence_python/i18n/sequence_python.pot b/sequence_python/i18n/sequence_python.pot new file mode 100644 index 00000000000..ec8af7e3e1c --- /dev/null +++ b/sequence_python/i18n/sequence_python.pot @@ -0,0 +1,113 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sequence_python +# +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: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "number: The next number of the sequence (integer)" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"number_padded: Padded string of the next number of the sequence" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"random: The Python random module, eg. to use " +"random.randint(0, 9)" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "sequence: Odoo record of the sequence being used" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"string: The Python string module, eg. to use " +"random.choices(string.ascii_letters + string.digits, k=4)" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"uuid: The Python uuid module, eg. to use " +"uuid.uuid4()" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "Aside from this, you may use several" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "Help with Python expressions" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code_preview +msgid "Preview" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "Python Code" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code +msgid "Python expression" +msgstr "" + +#. module: sequence_python +#: model:ir.model,name:sequence_python.model_ir_sequence +msgid "Sequence" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__smart_search +msgid "Smart Search" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "" +"The expression you type here will be evaluated as the next number. The " +"following variables can be used:" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__use_python_code +msgid "Use Python" +msgstr "" + +#. module: sequence_python +#: model:ir.model.fields,help:sequence_python.field_ir_sequence__python_code +msgid "Write Python code that generates the sequence body." +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "builtin Python functions" +msgstr "" + +#. module: sequence_python +#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view +msgid "number" +msgstr "" diff --git a/sequence_python/models/__init__.py b/sequence_python/models/__init__.py new file mode 100644 index 00000000000..5b015772ab2 --- /dev/null +++ b/sequence_python/models/__init__.py @@ -0,0 +1 @@ +from . import ir_sequence diff --git a/sequence_python/models/ir_sequence.py b/sequence_python/models/ir_sequence.py new file mode 100644 index 00000000000..374ebb97be8 --- /dev/null +++ b/sequence_python/models/ir_sequence.py @@ -0,0 +1,87 @@ +# Copyright 2020 Sunflower IT () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import logging +import random +import string +import uuid +from inspect import getmembers, isclass, isfunction + +from odoo import fields, models +from odoo.tools.safe_eval import safe_eval, wrap_module + +_logger = logging.getLogger(__name__) + + +DEFAULT_PYTHON_CODE = "number_padded" + + +class IrSequence(models.Model): + """ + Inherit standard ir.sequence to let the possibility of using a Python formula + to calculate the sequence from input variables such as the sequence number. + This allows obfuscation of the order in which sequences are given out, + but can also be used for any other purpose. + """ + + _inherit = "ir.sequence" + + # Python code + use_python_code = fields.Boolean(string="Use Python", default=False) + python_code = fields.Text( + string="Python expression", + default=DEFAULT_PYTHON_CODE, + help="Write Python code that generates the sequence body.", + ) + python_code_preview = fields.Char("Preview", compute="_compute_python_code_preview") + + def _get_python_eval_context(self, number_next): + """ + Get the eval context to evaluate the Python code with. + The format is (variable name, description, value) + You can inherit this in your custom module. + :return: tuple + """ + wrap_random = wrap_module(random, random.__all__) + uuid_elements = [e[0] for e in getmembers(uuid, isfunction)] + [ + e[0] for e in getmembers(uuid, isclass) + ] + wrap_uuid = wrap_module(uuid, uuid_elements) + wrap_string = wrap_module(string, string.__all__) + if isinstance(number_next, tuple): + number_next = number_next[0] + return { + "number": number_next[0] if isinstance(number_next, tuple) else number_next, + "number_padded": f"{number_next:0{self.padding}d}", + "sequence": self, + "random": wrap_random, + "uuid": wrap_uuid, + "string": wrap_string, + } + + def _get_python_value(self, number_next): + """ + Use the python formula to get the value. + :return: string + """ + eval_context = self._get_python_eval_context(number_next) + return safe_eval(self.python_code.strip(), eval_context) + + def _compute_python_code_preview(self): + for this in self: + try: + this.python_code_preview = self.get_next_char( + (self.number_next_actual,) + ) + except Exception as e: # noqa + this.python_code_preview = str(e) + + def get_next_char(self, number_next): + if self.use_python_code: + interpolated_prefix, interpolated_suffix = self._get_prefix_suffix() + return ( + interpolated_prefix + + self._get_python_value(number_next) + + interpolated_suffix + ) + else: + return super().get_next_char(number_next) diff --git a/sequence_python/pyproject.toml b/sequence_python/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/sequence_python/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/sequence_python/readme/CONTRIBUTORS.md b/sequence_python/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..3c777dad2d6 --- /dev/null +++ b/sequence_python/readme/CONTRIBUTORS.md @@ -0,0 +1,4 @@ +- Tom Blauwendraat \ +- Francesco Apruzzese \ +- [Heliconia Solutions Pvt. Ltd.](https://www.heliconia.io) + - Bhavesh Heliconia diff --git a/sequence_python/readme/DESCRIPTION.md b/sequence_python/readme/DESCRIPTION.md new file mode 100644 index 00000000000..70419b92170 --- /dev/null +++ b/sequence_python/readme/DESCRIPTION.md @@ -0,0 +1,17 @@ +This module allows to generate a sequence by a Python formula +expression. + +Besides common Python functions and operators, it provides several +functions like 'random' and 'uuid' in the expression, as well as +variables such as the next number in the sequence. These are also listed +next to the input field on the sequence form view. + +If you want to add more variables for use in the expression, you can +extend this module. + +Use cases for this module could be: + +- You want to generate alphanumeric numbering +- You want to apply some math to the number to prevent customers from + knowing their place in the sequence +- You want to use UUID diff --git a/sequence_python/readme/USAGE.md b/sequence_python/readme/USAGE.md new file mode 100644 index 00000000000..88d75e19dc0 --- /dev/null +++ b/sequence_python/readme/USAGE.md @@ -0,0 +1,21 @@ +To use this module, you need to: + +- Go to the form view of an ir.sequence record +- Go to the Python tab +- Enable the 'Use Python' checkbox +- Change the default 'number' expression to something more fancy. + +Examples: + +``` python +# To separate the Odoo-generated number with hyphens eg. 0-0-0-0-1 +'-'.join(number_padded) + +# To have an UUID as the sequence value +uuid.uuid4().hex + +# To use an 8-digit binary number +'{0:#010b}'.format(number + 300)[2:] +``` + +And so on. diff --git a/sequence_python/static/description/icon.png b/sequence_python/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/sequence_python/static/description/icon.png differ diff --git a/sequence_python/static/description/index.html b/sequence_python/static/description/index.html new file mode 100644 index 00000000000..deef03047ba --- /dev/null +++ b/sequence_python/static/description/index.html @@ -0,0 +1,471 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Sequence from Python expression

+ +

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

+

This module allows to generate a sequence by a Python formula +expression.

+

Besides common Python functions and operators, it provides several +functions like ‘random’ and ‘uuid’ in the expression, as well as +variables such as the next number in the sequence. These are also listed +next to the input field on the sequence form view.

+

If you want to add more variables for use in the expression, you can +extend this module.

+

Use cases for this module could be:

+
    +
  • You want to generate alphanumeric numbering
  • +
  • You want to apply some math to the number to prevent customers from +knowing their place in the sequence
  • +
  • You want to use UUID
  • +
+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+
    +
  • Go to the form view of an ir.sequence record
  • +
  • Go to the Python tab
  • +
  • Enable the ‘Use Python’ checkbox
  • +
  • Change the default ‘number’ expression to something more fancy.
  • +
+

Examples:

+
+# To separate the Odoo-generated number with hyphens eg. 0-0-0-0-1
+'-'.join(number_padded)
+
+# To have an UUID as the sequence value
+uuid.uuid4().hex
+
+# To use an 8-digit binary number
+'{0:#010b}'.format(number + 300)[2:]
+
+

And so on.

+
+
+

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

+
    +
  • Sunflower IT
  • +
+
+
+

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.

+

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/sequence_python/tests/__init__.py b/sequence_python/tests/__init__.py new file mode 100644 index 00000000000..b32ac6c6ab7 --- /dev/null +++ b/sequence_python/tests/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2020 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import test_ir_sequence diff --git a/sequence_python/tests/test_ir_sequence.py b/sequence_python/tests/test_ir_sequence.py new file mode 100644 index 00000000000..c4f684177f8 --- /dev/null +++ b/sequence_python/tests/test_ir_sequence.py @@ -0,0 +1,39 @@ +# Copyright 2020 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo.tests.common import TransactionCase + + +class TestIrSequence(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.Sequence = cls.env["ir.sequence"] + cls.sequence = cls.Sequence.create( + { + "name": "Test sequence", + "implementation": "standard", + "code": "test.python.sequence", + "prefix": "A", + "padding": 2, + "number_next": 1, + "number_increment": 1, + "company_id": False, + "use_python_code": True, + "python_code": "'B' + number_padded + 'C'", + } + ) + + def test_standard_sequence(self): + self.assertEqual(self.sequence.python_code_preview, "AB01C") + next_number = self.sequence._next() + self.assertEqual(next_number, "AB01C") + next_number = self.sequence._next() + self.assertEqual(next_number, "AB02C") + + def test_nogap_sequence(self): + self.sequence.write(dict(implementation="no_gap")) + next_number = self.sequence._next() + self.assertEqual(next_number, "AB01C") + next_number = self.sequence._next() + self.assertEqual(next_number, "AB02C") diff --git a/sequence_python/views/ir_sequence.xml b/sequence_python/views/ir_sequence.xml new file mode 100644 index 00000000000..b1b4d3cdfef --- /dev/null +++ b/sequence_python/views/ir_sequence.xml @@ -0,0 +1,52 @@ + + + + ir.sequence + + + + + + + + + +
+

Help with Python expressions

+

The expression you type here will be evaluated as the next number. The following variables can be used:

+
    +
  • number: The next number of the sequence (integer)
  • +
  • number_padded: Padded string of the next number of the sequence
  • +
  • sequence: Odoo record of the sequence being used
  • +
  • uuid: The Python uuid module, eg. to use uuid.uuid4()
  • +
  • random: The Python random module, eg. to use random.randint(0, 9)
  • +
  • string: The Python string module, eg. to use random.choices(string.ascii_letters + string.digits, k=4)
  • +
+

Aside from this, you may use several builtin Python functions

+
+
+
+
+
+
diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 87f29e54cad..546ff5cabc2 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,7 +1,8 @@ [project] name = "odoo-addons-oca-server-tools" -version = "18.0.20251216.0" +version = "18.0.20260128.0" dependencies = [ + "odoo-addon-attachment_delete_restrict==18.0.*", "odoo-addon-attachment_queue==18.0.*", "odoo-addon-attachment_synchronize==18.0.*", "odoo-addon-attachment_unindex_content==18.0.*", @@ -39,10 +40,12 @@ dependencies = [ "odoo-addon-module_analysis==18.0.*", "odoo-addon-module_auto_update==18.0.*", "odoo-addon-module_change_auto_install==18.0.*", + "odoo-addon-odoo_test_xmlrunner==18.0.*", "odoo-addon-onchange_helper==18.0.*", "odoo-addon-rpc_helper==18.0.*", "odoo-addon-scheduler_error_mailer==18.0.*", "odoo-addon-sentry==18.0.*", + "odoo-addon-sequence_python==18.0.*", "odoo-addon-session_db==18.0.*", "odoo-addon-test_auditlog==18.0.*", "odoo-addon-test_base_time_window==18.0.*",