From 1b7c6b5d91048387df9a9f8a037b785e747cfb16 Mon Sep 17 00:00:00 2001 From: Yoshi Tashiro Date: Sat, 28 Aug 2021 15:54:11 +0800 Subject: [PATCH 01/65] [ADD] attachment_delete_restrict --- attachment_delete_restrict/README.rst | 87 ++++ attachment_delete_restrict/__init__.py | 1 + attachment_delete_restrict/__manifest__.py | 17 + attachment_delete_restrict/i18n/ja.po | 97 ++++ attachment_delete_restrict/models/__init__.py | 4 + .../models/ir_attachment.py | 40 ++ attachment_delete_restrict/models/ir_model.py | 26 ++ .../models/res_groups.py | 15 + .../models/res_users.py | 14 + .../readme/CONFIGURE.rst | 9 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 2 + .../static/description/index.html | 434 ++++++++++++++++++ attachment_delete_restrict/tests/__init__.py | 1 + .../tests/test_attachment_delete_restrict.py | 44 ++ .../views/ir_model_views.xml | 29 ++ .../views/res_groups_views.xml | 24 + .../views/res_users_views.xml | 24 + 18 files changed, 869 insertions(+) create mode 100644 attachment_delete_restrict/README.rst create mode 100644 attachment_delete_restrict/__init__.py create mode 100644 attachment_delete_restrict/__manifest__.py create mode 100644 attachment_delete_restrict/i18n/ja.po create mode 100644 attachment_delete_restrict/models/__init__.py create mode 100644 attachment_delete_restrict/models/ir_attachment.py create mode 100644 attachment_delete_restrict/models/ir_model.py create mode 100644 attachment_delete_restrict/models/res_groups.py create mode 100644 attachment_delete_restrict/models/res_users.py create mode 100644 attachment_delete_restrict/readme/CONFIGURE.rst create mode 100644 attachment_delete_restrict/readme/CONTRIBUTORS.rst create mode 100644 attachment_delete_restrict/readme/DESCRIPTION.rst create mode 100644 attachment_delete_restrict/static/description/index.html create mode 100644 attachment_delete_restrict/tests/__init__.py create mode 100644 attachment_delete_restrict/tests/test_attachment_delete_restrict.py create mode 100644 attachment_delete_restrict/views/ir_model_views.xml create mode 100644 attachment_delete_restrict/views/res_groups_views.xml create mode 100644 attachment_delete_restrict/views/res_users_views.xml diff --git a/attachment_delete_restrict/README.rst b/attachment_delete_restrict/README.rst new file mode 100644 index 00000000000..a8b8a5aa77f --- /dev/null +++ b/attachment_delete_restrict/README.rst @@ -0,0 +1,87 @@ +================================ +Restrict Deletion of Attachments +================================ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github + :target: https://github.com/OCA/server-tools/tree/12.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-12-0/server-tools-12-0-attachment_delete_restrict + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/149/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module provides the ability to restrict the deletion of the attachments to certain +groups or users per related model. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +#. Go to *Settings > Techinical > Database Structure > Models*. +#. Open a model for which attachment deletion should be restricted. +#. 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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Quartile Limited + +Contributors +~~~~~~~~~~~~ + +* Yoshi Tashiro + +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/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..3121791076c --- /dev/null +++ b/attachment_delete_restrict/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2021 Quartile Limited +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Restrict Deletion of Attachments", + "version": "12.0.1.0.0", + "depends": ["base"], + "website": "https://github.com/OCA/server-tools", + "author": "Quartile Limited, Odoo Community Association (OCA)", + "category": "Tools", + "license": "AGPL-3", + "data": [ + "views/ir_model_views.xml", + "views/res_groups_views.xml", + "views/res_users_views.xml", + ], + "installable": True, +} diff --git a/attachment_delete_restrict/i18n/ja.po b/attachment_delete_restrict/i18n/ja.po new file mode 100644 index 00000000000..c5f194ef637 --- /dev/null +++ b/attachment_delete_restrict/i18n/ja.po @@ -0,0 +1,97 @@ +# 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" +"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 +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 +msgid "Attachment Deletion Users" +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,field_description:attachment_delete_restrict.field_ir_model__restrict_delete_attachment +msgid "Restrict Attachment Deletion" +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." +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." +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,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:34 +#, 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" + diff --git a/attachment_delete_restrict/models/__init__.py b/attachment_delete_restrict/models/__init__.py new file mode 100644 index 00000000000..92c0bbcbe1e --- /dev/null +++ b/attachment_delete_restrict/models/__init__.py @@ -0,0 +1,4 @@ +from . import ir_attachment +from . import ir_model +from . import res_groups +from . import res_users diff --git a/attachment_delete_restrict/models/ir_attachment.py b/attachment_delete_restrict/models/ir_attachment.py new file mode 100644 index 00000000000..f9587ac0714 --- /dev/null +++ b/attachment_delete_restrict/models/ir_attachment.py @@ -0,0 +1,40 @@ +# Copyright 2021 Quartile Limited +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, models +from odoo.exceptions import ValidationError + + +class IrAttachment(models.Model): + _inherit = "ir.attachment" + + @api.multi + def unlink(self): + for rec in self: + if not rec.res_model: + continue + model = self.env["ir.model"].search( + [ + ("model", "=", rec.res_model), + ("restrict_delete_attachment", "=", True), + ] + ) + if not model: + continue + groups = model.delete_attachment_group_ids + if groups and self.env.user in groups.mapped("users"): + continue + users = model.delete_attachment_user_ids + if users and self.env.user in users: + continue + user_names = "\n".join( + list(set(groups.mapped("users").mapped("name") + users.mapped("name"))) + ) + raise ValidationError( + _( + "You are not allowed to delete this attachment.\n\nUsers with " + "the delete permission:\n%s" + ) + % (user_names or "None") + ) + 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..dedb19e4100 --- /dev/null +++ b/attachment_delete_restrict/models/ir_model.py @@ -0,0 +1,26 @@ +# Copyright 2021 Quartile Limited +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class IrAttachment(models.Model): + _inherit = "ir.model" + + restrict_delete_attachment = fields.Boolean( + string="Restrict Attachment Deletion", + help="When selected, the deletion of the attachments related to this model is " + "restricted to certain users.", + ) + delete_attachment_group_ids = fields.Many2many( + "res.groups", + string="Attachment Deletion Groups", + 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", + help="The users selected here can delete the attachments related to this " + "model.", + ) diff --git a/attachment_delete_restrict/models/res_groups.py b/attachment_delete_restrict/models/res_groups.py new file mode 100644 index 00000000000..88d3987009f --- /dev/null +++ b/attachment_delete_restrict/models/res_groups.py @@ -0,0 +1,15 @@ +# Copyright 2021 Quartile Limited +# License AGPL-3.0 or later (http://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", + string="Attachment Deletion Models", + help="The users of the group can delete the attachments related to the models " + "assigned 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..2d6c2cee4ac --- /dev/null +++ b/attachment_delete_restrict/models/res_users.py @@ -0,0 +1,14 @@ +# Copyright 2021 Quartile Limited +# License AGPL-3.0 or later (http://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", + string="Attachment Deletion Models", + help="The user can delete the attachments related to the models assigned here.", + ) diff --git a/attachment_delete_restrict/readme/CONFIGURE.rst b/attachment_delete_restrict/readme/CONFIGURE.rst new file mode 100644 index 00000000000..2227c6bbaf1 --- /dev/null +++ b/attachment_delete_restrict/readme/CONFIGURE.rst @@ -0,0 +1,9 @@ +#. Go to *Settings > Techinical > Database Structure > Models*. +#. Open a model for which attachment deletion should be restricted. +#. 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.rst b/attachment_delete_restrict/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..599d1f834f3 --- /dev/null +++ b/attachment_delete_restrict/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Yoshi Tashiro diff --git a/attachment_delete_restrict/readme/DESCRIPTION.rst b/attachment_delete_restrict/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..792dd641fcd --- /dev/null +++ b/attachment_delete_restrict/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module provides the ability to restrict the deletion of the attachments to certain +groups or users per related model. diff --git a/attachment_delete_restrict/static/description/index.html b/attachment_delete_restrict/static/description/index.html new file mode 100644 index 00000000000..3b9827967dc --- /dev/null +++ b/attachment_delete_restrict/static/description/index.html @@ -0,0 +1,434 @@ + + + + + + +Restrict Deletion of Attachments + + + +
+

Restrict Deletion of Attachments

+ + +

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

+

This module provides the ability to restrict the deletion of the attachments to certain +groups or users per related model.

+

Table of contents

+ +
+

Configuration

+
    +
  1. Go to Settings > Techinical > 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 smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Quartile Limited
  • +
+
+
+

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/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..8d1e595c64e --- /dev/null +++ b/attachment_delete_restrict/tests/test_attachment_delete_restrict.py @@ -0,0 +1,44 @@ +# Copyright 2021 Quartile Limited +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.exceptions import ValidationError +from odoo.tests import SavepointCase, tagged + + +@tagged("post_install", "-at_install") +class TestAttachmentDeleteRestrict(SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner_model = cls.env["ir.model"].search([("model", "=", "res.partner")]) + cls.test_group = cls.env["res.groups"].create({"name": "test group"}) + cls.test_user = cls.env["res.users"].create( + {"name": "test user", "login": "test@example.com"} + ) + cls.test_attachment = cls.env["ir.attachment"].create( + {"name": "test attachment", "type": "binary", "res_model": "res.partner"} + ) + + def test_01_delete_attachment_unrestricted(self): + self.test_attachment.sudo(self.test_user).unlink() + + def test_02_delete_attachment_restricted_user_permitted(self): + self.partner_model.write({"restrict_delete_attachment": True}) + with self.assertRaises(ValidationError): + self.test_attachment.sudo(self.test_user).unlink() + self.partner_model.write( + {"delete_attachment_user_ids": [(4, self.test_user.id)]} + ) + self.test_attachment.sudo(self.test_user).unlink() + + def test_03_delete_attachment_restricted_group_permitted(self): + self.partner_model.write({"restrict_delete_attachment": True}) + with self.assertRaises(ValidationError): + self.test_attachment.sudo(self.test_user).unlink() + self.partner_model.write( + {"delete_attachment_group_ids": [(4, self.test_group.id)]} + ) + with self.assertRaises(ValidationError): + self.test_attachment.sudo(self.test_user).unlink() + self.test_user.write({"groups_id": [(4, self.test_group.id)]}) + self.test_attachment.sudo(self.test_user).unlink() 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..6c17fd164fc --- /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_groups_views.xml b/attachment_delete_restrict/views/res_groups_views.xml new file mode 100644 index 00000000000..626860c40e7 --- /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..8ed77fe28b9 --- /dev/null +++ b/attachment_delete_restrict/views/res_users_views.xml @@ -0,0 +1,24 @@ + + + + res.users.form + res.users + + + + + + + + + + + + From b3db51ce17a20c9e7439a70366d01a7b39494c4b Mon Sep 17 00:00:00 2001 From: Kev-Roche Date: Thu, 12 May 2022 19:59:34 +0200 Subject: [PATCH 02/65] [IMP] attachment_delete_restrict: black, isort, prettier --- attachment_delete_restrict/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/attachment_delete_restrict/__manifest__.py b/attachment_delete_restrict/__manifest__.py index 3121791076c..58485c0364f 100644 --- a/attachment_delete_restrict/__manifest__.py +++ b/attachment_delete_restrict/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { "name": "Restrict Deletion of Attachments", - "version": "12.0.1.0.0", + "version": "14.0.1.0.0", "depends": ["base"], "website": "https://github.com/OCA/server-tools", "author": "Quartile Limited, Odoo Community Association (OCA)", From e34ffbe8ad8e43d9a8ce0ef67a7fa2ae6b492d99 Mon Sep 17 00:00:00 2001 From: Kev-Roche Date: Thu, 12 May 2022 22:58:41 +0200 Subject: [PATCH 03/65] [MIG] attachment_delete_restrict: Migration to 14.0 --- attachment_delete_restrict/__init__.py | 1 + attachment_delete_restrict/__manifest__.py | 10 +- attachment_delete_restrict/hooks.py | 23 ++ attachment_delete_restrict/i18n/fr.po | 199 ++++++++++++++++++ attachment_delete_restrict/models/__init__.py | 1 + .../models/ir_attachment.py | 80 ++++--- attachment_delete_restrict/models/ir_model.py | 20 +- .../models/res_config.py | 22 ++ .../models/res_groups.py | 3 +- .../models/res_users.py | 4 +- .../readme/CONFIGURE.rst | 15 ++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 3 +- .../tests/test_attachment_delete_restrict.py | 76 +++++-- .../views/ir_model_views.xml | 3 +- .../views/res_config_view.xml | 32 +++ .../views/res_groups_views.xml | 2 +- .../views/res_users_views.xml | 2 +- 18 files changed, 445 insertions(+), 52 deletions(-) create mode 100644 attachment_delete_restrict/hooks.py create mode 100644 attachment_delete_restrict/i18n/fr.po create mode 100644 attachment_delete_restrict/models/res_config.py create mode 100644 attachment_delete_restrict/views/res_config_view.xml diff --git a/attachment_delete_restrict/__init__.py b/attachment_delete_restrict/__init__.py index 0650744f6bc..cc6b6354ad8 100644 --- a/attachment_delete_restrict/__init__.py +++ b/attachment_delete_restrict/__init__.py @@ -1 +1,2 @@ from . import models +from .hooks import post_init_hook diff --git a/attachment_delete_restrict/__manifest__.py b/attachment_delete_restrict/__manifest__.py index 58485c0364f..cf1db289481 100644 --- a/attachment_delete_restrict/__manifest__.py +++ b/attachment_delete_restrict/__manifest__.py @@ -3,15 +3,21 @@ { "name": "Restrict Deletion of Attachments", "version": "14.0.1.0.0", - "depends": ["base"], + "depends": [ + "base", + "base_setup", + ], "website": "https://github.com/OCA/server-tools", - "author": "Quartile Limited, Odoo Community Association (OCA)", + "author": "Quartile Limited, Akretion, Odoo Community Association (OCA)", "category": "Tools", "license": "AGPL-3", + "maintainers": ["Kev-Roche", "yostashiro"], "data": [ "views/ir_model_views.xml", "views/res_groups_views.xml", "views/res_users_views.xml", + "views/res_config_view.xml", ], "installable": True, + "post_init_hook": "post_init_hook", } diff --git a/attachment_delete_restrict/hooks.py b/attachment_delete_restrict/hooks.py new file mode 100644 index 00000000000..ccc840c2d02 --- /dev/null +++ b/attachment_delete_restrict/hooks.py @@ -0,0 +1,23 @@ +# Copyright (C) 2022 Akretion (). +# @author Kévin Roche +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import SUPERUSER_ID, api + + +def post_init_hook(cr, registry): + # if previous configuration exist on delete_attachment_group_ids or + # delete_attachment_user_ids, change the default level of + # attachment deletion at 'custom' to keep it. + with api.Environment.manage(): + env = api.Environment(cr, SUPERUSER_ID, {}) + previous_group_or_user = False + for model in env["ir.model"].search([]): + if model.delete_attachment_group_ids or model.delete_attachment_user_ids: + model.is_restrict_delete_attachment = True + previous_group_or_user = True + + if previous_group_or_user: + env["ir.config_parameter"].sudo().set_param( + "restrict_delete_attachment", "custom" + ) diff --git a/attachment_delete_restrict/i18n/fr.po b/attachment_delete_restrict/i18n/fr.po new file mode 100644 index 00000000000..49ef4606e0c --- /dev/null +++ b/attachment_delete_restrict/i18n/fr.po @@ -0,0 +1,199 @@ +# 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-05-12 20:36+0000\n" +"PO-Revision-Date: 2022-05-12 22:47+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.0.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 +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 +msgid "Attachment Deletion Users" +msgstr "Utilisateurs avec droit de suppression de PJ" + +#. 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.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__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,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.fields,field_description:attachment_delete_restrict.field_ir_model__is_restrict_delete_attachment +msgid "Model with Restrict Attachment Deletion" +msgstr "Modèle avec restrictions de suppression de PJ" + +#. 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__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,field_description:attachment_delete_restrict.field_ir_model__restrict_delete_attachment +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__restrict_delete_attachment +msgid "Restrict Delete 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 "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 level of delete restriction on attachments" +msgstr "Selectionner la restriction pour supprimer les PJs" + +#. module: attachment_delete_restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__strict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__restrict_delete_attachment__strict +msgid "Strict: Only creator and admin can delete them" +msgstr "" +"Strict : Seuls le créateur et les administrateurs peuvent les supprimer" + +#. 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_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_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,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__is_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 "" +"Vous n'êtes pas autorisé à supprimer cette pièce jointe.\n" +"\n" +"Utilisateurs ayant la permission:\n" +"%s" + +#. 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" +"Only the owner and administrators can delete it." +msgstr "" +"Vous n'êtes pas autorisé à supprimer cette pièce jointe.\n" +"Seulement son créateur et les administrateurs ont le droit." diff --git a/attachment_delete_restrict/models/__init__.py b/attachment_delete_restrict/models/__init__.py index 92c0bbcbe1e..53b5a8681e4 100644 --- a/attachment_delete_restrict/models/__init__.py +++ b/attachment_delete_restrict/models/__init__.py @@ -2,3 +2,4 @@ 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 index f9587ac0714..009bec1fcf4 100644 --- a/attachment_delete_restrict/models/ir_attachment.py +++ b/attachment_delete_restrict/models/ir_attachment.py @@ -1,40 +1,62 @@ # Copyright 2021 Quartile Limited # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import _, api, models +from odoo import _, models from odoo.exceptions import ValidationError class IrAttachment(models.Model): _inherit = "ir.attachment" - @api.multi def unlink(self): - for rec in self: - if not rec.res_model: - continue - model = self.env["ir.model"].search( - [ - ("model", "=", rec.res_model), - ("restrict_delete_attachment", "=", True), - ] - ) - if not model: - continue - groups = model.delete_attachment_group_ids - if groups and self.env.user in groups.mapped("users"): - continue - users = model.delete_attachment_user_ids - if users and self.env.user in users: - continue - user_names = "\n".join( - list(set(groups.mapped("users").mapped("name") + users.mapped("name"))) - ) - raise ValidationError( - _( - "You are not allowed to delete this attachment.\n\nUsers with " - "the delete permission:\n%s" - ) - % (user_names or "None") - ) + restriction = ( + self.env["ir.config_parameter"] + .sudo() + .get_param("restrict_delete_attachment") + ) + if restriction != "none": + for rec in self: + if restriction == "strict": + if rec.create_uid == self.env.user or self.user_has_groups( + "base.group_system" + ): + continue + raise ValidationError( + _( + "You are not allowed to delete this attachment.\n" + "Only the owner and administrators can delete it." + ) + ) + if restriction == "custom": + if not rec.res_model: + continue + model = self.env["ir.model"].search( + [ + ("model", "=", rec.res_model), + ("is_restrict_delete_attachment", "=", True), + ] + ) + if not model: + continue + groups = model.delete_attachment_group_ids + if groups and self.env.user in groups.mapped("users"): + continue + users = model.delete_attachment_user_ids + if users and self.env.user in users: + continue + user_names = "\n".join( + list( + set( + groups.mapped("users").mapped("name") + + users.mapped("name") + ) + ) + ) + raise ValidationError( + _( + "You are not allowed to delete this attachment.\n\nUsers with " + "the delete permission:\n%s" + ) + % (user_names or "None") + ) return super().unlink() diff --git a/attachment_delete_restrict/models/ir_model.py b/attachment_delete_restrict/models/ir_model.py index dedb19e4100..ec29ba98812 100644 --- a/attachment_delete_restrict/models/ir_model.py +++ b/attachment_delete_restrict/models/ir_model.py @@ -3,15 +3,31 @@ from odoo import fields, models +from .res_config import RESTRICT_DELETE_ATTACH + class IrAttachment(models.Model): _inherit = "ir.model" - restrict_delete_attachment = fields.Boolean( - string="Restrict Attachment Deletion", + restrict_delete_attachment = fields.Selection( + selection=RESTRICT_DELETE_ATTACH, + compute="_compute_restrict_delete_attachment", + readonly=True, + ) + + def _compute_restrict_delete_attachment(self): + return ( + self.env["ir.config_parameter"] + .sudo() + .get_param("restrict_delete_attachment") + ) + + is_restrict_delete_attachment = fields.Boolean( + string="Model with Restrict Attachment Deletion", help="When selected, the deletion of the attachments related to this model is " "restricted to certain users.", ) + delete_attachment_group_ids = fields.Many2many( "res.groups", string="Attachment Deletion Groups", diff --git a/attachment_delete_restrict/models/res_config.py b/attachment_delete_restrict/models/res_config.py new file mode 100644 index 00000000000..9b25df23acb --- /dev/null +++ b/attachment_delete_restrict/models/res_config.py @@ -0,0 +1,22 @@ +# Copyright (C) 2022 Akretion (). +# @author Kévin Roche +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + +RESTRICT_DELETE_ATTACH = [ + ("strict", "Strict: Only creator and admin can delete them"), + ("custom", "Custom: For each model, selected groups and users can delete them"), + ("none", "No restriction: All users / groups can delete them"), +] + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + restrict_delete_attachment = fields.Selection( + selection=RESTRICT_DELETE_ATTACH, + readonly=False, + required=True, + default="strict", + ) diff --git a/attachment_delete_restrict/models/res_groups.py b/attachment_delete_restrict/models/res_groups.py index 88d3987009f..f3048a7557e 100644 --- a/attachment_delete_restrict/models/res_groups.py +++ b/attachment_delete_restrict/models/res_groups.py @@ -11,5 +11,6 @@ class ResGroups(models.Model): "ir.model", string="Attachment Deletion Models", help="The users of the group can delete the attachments related to the models " - "assigned here.", + "assigned here. In general settings, 'Restrict Delete " + "Attachment' must be set as 'custom' to activate this setting.", ) diff --git a/attachment_delete_restrict/models/res_users.py b/attachment_delete_restrict/models/res_users.py index 2d6c2cee4ac..837f1e21e66 100644 --- a/attachment_delete_restrict/models/res_users.py +++ b/attachment_delete_restrict/models/res_users.py @@ -10,5 +10,7 @@ class ResUsers(models.Model): delete_attachment_model_ids = fields.Many2many( "ir.model", string="Attachment Deletion Models", - help="The user can delete the attachments related to the models assigned here.", + help="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.", ) diff --git a/attachment_delete_restrict/readme/CONFIGURE.rst b/attachment_delete_restrict/readme/CONFIGURE.rst index 2227c6bbaf1..103d10a51ff 100644 --- a/attachment_delete_restrict/readme/CONFIGURE.rst +++ b/attachment_delete_restrict/readme/CONFIGURE.rst @@ -1,3 +1,18 @@ +Select level: +============= +#. Go to *Settings > General Settings> Permission section*. +#. Choose the level of *Restrict Delete Attachment* (strict by default). + +Three levels: +============= +* Strict : Owner and admins only (by default) +* Custom : Certain groups or users per related model. +* None : all users can delete them + +Only Custom needs specific configuration. + +For Custom level: +================= #. Go to *Settings > Techinical > Database Structure > Models*. #. Open a model for which attachment deletion should be restricted. #. Select 'Restrict Attachment Deletion', and assign 'Attachment Deletion Groups' and/or diff --git a/attachment_delete_restrict/readme/CONTRIBUTORS.rst b/attachment_delete_restrict/readme/CONTRIBUTORS.rst index 599d1f834f3..374eca48aed 100644 --- a/attachment_delete_restrict/readme/CONTRIBUTORS.rst +++ b/attachment_delete_restrict/readme/CONTRIBUTORS.rst @@ -1 +1,2 @@ * Yoshi Tashiro +* Kévin Roche diff --git a/attachment_delete_restrict/readme/DESCRIPTION.rst b/attachment_delete_restrict/readme/DESCRIPTION.rst index 792dd641fcd..83c443b24d9 100644 --- a/attachment_delete_restrict/readme/DESCRIPTION.rst +++ b/attachment_delete_restrict/readme/DESCRIPTION.rst @@ -1,2 +1 @@ -This module provides the ability to restrict the deletion of the attachments to certain -groups or users per related model. +This module provides the ability to restrict the deletion of the attachments at different levels. diff --git a/attachment_delete_restrict/tests/test_attachment_delete_restrict.py b/attachment_delete_restrict/tests/test_attachment_delete_restrict.py index 8d1e595c64e..b0c054ffcd3 100644 --- a/attachment_delete_restrict/tests/test_attachment_delete_restrict.py +++ b/attachment_delete_restrict/tests/test_attachment_delete_restrict.py @@ -10,35 +10,87 @@ class TestAttachmentDeleteRestrict(SavepointCase): @classmethod def setUpClass(cls): super().setUpClass() + cls.env["ir.config_parameter"].sudo().set_param( + "restrict_delete_attachment", "custom" + ) cls.partner_model = cls.env["ir.model"].search([("model", "=", "res.partner")]) cls.test_group = cls.env["res.groups"].create({"name": "test group"}) cls.test_user = cls.env["res.users"].create( - {"name": "test user", "login": "test@example.com"} + { + "name": "test user", + "login": "test@example.com", + "groups_id": [(6, 0, cls.env.ref("base.group_user").ids)], + } + ) + cls.test_user2 = cls.env["res.users"].create( + { + "name": "test user2", + "login": "test2@example.com", + "groups_id": [(6, 0, cls.env.ref("base.group_user").ids)], + } + ) + cls.test_admin = cls.env["res.users"].create( + { + "name": "User admin", + "login": "admin@example.com", + "groups_id": [(6, 0, cls.env.ref("base.group_system").ids)], + } ) cls.test_attachment = cls.env["ir.attachment"].create( {"name": "test attachment", "type": "binary", "res_model": "res.partner"} ) - def test_01_delete_attachment_unrestricted(self): - self.test_attachment.sudo(self.test_user).unlink() + def test_01_custom_delete_attachment_unrestricted(self): + self.test_attachment.with_user(self.test_user).unlink() - def test_02_delete_attachment_restricted_user_permitted(self): - self.partner_model.write({"restrict_delete_attachment": True}) + def test_02_custom_delete_attachment_restricted_user_permitted(self): + self.partner_model.write({"is_restrict_delete_attachment": True}) with self.assertRaises(ValidationError): - self.test_attachment.sudo(self.test_user).unlink() + self.test_attachment.with_user(self.test_user).unlink() self.partner_model.write( {"delete_attachment_user_ids": [(4, self.test_user.id)]} ) - self.test_attachment.sudo(self.test_user).unlink() + self.test_attachment.with_user(self.test_user).unlink() - def test_03_delete_attachment_restricted_group_permitted(self): - self.partner_model.write({"restrict_delete_attachment": True}) + def test_03_custom_delete_attachment_restricted_group_permitted(self): + self.partner_model.write({"is_restrict_delete_attachment": True}) with self.assertRaises(ValidationError): - self.test_attachment.sudo(self.test_user).unlink() + self.test_attachment.with_user(self.test_user).unlink() self.partner_model.write( {"delete_attachment_group_ids": [(4, self.test_group.id)]} ) with self.assertRaises(ValidationError): - self.test_attachment.sudo(self.test_user).unlink() + self.test_attachment.with_user(self.test_user).unlink() self.test_user.write({"groups_id": [(4, self.test_group.id)]}) - self.test_attachment.sudo(self.test_user).unlink() + self.test_attachment.with_user(self.test_user).unlink() + + def test_04_strict_owner_can_delete_attachment(self): + self.env["ir.config_parameter"].sudo().set_param( + "restrict_delete_attachment", "strict" + ) + test_attachment_2 = ( + self.env["ir.attachment"] + .with_user(self.test_user) + .create( + { + "name": "test attachment 2", + "type": "binary", + "res_model": "res.partner", + } + ) + ) + with self.assertRaises(ValidationError): + test_attachment_2.with_user(self.test_user2).unlink() + test_attachment_2.with_user(self.test_user).unlink() + + def test_05_strict_admin_can_delete_attachment(self): + self.env["ir.config_parameter"].sudo().set_param( + "restrict_delete_attachment", "strict" + ) + self.test_attachment.with_user(self.test_admin).unlink() + + def test_06_none_no_restriction(self): + self.env["ir.config_parameter"].sudo().set_param( + "restrict_delete_attachment", "none" + ) + self.test_attachment.with_user(self.test_user2).unlink() diff --git a/attachment_delete_restrict/views/ir_model_views.xml b/attachment_delete_restrict/views/ir_model_views.xml index 6c17fd164fc..00b23ba17ba 100644 --- a/attachment_delete_restrict/views/ir_model_views.xml +++ b/attachment_delete_restrict/views/ir_model_views.xml @@ -11,8 +11,9 @@ + + + + res.config.settings.attachment.delete.restrict + res.config.settings + + + +
+
+
+
+
+
+
+
diff --git a/attachment_delete_restrict/views/res_groups_views.xml b/attachment_delete_restrict/views/res_groups_views.xml index 626860c40e7..4e3d744bf48 100644 --- a/attachment_delete_restrict/views/res_groups_views.xml +++ b/attachment_delete_restrict/views/res_groups_views.xml @@ -13,7 +13,7 @@ diff --git a/attachment_delete_restrict/views/res_users_views.xml b/attachment_delete_restrict/views/res_users_views.xml index 8ed77fe28b9..a4034613e05 100644 --- a/attachment_delete_restrict/views/res_users_views.xml +++ b/attachment_delete_restrict/views/res_users_views.xml @@ -13,7 +13,7 @@ From 37b9cdd6729e0d2454969be8c457fc43e8db597b Mon Sep 17 00:00:00 2001 From: Kev-Roche Date: Thu, 19 May 2022 10:58:28 +0200 Subject: [PATCH 04/65] rework module attachment_delete_restrict (to squash after review) --- attachment_delete_restrict/__init__.py | 1 - attachment_delete_restrict/__manifest__.py | 3 +- attachment_delete_restrict/hooks.py | 23 --- attachment_delete_restrict/i18n/fr.po | 95 ++++++++++--- .../migrations/14.0.1.0.0/post-migrate.py | 23 +++ .../migrations/14.0.1.0.0/pre-migrate.py | 16 +++ .../models/ir_attachment.py | 133 +++++++++++------- attachment_delete_restrict/models/ir_model.py | 36 ++--- .../models/res_config.py | 84 +++++++++-- .../models/res_groups.py | 3 +- .../models/res_users.py | 4 +- .../readme/CONFIGURE.rst | 7 +- .../tests/test_attachment_delete_restrict.py | 132 ++++++++++++++--- .../views/ir_model_views.xml | 3 +- .../views/res_config_view.xml | 48 ++++++- .../views/res_groups_views.xml | 2 +- .../views/res_users_views.xml | 2 +- 17 files changed, 460 insertions(+), 155 deletions(-) delete mode 100644 attachment_delete_restrict/hooks.py create mode 100644 attachment_delete_restrict/migrations/14.0.1.0.0/post-migrate.py create mode 100644 attachment_delete_restrict/migrations/14.0.1.0.0/pre-migrate.py diff --git a/attachment_delete_restrict/__init__.py b/attachment_delete_restrict/__init__.py index cc6b6354ad8..0650744f6bc 100644 --- a/attachment_delete_restrict/__init__.py +++ b/attachment_delete_restrict/__init__.py @@ -1,2 +1 @@ from . import models -from .hooks import post_init_hook diff --git a/attachment_delete_restrict/__manifest__.py b/attachment_delete_restrict/__manifest__.py index cf1db289481..040eb39a47d 100644 --- a/attachment_delete_restrict/__manifest__.py +++ b/attachment_delete_restrict/__manifest__.py @@ -11,7 +11,7 @@ "author": "Quartile Limited, Akretion, Odoo Community Association (OCA)", "category": "Tools", "license": "AGPL-3", - "maintainers": ["Kev-Roche", "yostashiro"], + "maintainers": ["yostashiro", "Kev-Roche"], "data": [ "views/ir_model_views.xml", "views/res_groups_views.xml", @@ -19,5 +19,4 @@ "views/res_config_view.xml", ], "installable": True, - "post_init_hook": "post_init_hook", } diff --git a/attachment_delete_restrict/hooks.py b/attachment_delete_restrict/hooks.py deleted file mode 100644 index ccc840c2d02..00000000000 --- a/attachment_delete_restrict/hooks.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) 2022 Akretion (). -# @author Kévin Roche -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import SUPERUSER_ID, api - - -def post_init_hook(cr, registry): - # if previous configuration exist on delete_attachment_group_ids or - # delete_attachment_user_ids, change the default level of - # attachment deletion at 'custom' to keep it. - with api.Environment.manage(): - env = api.Environment(cr, SUPERUSER_ID, {}) - previous_group_or_user = False - for model in env["ir.model"].search([]): - if model.delete_attachment_group_ids or model.delete_attachment_user_ids: - model.is_restrict_delete_attachment = True - previous_group_or_user = True - - if previous_group_or_user: - env["ir.config_parameter"].sudo().set_param( - "restrict_delete_attachment", "custom" - ) diff --git a/attachment_delete_restrict/i18n/fr.po b/attachment_delete_restrict/i18n/fr.po index 49ef4606e0c..788669f25a4 100644 --- a/attachment_delete_restrict/i18n/fr.po +++ b/attachment_delete_restrict/i18n/fr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-12 20:36+0000\n" -"PO-Revision-Date: 2022-05-12 22:47+0200\n" +"POT-Creation-Date: 2022-05-19 07:58+0000\n" +"PO-Revision-Date: 2022-05-19 10:07+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: fr\n" @@ -29,6 +29,8 @@ 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_ir_model__global_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" @@ -42,9 +44,21 @@ 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_ir_model__global_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,name:attachment_delete_restrict.model_res_config_settings msgid "Config Settings" @@ -52,12 +66,17 @@ msgstr "Paramètres de config" #. 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__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 "" + #. 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 @@ -67,6 +86,16 @@ msgstr "" msgid "Display Name" msgstr "Nom affiché" +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_group_ids_str +msgid "Global Delete Attachment Group Ids Str" +msgstr "Groupe avec droit de suppression de toutes les PJs" + +#. module: attachment_delete_restrict +#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_user_ids_str +msgid "Global Delete Attachment User Ids Str" +msgstr "Utilisateurs avec droit de suppression de toutes les PJs" + #. 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 @@ -85,11 +114,6 @@ msgstr "" msgid "Last Modified on" msgstr "Dernière modification le" -#. module: attachment_delete_restrict -#: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__is_restrict_delete_attachment -msgid "Model with Restrict Attachment Deletion" -msgstr "Modèle avec restrictions de suppression de PJ" - #. module: attachment_delete_restrict #: model:ir.model,name:attachment_delete_restrict.model_ir_model msgid "Models" @@ -97,16 +121,30 @@ 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__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__restrict_custom +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__restrict_custom +msgid "" +"Restrict + Custom: Creator and admin can delete them + for each model, " +"selected groups and users can delete them" +msgstr "" +"Limité + personnalisé : Le propriétaire, les administrateurs et les " +"utilisateurs de certains groupes peuvent supprimer" + #. module: attachment_delete_restrict #: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_model__restrict_delete_attachment -#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__restrict_delete_attachment -msgid "Restrict Delete Attachment" -msgstr "Restreindre la suppression de PJs" +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 @@ -114,16 +152,16 @@ 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 level of delete restriction on attachments" -msgstr "Selectionner la restriction pour supprimer les PJs" +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__restrict +#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__restrict +msgid "Restrict: Only creator and admin can delete them" +msgstr "" +"Limité : Seuls le propriétaire et les administrateurs peuvent supprimer" #. module: attachment_delete_restrict -#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__strict -#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__restrict_delete_attachment__strict -msgid "Strict: Only creator and admin can delete them" -msgstr "" -"Strict : Seuls le créateur et les administrateurs peuvent les supprimer" +#: 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,help:attachment_delete_restrict.field_res_users__delete_attachment_model_ids @@ -136,6 +174,13 @@ msgstr "" "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_ir_model__global_delete_attachment_group_ids +#: 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 "" @@ -156,6 +201,12 @@ msgstr "" "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_ir_model__global_delete_attachment_user_ids +#: 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 "" @@ -168,11 +219,13 @@ msgid "Users" msgstr "Utilisateurs" #. module: attachment_delete_restrict -#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__is_restrict_delete_attachment +#: 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 diff --git a/attachment_delete_restrict/migrations/14.0.1.0.0/post-migrate.py b/attachment_delete_restrict/migrations/14.0.1.0.0/post-migrate.py new file mode 100644 index 00000000000..5fe21510d99 --- /dev/null +++ b/attachment_delete_restrict/migrations/14.0.1.0.0/post-migrate.py @@ -0,0 +1,23 @@ +# Copyright (C) 2022 Akretion (). +# @author Kévin Roche +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openupgradelib import openupgrade + +from odoo.tools.sql import column_exists + + +@openupgrade.migrate() +def migrate(env, version): + if column_exists(env.cr, "ir_model", "migrated_restrict_delete_attachment"): + query = """ + SELECT id FROM ir_model WHERE migrated_restrict_delete_attachment = True + """ + env.cr.execute(query) + results = env.cr.fetchall() + models = env["ir.model"].search([("id", "in", results)]) + for model in models: + model.restrict_delete_attachment = "custom" + + query2 = "ALTER TABLE ir_model DROP COLUMN migrated_restrict_delete_attachment;" + env.cr.execute(query2) diff --git a/attachment_delete_restrict/migrations/14.0.1.0.0/pre-migrate.py b/attachment_delete_restrict/migrations/14.0.1.0.0/pre-migrate.py new file mode 100644 index 00000000000..61c6e2221bb --- /dev/null +++ b/attachment_delete_restrict/migrations/14.0.1.0.0/pre-migrate.py @@ -0,0 +1,16 @@ +# Copyright (C) 2022 Akretion (). +# @author Kévin Roche +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo.tools.sql import column_exists, rename_column + + +def migrate(cr, version): + if column_exists(cr, "ir_model", "restrict_delete_attachment"): + rename_column( + cr, + "ir_model", + "restrict_delete_attachment", + "migrated_restrict_delete_attachment", + ) diff --git a/attachment_delete_restrict/models/ir_attachment.py b/attachment_delete_restrict/models/ir_attachment.py index 009bec1fcf4..c59257e3dde 100644 --- a/attachment_delete_restrict/models/ir_attachment.py +++ b/attachment_delete_restrict/models/ir_attachment.py @@ -1,6 +1,8 @@ # Copyright 2021 Quartile Limited # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from ast import literal_eval + from odoo import _, models from odoo.exceptions import ValidationError @@ -8,55 +10,86 @@ class IrAttachment(models.Model): _inherit = "ir.attachment" - def unlink(self): - restriction = ( - self.env["ir.config_parameter"] - .sudo() - .get_param("restrict_delete_attachment") + def _check_delete_attachment(self, model, restrict, mode): + if restrict == "restrict": + if self._check_restrict_delete_attachment(): + return + else: + self._raise_restrict_validation_error() + elif restrict == "custom": + self._check_custom_delete_attachment(model, mode) + elif restrict == "restrict_custom": + if self._check_restrict_delete_attachment(): + return + self._check_custom_delete_attachment(model, mode) + + def _check_restrict_delete_attachment(self): + if self.create_uid == self.env.user or self.user_has_groups( + "base.group_system" + ): + return True + else: + return False + + def _check_custom_delete_attachment(self, model, mode): + if not model and mode != "global": + return + groups = model.delete_attachment_group_ids + users = model.delete_attachment_user_ids + param = self.env["ir.config_parameter"].sudo() + groups_ids = param.get_param( + "attachment_delete_restrict.global_delete_attachment_group_ids" + ) + users_ids = param.get_param( + "attachment_delete_restrict.global_delete_attachment_user_ids" ) - if restriction != "none": - for rec in self: - if restriction == "strict": - if rec.create_uid == self.env.user or self.user_has_groups( - "base.group_system" - ): - continue - raise ValidationError( - _( - "You are not allowed to delete this attachment.\n" - "Only the owner and administrators can delete it." - ) - ) - if restriction == "custom": - if not rec.res_model: - continue - model = self.env["ir.model"].search( - [ - ("model", "=", rec.res_model), - ("is_restrict_delete_attachment", "=", True), - ] - ) - if not model: - continue - groups = model.delete_attachment_group_ids - if groups and self.env.user in groups.mapped("users"): - continue - users = model.delete_attachment_user_ids - if users and self.env.user in users: - continue - user_names = "\n".join( - list( - set( - groups.mapped("users").mapped("name") - + users.mapped("name") - ) - ) - ) - raise ValidationError( - _( - "You are not allowed to delete this attachment.\n\nUsers with " - "the delete permission:\n%s" - ) - % (user_names or "None") - ) + if mode == "global": + if groups_ids: + groups = self.env["res.groups"].search( + [("id", "in", literal_eval(groups_ids))] + ) + if users_ids: + users = self.env["res.users"].search( + [("id", "in", literal_eval(users_ids))] + ) + if groups and self.env.user in groups.mapped("users"): + return + if users and self.env.user in users: + return + list_group = "\n".join(list(set(groups.mapped("users").mapped("name")))) + list_user = "\n".join(list(set(users.mapped("name")))) + user_names = list_group + list_user + raise ValidationError( + _( + "You are not allowed to delete this attachment.\n\nUsers with " + "the delete permission:\n%s" + ) + % (user_names or "None") + ) + + def _raise_restrict_validation_error(self): + raise ValidationError( + _( + "You are not allowed to delete this attachment.\n" + "Only the owner and administrators can delete it." + ) + ) + + def unlink(self): + for rec in self: + if not rec.res_model: + continue + model = self.env["ir.model"].search([("model", "=", rec.res_model)]) + model_restrict = model.restrict_delete_attachment + global_restrict = ( + self.env["ir.config_parameter"] + .sudo() + .get_param( + "attachment_delete_restrict.global_restrict_delete_attachment" + ) + ) + if model_restrict == "default": + rec._check_delete_attachment(model, global_restrict, "global") + elif model_restrict not in ["default", "none"]: + rec._check_delete_attachment(model, model_restrict, "model") return super().unlink() diff --git a/attachment_delete_restrict/models/ir_model.py b/attachment_delete_restrict/models/ir_model.py index ec29ba98812..411d695bb14 100644 --- a/attachment_delete_restrict/models/ir_model.py +++ b/attachment_delete_restrict/models/ir_model.py @@ -3,40 +3,42 @@ from odoo import fields, models -from .res_config import RESTRICT_DELETE_ATTACH - - -class IrAttachment(models.Model): +RESTRICT_DELETE_ATTACH = [ + ("default", "Use global configuration"), + ("restrict", "Restrict: Only creator and admin can delete them"), + ("custom", "Custom: For each model, selected groups and users can " "delete them"), + ( + "restrict_custom", + "Restrict + 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, - compute="_compute_restrict_delete_attachment", - readonly=True, - ) - - def _compute_restrict_delete_attachment(self): - return ( - self.env["ir.config_parameter"] - .sudo() - .get_param("restrict_delete_attachment") - ) - - is_restrict_delete_attachment = fields.Boolean( - string="Model with Restrict Attachment Deletion", + 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.", ) diff --git a/attachment_delete_restrict/models/res_config.py b/attachment_delete_restrict/models/res_config.py index 9b25df23acb..a471829d799 100644 --- a/attachment_delete_restrict/models/res_config.py +++ b/attachment_delete_restrict/models/res_config.py @@ -2,21 +2,89 @@ # @author Kévin Roche # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import fields, models +from odoo import api, fields, models -RESTRICT_DELETE_ATTACH = [ - ("strict", "Strict: Only creator and admin can delete them"), - ("custom", "Custom: For each model, selected groups and users can delete them"), - ("none", "No restriction: All users / groups can delete them"), -] +from .ir_model import RESTRICT_DELETE_ATTACH class ResConfigSettings(models.TransientModel): _inherit = "res.config.settings" - restrict_delete_attachment = fields.Selection( + global_restrict_delete_attachment = fields.Selection( selection=RESTRICT_DELETE_ATTACH, + config_parameter="attachment_delete_restrict.global_restrict_delete_attachment", readonly=False, required=True, - default="strict", + 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", + relation="global_delete_attachment_group_rel", + help="The users in the groups selected here can delete all the attachments.", + readonly=False, + compute="_compute_global_delete_attachment_group_ids", + inverse="_inverse_global_delete_attachment_group_ids", + ) + global_delete_attachment_group_ids_str = fields.Char( + string="", + config_parameter="attachment_delete_restrict.global_delete_attachment_group_ids", + ) + + global_delete_attachment_user_ids = fields.Many2many( + "res.users", + string="Attachment Deletion Users", + relation="global_delete_attachment_user_rel", + help="The users selected here can delete all the attachments", + readonly=False, + compute="_compute_global_delete_attachment_user_ids", + inverse="_inverse_global_delete_attachment_user_ids", + ) + + global_delete_attachment_user_ids_str = fields.Char( + string="", + config_parameter="attachment_delete_restrict.global_delete_attachment_user_ids", + ) + + @api.depends("global_delete_attachment_group_ids_str") + def _compute_global_delete_attachment_group_ids(self): + for setting in self: + if setting.global_delete_attachment_group_ids_str: + ids = setting.global_delete_attachment_group_ids_str.split(",") + setting.global_delete_attachment_group_ids = self.env[ + "res.groups" + ].search([("id", "in", ids)]) + else: + setting.global_delete_attachment_group_ids = None + + def _inverse_global_delete_attachment_group_ids(self): + for setting in self: + if setting.global_delete_attachment_group_ids: + setting.global_delete_attachment_group_ids_str = ",".join( + str(setting.global_delete_attachment_group_ids.mapped("id")) + ) + else: + setting.global_delete_attachment_group_ids_str = "" + + @api.depends("global_delete_attachment_user_ids_str") + def _compute_global_delete_attachment_user_ids(self): + for setting in self: + if setting.global_delete_attachment_user_ids_str: + ids = setting.global_delete_attachment_user_ids_str.split(",") + setting.global_delete_attachment_user_ids = self.env["res.user"].search( + [("id", "in", ids)] + ) + else: + setting.global_delete_attachment_user_ids = None + + def _inverse_global_delete_attachment_user_ids(self): + for setting in self: + if setting.global_delete_attachment_user_ids: + setting.global_delete_attachment_user_ids_str = ",".join( + str(setting.global_delete_attachment_user_ids.mapped("id")) + ) + else: + setting.global_delete_attachment_user_ids_str = "" diff --git a/attachment_delete_restrict/models/res_groups.py b/attachment_delete_restrict/models/res_groups.py index f3048a7557e..10d18585fef 100644 --- a/attachment_delete_restrict/models/res_groups.py +++ b/attachment_delete_restrict/models/res_groups.py @@ -10,7 +10,8 @@ class ResGroups(models.Model): delete_attachment_model_ids = fields.Many2many( "ir.model", string="Attachment Deletion Models", - help="The users of the group can delete the attachments related to the models " + help="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.", ) diff --git a/attachment_delete_restrict/models/res_users.py b/attachment_delete_restrict/models/res_users.py index 837f1e21e66..c8f79dd2c75 100644 --- a/attachment_delete_restrict/models/res_users.py +++ b/attachment_delete_restrict/models/res_users.py @@ -10,7 +10,7 @@ class ResUsers(models.Model): delete_attachment_model_ids = fields.Many2many( "ir.model", string="Attachment Deletion Models", - help="The user can delete the attachments related to the " - "models assigned here. In general settings, 'Restrict Delete " + help="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.", ) diff --git a/attachment_delete_restrict/readme/CONFIGURE.rst b/attachment_delete_restrict/readme/CONFIGURE.rst index 103d10a51ff..332bb57d367 100644 --- a/attachment_delete_restrict/readme/CONFIGURE.rst +++ b/attachment_delete_restrict/readme/CONFIGURE.rst @@ -7,12 +7,13 @@ Three levels: ============= * Strict : Owner and admins only (by default) * Custom : Certain groups or users per related model. +* Custom + Strict : Owner, admins and Certain groups or users per related model. * None : all users can delete them -Only Custom needs specific configuration. +Only Custom and Custom + Strict need specific configuration. -For Custom level: -================= +For Custom and Custom + Strict levels: +====================================== #. Go to *Settings > Techinical > Database Structure > Models*. #. Open a model for which attachment deletion should be restricted. #. Select 'Restrict Attachment Deletion', and assign 'Attachment Deletion Groups' and/or diff --git a/attachment_delete_restrict/tests/test_attachment_delete_restrict.py b/attachment_delete_restrict/tests/test_attachment_delete_restrict.py index b0c054ffcd3..386a3a588e8 100644 --- a/attachment_delete_restrict/tests/test_attachment_delete_restrict.py +++ b/attachment_delete_restrict/tests/test_attachment_delete_restrict.py @@ -10,8 +10,9 @@ class TestAttachmentDeleteRestrict(SavepointCase): @classmethod def setUpClass(cls): super().setUpClass() - cls.env["ir.config_parameter"].sudo().set_param( - "restrict_delete_attachment", "custom" + cls.param = cls.env["ir.config_parameter"].sudo() + cls.param.set_param( + "attachment_delete_restrict.global_restrict_delete_attachment", "none" ) cls.partner_model = cls.env["ir.model"].search([("model", "=", "res.partner")]) cls.test_group = cls.env["res.groups"].create({"name": "test group"}) @@ -33,18 +34,42 @@ def setUpClass(cls): { "name": "User admin", "login": "admin@example.com", - "groups_id": [(6, 0, cls.env.ref("base.group_system").ids)], + "groups_id": [ + ( + 6, + 0, + ( + cls.env.ref("base.group_system").id, + cls.env.ref("base.group_user").id, + ), + ) + ], } ) cls.test_attachment = cls.env["ir.attachment"].create( {"name": "test attachment", "type": "binary", "res_model": "res.partner"} ) + cls.test_attachment_2 = ( + cls.env["ir.attachment"] + .with_user(cls.test_user) + .create( + { + "name": "test attachment 2", + "type": "binary", + "res_model": "res.partner", + } + ) + ) - def test_01_custom_delete_attachment_unrestricted(self): + def test_01_delete_attachment_unrestricted(self): self.test_attachment.with_user(self.test_user).unlink() + def test_01_bis_delete_attachment_unrestricted(self): + self.partner_model.write({"restrict_delete_attachment": "none"}) + self.test_attachment.with_user(self.test_user2).unlink() + def test_02_custom_delete_attachment_restricted_user_permitted(self): - self.partner_model.write({"is_restrict_delete_attachment": True}) + self.partner_model.write({"restrict_delete_attachment": "custom"}) with self.assertRaises(ValidationError): self.test_attachment.with_user(self.test_user).unlink() self.partner_model.write( @@ -53,7 +78,7 @@ def test_02_custom_delete_attachment_restricted_user_permitted(self): self.test_attachment.with_user(self.test_user).unlink() def test_03_custom_delete_attachment_restricted_group_permitted(self): - self.partner_model.write({"is_restrict_delete_attachment": True}) + self.partner_model.write({"restrict_delete_attachment": "custom"}) with self.assertRaises(ValidationError): self.test_attachment.with_user(self.test_user).unlink() self.partner_model.write( @@ -64,10 +89,8 @@ def test_03_custom_delete_attachment_restricted_group_permitted(self): self.test_user.write({"groups_id": [(4, self.test_group.id)]}) self.test_attachment.with_user(self.test_user).unlink() - def test_04_strict_owner_can_delete_attachment(self): - self.env["ir.config_parameter"].sudo().set_param( - "restrict_delete_attachment", "strict" - ) + def test_04_restrict_owner_can_delete_attachment(self): + self.partner_model.write({"restrict_delete_attachment": "restrict"}) test_attachment_2 = ( self.env["ir.attachment"] .with_user(self.test_user) @@ -83,14 +106,89 @@ def test_04_strict_owner_can_delete_attachment(self): test_attachment_2.with_user(self.test_user2).unlink() test_attachment_2.with_user(self.test_user).unlink() - def test_05_strict_admin_can_delete_attachment(self): - self.env["ir.config_parameter"].sudo().set_param( - "restrict_delete_attachment", "strict" - ) + def test_05_restrict_admin_can_delete_attachment(self): + self.partner_model.write({"restrict_delete_attachment": "restrict"}) self.test_attachment.with_user(self.test_admin).unlink() - def test_06_none_no_restriction(self): - self.env["ir.config_parameter"].sudo().set_param( - "restrict_delete_attachment", "none" + def test_06_global_restrict_restriction(self): + self.param.set_param( + "attachment_delete_restrict.global_restrict_delete_attachment", "restrict" + ) + with self.assertRaises(ValidationError): + self.test_attachment_2.with_user(self.test_user2).unlink() + self.test_attachment_2.with_user(self.test_user).unlink() + + def test_07_global_custom_restriction_for_users(self): + self.param.set_param( + "attachment_delete_restrict.global_restrict_delete_attachment", "custom" ) + self.param.set_param( + "attachment_delete_restrict.global_delete_attachment_user_ids", + self.test_user2.ids, + ) + with self.assertRaises(ValidationError): + self.test_attachment.with_user(self.test_user).unlink() self.test_attachment.with_user(self.test_user2).unlink() + + def test_08_global_custom_restriction_for_groups(self): + self.param.set_param( + "attachment_delete_restrict.global_restrict_delete_attachment", "custom" + ) + with self.assertRaises(ValidationError): + self.test_attachment.with_user(self.test_user).unlink() + self.param.set_param( + "attachment_delete_restrict.global_delete_attachment_group_ids", + self.test_group.ids, + ) + with self.assertRaises(ValidationError): + self.test_attachment.with_user(self.test_user).unlink() + self.test_user.write({"groups_id": [(4, self.test_group.id)]}) + self.test_attachment.with_user(self.test_user).unlink() + + def test_09_global_none_restriction(self): + global_restrict = self.param.get_param( + "attachment_delete_restrict.global_restrict_delete_attachment" + ) + self.assertEqual(global_restrict, "none") + self.test_attachment.with_user(self.test_user).unlink() + + def test_10_restrict_and_custom_delete_user(self): + self.partner_model.write({"restrict_delete_attachment": "restrict_custom"}) + with self.assertRaises(ValidationError): + self.test_attachment.with_user(self.test_user2).unlink() + self.partner_model.write( + {"delete_attachment_user_ids": [(4, self.test_user2.id)]} + ) + self.test_attachment.with_user(self.test_user2).unlink() + + self.test_attachment_2.with_user(self.test_admin).unlink() + + def test_11_restrict_and_custom_delete_group(self): + self.param.set_param( + "attachment_delete_restrict.global_restrict_delete_attachment", + "restrict_custom", + ) + with self.assertRaises(ValidationError): + self.test_attachment.with_user(self.test_user).unlink() + self.test_user.write({"groups_id": [(4, self.test_group.id)]}) + self.param.set_param( + "attachment_delete_restrict.global_delete_attachment_group_ids", + self.test_group.ids, + ) + self.test_attachment.with_user(self.test_user).unlink() + self.test_attachment_2.with_user(self.test_admin).unlink() + + def test_12_default_model_restriction(self): + self.param.set_param( + "attachment_delete_restrict.global_restrict_delete_attachment", "custom" + ) + self.param.set_param( + "attachment_delete_restrict.global_delete_attachment_group_ids", + self.test_group.ids, + ) + self.partner_model.write({"restrict_delete_attachment": "default"}) + with self.assertRaises(ValidationError): + self.test_attachment.with_user(self.test_user).unlink() + + self.test_user.write({"groups_id": [(4, self.test_group.id)]}) + self.test_attachment.with_user(self.test_user).unlink() diff --git a/attachment_delete_restrict/views/ir_model_views.xml b/attachment_delete_restrict/views/ir_model_views.xml index 00b23ba17ba..7152e93a296 100644 --- a/attachment_delete_restrict/views/ir_model_views.xml +++ b/attachment_delete_restrict/views/ir_model_views.xml @@ -11,9 +11,8 @@
-
-
+
+
+ Authorized Groups: +
+
+ + + +
+
+ Authorized Users: +
+
+ + +
+ +
diff --git a/attachment_delete_restrict/views/res_groups_views.xml b/attachment_delete_restrict/views/res_groups_views.xml index 4e3d744bf48..9a52be721b0 100644 --- a/attachment_delete_restrict/views/res_groups_views.xml +++ b/attachment_delete_restrict/views/res_groups_views.xml @@ -13,7 +13,7 @@ diff --git a/attachment_delete_restrict/views/res_users_views.xml b/attachment_delete_restrict/views/res_users_views.xml index a4034613e05..7002905c28f 100644 --- a/attachment_delete_restrict/views/res_users_views.xml +++ b/attachment_delete_restrict/views/res_users_views.xml @@ -13,7 +13,7 @@ From 197aa2ff37c23441dbd0062416688eb1804ea9fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Sun, 10 Jul 2022 18:34:38 +0200 Subject: [PATCH 05/65] attachment_delete_restrict: refactor test and improve restrict mode naming --- .../models/ir_attachment.py | 4 +- attachment_delete_restrict/models/ir_model.py | 6 +- .../models/res_config.py | 8 +- .../tests/test_attachment_delete_restrict.py | 216 ++++++++---------- .../views/res_config_view.xml | 2 +- 5 files changed, 98 insertions(+), 138 deletions(-) diff --git a/attachment_delete_restrict/models/ir_attachment.py b/attachment_delete_restrict/models/ir_attachment.py index c59257e3dde..ecc06f5d5d0 100644 --- a/attachment_delete_restrict/models/ir_attachment.py +++ b/attachment_delete_restrict/models/ir_attachment.py @@ -11,14 +11,14 @@ class IrAttachment(models.Model): _inherit = "ir.attachment" def _check_delete_attachment(self, model, restrict, mode): - if restrict == "restrict": + if restrict == "owner": if self._check_restrict_delete_attachment(): return else: self._raise_restrict_validation_error() elif restrict == "custom": self._check_custom_delete_attachment(model, mode) - elif restrict == "restrict_custom": + elif restrict == "owner_custom": if self._check_restrict_delete_attachment(): return self._check_custom_delete_attachment(model, mode) diff --git a/attachment_delete_restrict/models/ir_model.py b/attachment_delete_restrict/models/ir_model.py index 411d695bb14..19173f558c6 100644 --- a/attachment_delete_restrict/models/ir_model.py +++ b/attachment_delete_restrict/models/ir_model.py @@ -5,11 +5,11 @@ RESTRICT_DELETE_ATTACH = [ ("default", "Use global configuration"), - ("restrict", "Restrict: Only creator and admin can delete them"), + ("owner", "Owner: Only creator and admin can delete them"), ("custom", "Custom: For each model, selected groups and users can " "delete them"), ( - "restrict_custom", - "Restrict + Custom: Creator and admin can delete them + for " + "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"), diff --git a/attachment_delete_restrict/models/res_config.py b/attachment_delete_restrict/models/res_config.py index a471829d799..1fe814e3e78 100644 --- a/attachment_delete_restrict/models/res_config.py +++ b/attachment_delete_restrict/models/res_config.py @@ -11,7 +11,7 @@ class ResConfigSettings(models.TransientModel): _inherit = "res.config.settings" global_restrict_delete_attachment = fields.Selection( - selection=RESTRICT_DELETE_ATTACH, + selection=RESTRICT_DELETE_ATTACH[1:], config_parameter="attachment_delete_restrict.global_restrict_delete_attachment", readonly=False, required=True, @@ -23,21 +23,19 @@ class ResConfigSettings(models.TransientModel): global_delete_attachment_group_ids = fields.Many2many( "res.groups", string="Attachment Deletion Groups", - relation="global_delete_attachment_group_rel", help="The users in the groups selected here can delete all the attachments.", readonly=False, compute="_compute_global_delete_attachment_group_ids", inverse="_inverse_global_delete_attachment_group_ids", ) global_delete_attachment_group_ids_str = fields.Char( - string="", + string="Attachment Deletion Groups (Technical storage field)", config_parameter="attachment_delete_restrict.global_delete_attachment_group_ids", ) global_delete_attachment_user_ids = fields.Many2many( "res.users", string="Attachment Deletion Users", - relation="global_delete_attachment_user_rel", help="The users selected here can delete all the attachments", readonly=False, compute="_compute_global_delete_attachment_user_ids", @@ -45,7 +43,7 @@ class ResConfigSettings(models.TransientModel): ) global_delete_attachment_user_ids_str = fields.Char( - string="", + string="Attachment Deletion Users (Technical storage field)", config_parameter="attachment_delete_restrict.global_delete_attachment_user_ids", ) diff --git a/attachment_delete_restrict/tests/test_attachment_delete_restrict.py b/attachment_delete_restrict/tests/test_attachment_delete_restrict.py index 386a3a588e8..330c9edb647 100644 --- a/attachment_delete_restrict/tests/test_attachment_delete_restrict.py +++ b/attachment_delete_restrict/tests/test_attachment_delete_restrict.py @@ -5,32 +5,89 @@ from odoo.tests import SavepointCase, 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_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_forbiden(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 TestAttachmentDeleteRestrict(SavepointCase): +class TestAttachmentDeleteAbstract(SavepointCase): @classmethod def setUpClass(cls): super().setUpClass() - cls.param = cls.env["ir.config_parameter"].sudo() + 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.test_group = cls.env["res.groups"].create({"name": "test group"}) - cls.test_user = cls.env["res.users"].create( + cls.group = cls.env.ref("base.group_user") + cls.user_owner = cls.env["res.users"].create( { - "name": "test user", - "login": "test@example.com", + "name": "test owner user", + "login": "test-owner@example.com", "groups_id": [(6, 0, cls.env.ref("base.group_user").ids)], } ) - cls.test_user2 = cls.env["res.users"].create( + cls.user = cls.env["res.users"].create( { - "name": "test user2", + "name": "test user", "login": "test2@example.com", "groups_id": [(6, 0, cls.env.ref("base.group_user").ids)], } ) - cls.test_admin = cls.env["res.users"].create( + cls.user_admin = cls.env["res.users"].create( { "name": "User admin", "login": "admin@example.com", @@ -46,12 +103,9 @@ def setUpClass(cls): ], } ) - cls.test_attachment = cls.env["ir.attachment"].create( - {"name": "test attachment", "type": "binary", "res_model": "res.partner"} - ) - cls.test_attachment_2 = ( + cls.attachment = ( cls.env["ir.attachment"] - .with_user(cls.test_user) + .with_user(cls.user_owner) .create( { "name": "test attachment 2", @@ -61,134 +115,42 @@ def setUpClass(cls): ) ) - def test_01_delete_attachment_unrestricted(self): - self.test_attachment.with_user(self.test_user).unlink() + def _set_restrict_mode(self, restrict_mode): + raise NotImplementedError - def test_01_bis_delete_attachment_unrestricted(self): - self.partner_model.write({"restrict_delete_attachment": "none"}) - self.test_attachment.with_user(self.test_user2).unlink() + def _allow_user(self): + raise NotImplementedError - def test_02_custom_delete_attachment_restricted_user_permitted(self): - self.partner_model.write({"restrict_delete_attachment": "custom"}) - with self.assertRaises(ValidationError): - self.test_attachment.with_user(self.test_user).unlink() - self.partner_model.write( - {"delete_attachment_user_ids": [(4, self.test_user.id)]} - ) - self.test_attachment.with_user(self.test_user).unlink() - - def test_03_custom_delete_attachment_restricted_group_permitted(self): - self.partner_model.write({"restrict_delete_attachment": "custom"}) - with self.assertRaises(ValidationError): - self.test_attachment.with_user(self.test_user).unlink() - self.partner_model.write( - {"delete_attachment_group_ids": [(4, self.test_group.id)]} - ) - with self.assertRaises(ValidationError): - self.test_attachment.with_user(self.test_user).unlink() - self.test_user.write({"groups_id": [(4, self.test_group.id)]}) - self.test_attachment.with_user(self.test_user).unlink() - - def test_04_restrict_owner_can_delete_attachment(self): - self.partner_model.write({"restrict_delete_attachment": "restrict"}) - test_attachment_2 = ( - self.env["ir.attachment"] - .with_user(self.test_user) - .create( - { - "name": "test attachment 2", - "type": "binary", - "res_model": "res.partner", - } - ) - ) - with self.assertRaises(ValidationError): - test_attachment_2.with_user(self.test_user2).unlink() - test_attachment_2.with_user(self.test_user).unlink() + def _allow_group(self): + raise NotImplementedError - def test_05_restrict_admin_can_delete_attachment(self): - self.partner_model.write({"restrict_delete_attachment": "restrict"}) - self.test_attachment.with_user(self.test_admin).unlink() - def test_06_global_restrict_restriction(self): +class TestAttachmentDeleteGlobal(TestAttachmentDeleteAbstract, AbstractCase): + def _set_restrict_mode(self, restrict_mode): self.param.set_param( - "attachment_delete_restrict.global_restrict_delete_attachment", "restrict" + "attachment_delete_restrict.global_restrict_delete_attachment", + restrict_mode, ) - with self.assertRaises(ValidationError): - self.test_attachment_2.with_user(self.test_user2).unlink() - self.test_attachment_2.with_user(self.test_user).unlink() - def test_07_global_custom_restriction_for_users(self): - self.param.set_param( - "attachment_delete_restrict.global_restrict_delete_attachment", "custom" - ) + def _allow_user(self): self.param.set_param( "attachment_delete_restrict.global_delete_attachment_user_ids", - self.test_user2.ids, + self.user.ids, ) - with self.assertRaises(ValidationError): - self.test_attachment.with_user(self.test_user).unlink() - self.test_attachment.with_user(self.test_user2).unlink() - def test_08_global_custom_restriction_for_groups(self): - self.param.set_param( - "attachment_delete_restrict.global_restrict_delete_attachment", "custom" - ) - with self.assertRaises(ValidationError): - self.test_attachment.with_user(self.test_user).unlink() + def _allow_group(self): self.param.set_param( "attachment_delete_restrict.global_delete_attachment_group_ids", - self.test_group.ids, + self.group.ids, ) - with self.assertRaises(ValidationError): - self.test_attachment.with_user(self.test_user).unlink() - self.test_user.write({"groups_id": [(4, self.test_group.id)]}) - self.test_attachment.with_user(self.test_user).unlink() - def test_09_global_none_restriction(self): - global_restrict = self.param.get_param( - "attachment_delete_restrict.global_restrict_delete_attachment" - ) - self.assertEqual(global_restrict, "none") - self.test_attachment.with_user(self.test_user).unlink() - def test_10_restrict_and_custom_delete_user(self): - self.partner_model.write({"restrict_delete_attachment": "restrict_custom"}) - with self.assertRaises(ValidationError): - self.test_attachment.with_user(self.test_user2).unlink() - self.partner_model.write( - {"delete_attachment_user_ids": [(4, self.test_user2.id)]} - ) - self.test_attachment.with_user(self.test_user2).unlink() +class TestAttachmentDeleteModel(TestAttachmentDeleteAbstract, AbstractCase): + def _set_restrict_mode(self, restrict_mode): + self.partner_model.write({"restrict_delete_attachment": restrict_mode}) - self.test_attachment_2.with_user(self.test_admin).unlink() - - def test_11_restrict_and_custom_delete_group(self): - self.param.set_param( - "attachment_delete_restrict.global_restrict_delete_attachment", - "restrict_custom", - ) - with self.assertRaises(ValidationError): - self.test_attachment.with_user(self.test_user).unlink() - self.test_user.write({"groups_id": [(4, self.test_group.id)]}) - self.param.set_param( - "attachment_delete_restrict.global_delete_attachment_group_ids", - self.test_group.ids, - ) - self.test_attachment.with_user(self.test_user).unlink() - self.test_attachment_2.with_user(self.test_admin).unlink() - - def test_12_default_model_restriction(self): - self.param.set_param( - "attachment_delete_restrict.global_restrict_delete_attachment", "custom" - ) - self.param.set_param( - "attachment_delete_restrict.global_delete_attachment_group_ids", - self.test_group.ids, - ) - self.partner_model.write({"restrict_delete_attachment": "default"}) - with self.assertRaises(ValidationError): - self.test_attachment.with_user(self.test_user).unlink() + def _allow_user(self): + self.partner_model.write({"delete_attachment_user_ids": [(4, self.user.id)]}) - self.test_user.write({"groups_id": [(4, self.test_group.id)]}) - self.test_attachment.with_user(self.test_user).unlink() + def _allow_group(self): + self.partner_model.write({"delete_attachment_group_ids": [(4, self.group.id)]}) diff --git a/attachment_delete_restrict/views/res_config_view.xml b/attachment_delete_restrict/views/res_config_view.xml index 83467fae029..0c6112c739b 100644 --- a/attachment_delete_restrict/views/res_config_view.xml +++ b/attachment_delete_restrict/views/res_config_view.xml @@ -25,7 +25,7 @@
Authorized Groups: From 4d9cd2544f7efedf54d2e922517b5fff8097737b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Sun, 10 Jul 2022 22:18:22 +0200 Subject: [PATCH 06/65] attachment_delete_restrict: refactor code --- attachment_delete_restrict/i18n/fr.po | 62 ++++----- .../models/ir_attachment.py | 121 ++++++++---------- attachment_delete_restrict/models/ir_model.py | 2 +- .../models/res_config.py | 66 +++++----- .../readme/CONFIGURE.rst | 15 ++- .../readme/CONTRIBUTORS.rst | 1 + .../views/res_config_view.xml | 10 -- 7 files changed, 117 insertions(+), 160 deletions(-) diff --git a/attachment_delete_restrict/i18n/fr.po b/attachment_delete_restrict/i18n/fr.po index 788669f25a4..3f58aec759b 100644 --- a/attachment_delete_restrict/i18n/fr.po +++ b/attachment_delete_restrict/i18n/fr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-19 07:58+0000\n" -"PO-Revision-Date: 2022-05-19 10:07+0200\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" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: \n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.1.1\n" #. module: attachment_delete_restrict #: model:ir.model,name:attachment_delete_restrict.model_res_groups @@ -29,7 +29,6 @@ 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_ir_model__global_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" @@ -44,7 +43,6 @@ 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_ir_model__global_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" @@ -75,7 +73,7 @@ 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 "" +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 @@ -86,16 +84,6 @@ msgstr "" msgid "Display Name" msgstr "Nom affiché" -#. module: attachment_delete_restrict -#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_group_ids_str -msgid "Global Delete Attachment Group Ids Str" -msgstr "Groupe avec droit de suppression de toutes les PJs" - -#. module: attachment_delete_restrict -#: model:ir.model.fields,field_description:attachment_delete_restrict.field_res_config_settings__global_delete_attachment_user_ids_str -msgid "Global Delete Attachment User Ids Str" -msgstr "Utilisateurs avec droit de suppression de toutes les PJs" - #. 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 @@ -127,14 +115,22 @@ 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__restrict_custom -#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__restrict_custom +#: 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 "" -"Restrict + Custom: Creator and admin can delete them + for each model, " +"Owner + Custom: Creator and admin can delete them + for each model, " "selected groups and users can delete them" msgstr "" -"Limité + personnalisé : Le propriétaire, les administrateurs et les " -"utilisateurs de certains groupes peuvent supprimer" +"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 @@ -151,13 +147,6 @@ msgstr "Suppression de PJs Limitée" msgid "Restrict Deletion on attachment" msgstr "Restreindre la suppression de PJs" -#. module: attachment_delete_restrict -#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__ir_model__restrict_delete_attachment__restrict -#: model:ir.model.fields.selection,name:attachment_delete_restrict.selection__res_config_settings__global_restrict_delete_attachment__restrict -msgid "Restrict: Only creator and admin can delete them" -msgstr "" -"Limité : Seuls le propriétaire et les administrateurs peuvent supprimer" - #. 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" @@ -175,7 +164,6 @@ msgstr "" "doit être à \"Personnalisé\" pour que cela s'active." #. module: attachment_delete_restrict -#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__global_delete_attachment_group_ids #: 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 "" @@ -202,7 +190,6 @@ msgstr "" "suppression de PJs\" doit être à \"Personnalisé\" pour que cela s'active." #. module: attachment_delete_restrict -#: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__global_delete_attachment_user_ids #: 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" @@ -213,6 +200,11 @@ 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,name:attachment_delete_restrict.model_res_users msgid "Users" @@ -240,13 +232,3 @@ msgstr "" "\n" "Utilisateurs ayant la permission:\n" "%s" - -#. 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" -"Only the owner and administrators can delete it." -msgstr "" -"Vous n'êtes pas autorisé à supprimer cette pièce jointe.\n" -"Seulement son créateur et les administrateurs ont le droit." diff --git a/attachment_delete_restrict/models/ir_attachment.py b/attachment_delete_restrict/models/ir_attachment.py index ecc06f5d5d0..a3a6d936441 100644 --- a/attachment_delete_restrict/models/ir_attachment.py +++ b/attachment_delete_restrict/models/ir_attachment.py @@ -1,7 +1,6 @@ # Copyright 2021 Quartile Limited # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from ast import literal_eval from odoo import _, models from odoo.exceptions import ValidationError @@ -10,86 +9,70 @@ class IrAttachment(models.Model): _inherit = "ir.attachment" - def _check_delete_attachment(self, model, restrict, mode): + 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": - if self._check_restrict_delete_attachment(): - return - else: - self._raise_restrict_validation_error() + self._check_owner_delete_attachment() elif restrict == "custom": - self._check_custom_delete_attachment(model, mode) + self._check_custom_delete_attachment(model) elif restrict == "owner_custom": - if self._check_restrict_delete_attachment(): - return - self._check_custom_delete_attachment(model, mode) + self._check_custom_delete_attachment(model, allow_owner_and_admin=True) - def _check_restrict_delete_attachment(self): - if self.create_uid == self.env.user or self.user_has_groups( - "base.group_system" - ): - return True - else: - return False - - def _check_custom_delete_attachment(self, model, mode): - if not model and mode != "global": - return - groups = model.delete_attachment_group_ids - users = model.delete_attachment_user_ids - param = self.env["ir.config_parameter"].sudo() - groups_ids = param.get_param( - "attachment_delete_restrict.global_delete_attachment_group_ids" - ) - users_ids = param.get_param( - "attachment_delete_restrict.global_delete_attachment_user_ids" - ) - if mode == "global": - if groups_ids: - groups = self.env["res.groups"].search( - [("id", "in", literal_eval(groups_ids))] - ) - if users_ids: - users = self.env["res.users"].search( - [("id", "in", literal_eval(users_ids))] - ) - if groups and self.env.user in groups.mapped("users"): - return - if users and self.env.user in users: - return - list_group = "\n".join(list(set(groups.mapped("users").mapped("name")))) - list_user = "\n".join(list(set(users.mapped("name")))) - user_names = list_group + list_user + 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" ) - % (user_names or "None") + % ("\n".join(allowed_users.mapped("name")) or "None") ) - def _raise_restrict_validation_error(self): - raise ValidationError( - _( - "You are not allowed to delete this attachment.\n" - "Only the owner and administrators can delete it." + def _check_owner_delete_attachment(self): + if not ( + self.create_uid == self.env.user + or self.user_has_groups("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): - for rec in self: - if not rec.res_model: - continue - model = self.env["ir.model"].search([("model", "=", rec.res_model)]) - model_restrict = model.restrict_delete_attachment - global_restrict = ( - self.env["ir.config_parameter"] - .sudo() - .get_param( - "attachment_delete_restrict.global_restrict_delete_attachment" - ) - ) - if model_restrict == "default": - rec._check_delete_attachment(model, global_restrict, "global") - elif model_restrict not in ["default", "none"]: - rec._check_delete_attachment(model, model_restrict, "model") + res_models = list(set(self.filtered("res_model").mapped("res_model"))) + if res_models: + models = self.env["ir.model"].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": + 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 index 19173f558c6..4006cc121e5 100644 --- a/attachment_delete_restrict/models/ir_model.py +++ b/attachment_delete_restrict/models/ir_model.py @@ -6,7 +6,7 @@ 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"), + ("custom", "Custom: For each model, selected groups and users can delete them"), ( "owner_custom", "Owner + Custom: Creator and admin can delete them + for " diff --git a/attachment_delete_restrict/models/res_config.py b/attachment_delete_restrict/models/res_config.py index 1fe814e3e78..2ec98b30fbe 100644 --- a/attachment_delete_restrict/models/res_config.py +++ b/attachment_delete_restrict/models/res_config.py @@ -2,6 +2,8 @@ # @author Kévin Roche # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from ast import literal_eval + from odoo import api, fields, models from .ir_model import RESTRICT_DELETE_ATTACH @@ -25,64 +27,62 @@ class ResConfigSettings(models.TransientModel): 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_group_ids_str = fields.Char( - string="Attachment Deletion Groups (Technical storage field)", - config_parameter="attachment_delete_restrict.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", ) - global_delete_attachment_user_ids_str = fields.Char( - string="Attachment Deletion Users (Technical storage field)", - config_parameter="attachment_delete_restrict.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_delete_attachment_group_ids_str") + @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 setting.global_delete_attachment_group_ids_str: - ids = setting.global_delete_attachment_group_ids_str.split(",") - setting.global_delete_attachment_group_ids = self.env[ - "res.groups" - ].search([("id", "in", ids)]) + 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: - if setting.global_delete_attachment_group_ids: - setting.global_delete_attachment_group_ids_str = ",".join( - str(setting.global_delete_attachment_group_ids.mapped("id")) - ) - else: - setting.global_delete_attachment_group_ids_str = "" + 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_delete_attachment_user_ids_str") + @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 setting.global_delete_attachment_user_ids_str: - ids = setting.global_delete_attachment_user_ids_str.split(",") - setting.global_delete_attachment_user_ids = self.env["res.user"].search( - [("id", "in", ids)] - ) + 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: - if setting.global_delete_attachment_user_ids: - setting.global_delete_attachment_user_ids_str = ",".join( - str(setting.global_delete_attachment_user_ids.mapped("id")) - ) - else: - setting.global_delete_attachment_user_ids_str = "" + 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/readme/CONFIGURE.rst b/attachment_delete_restrict/readme/CONFIGURE.rst index 332bb57d367..cbf3f027dfa 100644 --- a/attachment_delete_restrict/readme/CONFIGURE.rst +++ b/attachment_delete_restrict/readme/CONFIGURE.rst @@ -1,20 +1,21 @@ Select level: ============= #. Go to *Settings > General Settings> Permission section*. -#. Choose the level of *Restrict Delete Attachment* (strict by default). +#. Choose the level of *Restrict Delete Attachment* for all models by default or for models with "default" restriction level. -Three levels: +Five levels: ============= -* Strict : Owner and admins only (by default) +* Default : Use global configuration +* Owner : Owner and admins only * Custom : Certain groups or users per related model. -* Custom + Strict : Owner, admins and Certain groups or users per related model. +* Owner + Strict : Owner, admins and Certain groups or users per related model. * None : all users can delete them -Only Custom and Custom + Strict need specific configuration. +Only Owner and Custom + Strict need specific configuration on models. -For Custom and Custom + Strict levels: +For Custom and Owner + Strict levels: ====================================== -#. Go to *Settings > Techinical > Database Structure > Models*. +#. Go to *Settings > Technical > Database Structure > Models*. #. Open a model for which attachment deletion should be restricted. #. Select 'Restrict Attachment Deletion', and assign 'Attachment Deletion Groups' and/or 'Attachment Deletion Users' as necessary (if no assignment, no one can delete the diff --git a/attachment_delete_restrict/readme/CONTRIBUTORS.rst b/attachment_delete_restrict/readme/CONTRIBUTORS.rst index 374eca48aed..0da6714f3ef 100644 --- a/attachment_delete_restrict/readme/CONTRIBUTORS.rst +++ b/attachment_delete_restrict/readme/CONTRIBUTORS.rst @@ -1,2 +1,3 @@ * Yoshi Tashiro * Kévin Roche +* Sébastien BEAU diff --git a/attachment_delete_restrict/views/res_config_view.xml b/attachment_delete_restrict/views/res_config_view.xml index 0c6112c739b..2cf23695541 100644 --- a/attachment_delete_restrict/views/res_config_view.xml +++ b/attachment_delete_restrict/views/res_config_view.xml @@ -38,11 +38,6 @@ widget="many2many_tags" options="{'no_create': True}" /> - -
Authorized Users: @@ -54,12 +49,7 @@ widget="many2many_tags" options="{'no_create': True}" /> -
-
From 90229b45e11d22c021ac8c98018b79aa0e30c511 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Thu, 1 Sep 2022 07:54:51 +0000 Subject: [PATCH 07/65] [UPD] Update attachment_delete_restrict.pot --- .../i18n/attachment_delete_restrict.pot | 262 ++++++++++++++++++ attachment_delete_restrict/i18n/fr.po | 65 ++++- attachment_delete_restrict/i18n/ja.po | 219 ++++++++++++++- 3 files changed, 526 insertions(+), 20 deletions(-) create mode 100644 attachment_delete_restrict/i18n/attachment_delete_restrict.pot 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..4d93d4072e6 --- /dev/null +++ b/attachment_delete_restrict/i18n/attachment_delete_restrict.pot @@ -0,0 +1,262 @@ +# 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" +"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: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 +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 +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 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 +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. 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 +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 "" diff --git a/attachment_delete_restrict/i18n/fr.po b/attachment_delete_restrict/i18n/fr.po index 3f58aec759b..ccaf58a6442 100644 --- a/attachment_delete_restrict/i18n/fr.po +++ b/attachment_delete_restrict/i18n/fr.po @@ -57,11 +57,47 @@ msgstr "Groupes autorisés:" 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 @@ -111,15 +147,14 @@ msgstr "Modèles" #: 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" +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" +"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 " @@ -152,6 +187,15 @@ msgstr "Restreindre la suppression de PJs" 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 "" @@ -182,8 +226,8 @@ msgstr "" #: 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." +"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 " @@ -205,6 +249,15 @@ msgstr "Ces utilisateurs peuvent supprimer les pièces jointes de ce modèle." 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" diff --git a/attachment_delete_restrict/i18n/ja.po b/attachment_delete_restrict/i18n/ja.po index c5f194ef637..0dca63d19d8 100644 --- a/attachment_delete_restrict/i18n/ja.po +++ b/attachment_delete_restrict/i18n/ja.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * attachment_delete_restrict +# * attachment_delete_restrict # msgid "" msgstr "" @@ -10,6 +10,7 @@ msgstr "" "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" @@ -27,6 +28,7 @@ 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 "添付削除グループ" @@ -40,38 +42,218 @@ 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." -msgstr "ユーザはここで割り当てられたモデルの添付を削除することができます。" +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 "ここで選択されたグループのユーザはこのモデルに関連する添付を削除することができます。" +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." -msgstr "グループのユーザはここで割り当てられたモデルの添付を削除することができます。" +#, 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 "ここで選択されたユーザはこのモデルに関連する添付を削除することができます。" +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 @@ -80,18 +262,27 @@ 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 "選択された場合、このモデルに関連する添付の削除は許可されたユーザのみに制限されます。" +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:34 +#: code:addons/attachment_delete_restrict/models/ir_attachment.py:0 #, python-format -msgid "You are not allowed to delete this attachment.\n" +msgid "" +"You are not allowed to delete this attachment.\n" "\n" "Users with the delete permission:\n" "%s" -msgstr "この添付の削除権限がありません。\n" +msgstr "" +"この添付の削除権限がありません。\n" "\n" "削除権限を持つユーザ:\n" "%s" +#~ msgid "" +#~ "The user can delete the attachments related to the models assigned here." +#~ msgstr "ユーザはここで割り当てられたモデルの添付を削除することができます。" From 7d63001c0e9ca2c4cf4886b1e7532ef3d9563ba9 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 1 Sep 2022 08:02:28 +0000 Subject: [PATCH 08/65] [UPD] README.rst --- attachment_delete_restrict/README.rst | 46 +++++++++++--- .../static/description/index.html | 60 ++++++++++++++----- 2 files changed, 82 insertions(+), 24 deletions(-) diff --git a/attachment_delete_restrict/README.rst b/attachment_delete_restrict/README.rst index a8b8a5aa77f..20476887e6e 100644 --- a/attachment_delete_restrict/README.rst +++ b/attachment_delete_restrict/README.rst @@ -14,19 +14,18 @@ Restrict Deletion of Attachments :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/12.0/attachment_delete_restrict + :target: https://github.com/OCA/server-tools/tree/14.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-12-0/server-tools-12-0-attachment_delete_restrict + :target: https://translation.odoo-community.org/projects/server-tools-14-0/server-tools-14-0-attachment_delete_restrict :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/149/12.0 + :target: https://runbot.odoo-community.org/runbot/149/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| -This module provides the ability to restrict the deletion of the attachments to certain -groups or users per related model. +This module provides the ability to restrict the deletion of the attachments at different levels. **Table of contents** @@ -36,7 +35,24 @@ groups or users per related model. Configuration ============= -#. Go to *Settings > Techinical > Database Structure > Models*. +Select level: +============= +#. Go to *Settings > General Settings> Permission section*. +#. 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 + Strict : Owner, admins and Certain groups or users per related model. +* None : all users can delete them + +Only Owner and Custom + Strict need specific configuration on models. + +For Custom and Owner + Strict levels: +====================================== +#. Go to *Settings > Technical > Database Structure > Models*. #. Open a model for which attachment deletion should be restricted. #. Select 'Restrict Attachment Deletion', and assign 'Attachment Deletion Groups' and/or 'Attachment Deletion Users' as necessary (if no assignment, no one can delete the @@ -52,7 +68,7 @@ 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 smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -63,11 +79,14 @@ Authors ~~~~~~~ * Quartile Limited +* Akretion Contributors ~~~~~~~~~~~~ * Yoshi Tashiro +* Kévin Roche +* Sébastien BEAU Maintainers ~~~~~~~~~~~ @@ -82,6 +101,17 @@ 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. +.. |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/static/description/index.html b/attachment_delete_restrict/static/description/index.html index 3b9827967dc..1b362e77af7 100644 --- a/attachment_delete_restrict/static/description/index.html +++ b/attachment_delete_restrict/static/description/index.html @@ -367,26 +367,49 @@

Restrict Deletion of Attachments

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

-

This module provides the ability to restrict the deletion of the attachments to certain -groups or users per related model.

+

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

+

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

Table of contents

+
+

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 + Strict : Owner, admins and Certain groups or users per related model.
  • +
  • None : all users can delete them
  • +
+

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

+
+
+

For Custom and Owner + Strict levels:

    -
  1. Go to Settings > Techinical > Database Structure > Models.
  2. +
  3. Go to Settings > Technical > Database Structure > Models.
  4. Open a model for which attachment deletion should be restricted.
  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 @@ -397,35 +420,40 @@

    Configuration

    respective group/user form.

-

Bug Tracker

+

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 smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Quartile Limited
  • +
  • Akretion
-

Maintainers

+

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.

+

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.

From 5b3c742d1c5808718a3033f80f53c0a31ae17846 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 1 Sep 2022 08:02:29 +0000 Subject: [PATCH 09/65] [ADD] icon.png --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 attachment_delete_restrict/static/description/icon.png diff --git a/attachment_delete_restrict/static/description/icon.png b/attachment_delete_restrict/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From b8ba7f7cf4aeee21f97715e8e02870627e9225a6 Mon Sep 17 00:00:00 2001 From: Ignacio Buioli Date: Sun, 4 Sep 2022 03:26:16 +0000 Subject: [PATCH 10/65] Added translation using Weblate (Spanish (Argentina)) --- attachment_delete_restrict/i18n/es_AR.po | 263 +++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 attachment_delete_restrict/i18n/es_AR.po diff --git a/attachment_delete_restrict/i18n/es_AR.po b/attachment_delete_restrict/i18n/es_AR.po new file mode 100644 index 00000000000..3ca8dac423c --- /dev/null +++ b/attachment_delete_restrict/i18n/es_AR.po @@ -0,0 +1,263 @@ +# 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" +"Last-Translator: Automatically generated\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" + +#. 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 +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 +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 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 +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. 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 +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 "" From aa5c9d26b77427db6c68117aa02446b649e8e86e Mon Sep 17 00:00:00 2001 From: Ignacio Buioli Date: Sun, 4 Sep 2022 03:39:11 +0000 Subject: [PATCH 11/65] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (37 of 37 strings) Translation: server-tools-14.0/server-tools-14.0-attachment_delete_restrict Translate-URL: https://translation.odoo-community.org/projects/server-tools-14-0/server-tools-14-0-attachment_delete_restrict/es_AR/ --- attachment_delete_restrict/i18n/es_AR.po | 83 ++++++++++++++++-------- 1 file changed, 55 insertions(+), 28 deletions(-) diff --git a/attachment_delete_restrict/i18n/es_AR.po b/attachment_delete_restrict/i18n/es_AR.po index 3ca8dac423c..350126ff174 100644 --- a/attachment_delete_restrict/i18n/es_AR.po +++ b/attachment_delete_restrict/i18n/es_AR.po @@ -6,29 +6,31 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\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 "" +msgstr "Grupos de Acceso" #. module: attachment_delete_restrict #: model:ir.model,name:attachment_delete_restrict.model_ir_attachment msgid "Attachment" -msgstr "" +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 "" +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 @@ -36,23 +38,23 @@ msgstr "" #: 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 "" +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 "" +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 "" +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 "" +msgstr "Usuarios Autorizados:" #. module: attachment_delete_restrict #: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__changeset_change_ids @@ -61,7 +63,7 @@ msgstr "" #: 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 "" +msgstr "Cambios del Conjunto de Cambios" #. module: attachment_delete_restrict #: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__changeset_ids @@ -70,12 +72,12 @@ msgstr "" #: 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 "" +msgstr "Conjunto de Cambios" #. module: attachment_delete_restrict #: model:ir.model,name:attachment_delete_restrict.model_res_config_settings msgid "Config Settings" -msgstr "" +msgstr "Ajustes Configuración" #. module: attachment_delete_restrict #: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__count_pending_changeset_changes @@ -84,7 +86,7 @@ msgstr "" #: 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 "" +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 @@ -93,18 +95,20 @@ msgstr "" #: 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 "" +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 "" +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 @@ -113,7 +117,7 @@ msgstr "" #: 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 "" +msgstr "Mostrar Nombre" #. module: attachment_delete_restrict #: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment__id @@ -122,7 +126,7 @@ msgstr "" #: 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 "" +msgstr "ID" #. module: attachment_delete_restrict #: model:ir.model.fields,field_description:attachment_delete_restrict.field_ir_attachment____last_update @@ -131,18 +135,18 @@ msgstr "" #: 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 "" +msgstr "Última modificación en" #. module: attachment_delete_restrict #: model:ir.model,name:attachment_delete_restrict.model_ir_model msgid "Models" -msgstr "" +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 "" +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 @@ -151,32 +155,36 @@ 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 "" +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 "" +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 "" +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 "" +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 @@ -185,7 +193,7 @@ msgstr "" #: 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 "" +msgstr "Búsqueda Inteligente" #. module: attachment_delete_restrict #: model:ir.model.fields,help:attachment_delete_restrict.field_res_users__delete_attachment_model_ids @@ -194,11 +202,16 @@ msgid "" "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 @@ -206,6 +219,8 @@ 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 @@ -214,22 +229,28 @@ msgid "" "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 "" +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 "" +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 @@ -238,12 +259,12 @@ msgstr "" #: 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 "" +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 "" +msgstr "Usuarios" #. module: attachment_delete_restrict #: model:ir.model.fields,help:attachment_delete_restrict.field_ir_model__restrict_delete_attachment @@ -251,6 +272,8 @@ 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 @@ -261,3 +284,7 @@ msgid "" "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" From 2ad9eeab06f20fc67a5b1afcd3e5b23aac669ff6 Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 13 Feb 2023 16:22:50 +0000 Subject: [PATCH 12/65] [FIX] attachment_delete_restrict: adapt to Odoo permission change --- .../tests/test_attachment_delete_restrict.py | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/attachment_delete_restrict/tests/test_attachment_delete_restrict.py b/attachment_delete_restrict/tests/test_attachment_delete_restrict.py index 330c9edb647..d8d0ad2233f 100644 --- a/attachment_delete_restrict/tests/test_attachment_delete_restrict.py +++ b/attachment_delete_restrict/tests/test_attachment_delete_restrict.py @@ -72,19 +72,38 @@ def setUpClass(cls): "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": [(6, 0, cls.env.ref("base.group_user").ids)], + "groups_id": [ + ( + 6, + 0, + ( + 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": [(6, 0, cls.env.ref("base.group_user").ids)], + "groups_id": [ + ( + 6, + 0, + ( + cls.env.ref("base.group_user").id, + cls.env.ref("base.group_partner_manager").id, + ), + ) + ], } ) cls.user_admin = cls.env["res.users"].create( @@ -98,6 +117,7 @@ def setUpClass(cls): ( cls.env.ref("base.group_system").id, cls.env.ref("base.group_user").id, + cls.env.ref("base.group_partner_manager").id, ), ) ], @@ -111,6 +131,7 @@ def setUpClass(cls): "name": "test attachment 2", "type": "binary", "res_model": "res.partner", + "res_id": cls.partner_1.id, } ) ) From 58cc53a4a2f13dc179473c04d986751e8b100bb9 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 14 Feb 2023 08:34:08 +0000 Subject: [PATCH 13/65] attachment_delete_restrict 14.0.1.0.1 --- attachment_delete_restrict/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/attachment_delete_restrict/__manifest__.py b/attachment_delete_restrict/__manifest__.py index 040eb39a47d..459a7f78125 100644 --- a/attachment_delete_restrict/__manifest__.py +++ b/attachment_delete_restrict/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { "name": "Restrict Deletion of Attachments", - "version": "14.0.1.0.0", + "version": "14.0.1.0.1", "depends": [ "base", "base_setup", From 781997b3b58150f3199582678a0ed8c3e03f2abd Mon Sep 17 00:00:00 2001 From: Aungkokolin1997 Date: Fri, 7 Jul 2023 12:56:33 +0630 Subject: [PATCH 14/65] [MIG] attachment_delete_restrict: Migration to 16.0 --- attachment_delete_restrict/README.rst | 10 ++++---- attachment_delete_restrict/__manifest__.py | 4 ++-- .../migrations/14.0.1.0.0/post-migrate.py | 23 ------------------- .../migrations/14.0.1.0.0/pre-migrate.py | 16 ------------- .../models/ir_attachment.py | 2 +- .../static/description/index.html | 8 +++---- .../tests/test_attachment_delete_restrict.py | 4 ++-- ..._view.xml => res_config_setting_views.xml} | 0 8 files changed, 14 insertions(+), 53 deletions(-) delete mode 100644 attachment_delete_restrict/migrations/14.0.1.0.0/post-migrate.py delete mode 100644 attachment_delete_restrict/migrations/14.0.1.0.0/pre-migrate.py rename attachment_delete_restrict/views/{res_config_view.xml => res_config_setting_views.xml} (100%) diff --git a/attachment_delete_restrict/README.rst b/attachment_delete_restrict/README.rst index 20476887e6e..ae91e99c5f1 100644 --- a/attachment_delete_restrict/README.rst +++ b/attachment_delete_restrict/README.rst @@ -14,13 +14,13 @@ Restrict Deletion of Attachments :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/14.0/attachment_delete_restrict + :target: https://github.com/OCA/server-tools/tree/16.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-14-0/server-tools-14-0-attachment_delete_restrict + :target: https://translation.odoo-community.org/projects/server-tools-16-0/server-tools-16-0-attachment_delete_restrict :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/149/14.0 + :target: https://runbot.odoo-community.org/runbot/149/16.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -68,7 +68,7 @@ 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 smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -112,6 +112,6 @@ Current `maintainers `__: |maintainer-yostashiro| |maintainer-Kev-Roche| -This module is part of the `OCA/server-tools `_ project on GitHub. +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/__manifest__.py b/attachment_delete_restrict/__manifest__.py index 459a7f78125..698610f4425 100644 --- a/attachment_delete_restrict/__manifest__.py +++ b/attachment_delete_restrict/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { "name": "Restrict Deletion of Attachments", - "version": "14.0.1.0.1", + "version": "16.0.1.0.0", "depends": [ "base", "base_setup", @@ -16,7 +16,7 @@ "views/ir_model_views.xml", "views/res_groups_views.xml", "views/res_users_views.xml", - "views/res_config_view.xml", + "views/res_config_setting_views.xml", ], "installable": True, } diff --git a/attachment_delete_restrict/migrations/14.0.1.0.0/post-migrate.py b/attachment_delete_restrict/migrations/14.0.1.0.0/post-migrate.py deleted file mode 100644 index 5fe21510d99..00000000000 --- a/attachment_delete_restrict/migrations/14.0.1.0.0/post-migrate.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) 2022 Akretion (). -# @author Kévin Roche -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from openupgradelib import openupgrade - -from odoo.tools.sql import column_exists - - -@openupgrade.migrate() -def migrate(env, version): - if column_exists(env.cr, "ir_model", "migrated_restrict_delete_attachment"): - query = """ - SELECT id FROM ir_model WHERE migrated_restrict_delete_attachment = True - """ - env.cr.execute(query) - results = env.cr.fetchall() - models = env["ir.model"].search([("id", "in", results)]) - for model in models: - model.restrict_delete_attachment = "custom" - - query2 = "ALTER TABLE ir_model DROP COLUMN migrated_restrict_delete_attachment;" - env.cr.execute(query2) diff --git a/attachment_delete_restrict/migrations/14.0.1.0.0/pre-migrate.py b/attachment_delete_restrict/migrations/14.0.1.0.0/pre-migrate.py deleted file mode 100644 index 61c6e2221bb..00000000000 --- a/attachment_delete_restrict/migrations/14.0.1.0.0/pre-migrate.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (C) 2022 Akretion (). -# @author Kévin Roche -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - - -from odoo.tools.sql import column_exists, rename_column - - -def migrate(cr, version): - if column_exists(cr, "ir_model", "restrict_delete_attachment"): - rename_column( - cr, - "ir_model", - "restrict_delete_attachment", - "migrated_restrict_delete_attachment", - ) diff --git a/attachment_delete_restrict/models/ir_attachment.py b/attachment_delete_restrict/models/ir_attachment.py index a3a6d936441..8b8077afec7 100644 --- a/attachment_delete_restrict/models/ir_attachment.py +++ b/attachment_delete_restrict/models/ir_attachment.py @@ -66,7 +66,7 @@ def _check_custom_delete_attachment(self, model=None, allow_owner_and_admin=Fals def unlink(self): res_models = list(set(self.filtered("res_model").mapped("res_model"))) if res_models: - models = self.env["ir.model"].search([("model", "in", 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: diff --git a/attachment_delete_restrict/static/description/index.html b/attachment_delete_restrict/static/description/index.html index 1b362e77af7..2962e9d7c1e 100644 --- a/attachment_delete_restrict/static/description/index.html +++ b/attachment_delete_restrict/static/description/index.html @@ -3,7 +3,7 @@ - + Restrict Deletion of Attachments + + +
+

Sequence from Python expression

+ + +

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

+

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 smashing 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..29a083da5d4 --- /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 SavepointCase + + +class TestIrSequence(SavepointCase): + @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.assertEquals(self.sequence.python_code_preview, "AB01C") + next_number = self.sequence._next() + self.assertEquals(next_number, "AB01C") + next_number = self.sequence._next() + self.assertEquals(next_number, "AB02C") + + def test_nogap_sequence(self): + self.sequence.write(dict(implementation="no_gap")) + next_number = self.sequence._next() + self.assertEquals(next_number, "AB01C") + next_number = self.sequence._next() + self.assertEquals(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..743a628b8e0 --- /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

+
+
+
+
+
+
From 28e96522a2186d2fdc25cc2a5cc12c0a778f159d Mon Sep 17 00:00:00 2001 From: Francesco Apruzzese Date: Thu, 23 Sep 2021 16:55:03 +0200 Subject: [PATCH 25/65] [MIG] sequence_python: Migration to 14.0 --- sequence_python/README.rst | 11 +++++----- sequence_python/__manifest__.py | 2 +- sequence_python/i18n/sequence_python.pot | 22 ++++++++++++++++++- sequence_python/models/ir_sequence.py | 15 +++++++++---- sequence_python/readme/CONTRIBUTORS.rst | 1 + sequence_python/static/description/index.html | 7 +++--- sequence_python/tests/test_ir_sequence.py | 11 +++++----- 7 files changed, 50 insertions(+), 19 deletions(-) diff --git a/sequence_python/README.rst b/sequence_python/README.rst index 51a1cdbd471..ae63ee5e916 100644 --- a/sequence_python/README.rst +++ b/sequence_python/README.rst @@ -14,13 +14,13 @@ Sequence from Python expression :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/13.0/sequence_python + :target: https://github.com/OCA/server-tools/tree/14.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-13-0/server-tools-13-0-sequence_python + :target: https://translation.odoo-community.org/projects/server-tools-14-0/server-tools-14-0-sequence_python :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/149/13.0 + :target: https://runbot.odoo-community.org/runbot/149/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -78,7 +78,7 @@ 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 smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -94,6 +94,7 @@ Contributors ~~~~~~~~~~~~ * Tom Blauwendraat +* Francesco Apruzzese Maintainers ~~~~~~~~~~~ @@ -108,6 +109,6 @@ 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. +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/__manifest__.py b/sequence_python/__manifest__.py index 9b6b1eeb83e..0365689a90d 100644 --- a/sequence_python/__manifest__.py +++ b/sequence_python/__manifest__.py @@ -5,7 +5,7 @@ "summary": """Calculate a sequence number from a Python expression""", "author": "Sunflower IT,Odoo Community Association (OCA)", "website": "https://github.com/OCA/server-tools", - "version": "13.0.1.0.0", + "version": "14.0.1.0.0", "license": "AGPL-3", "category": "Generic Modules", "depends": ["base"], diff --git a/sequence_python/i18n/sequence_python.pot b/sequence_python/i18n/sequence_python.pot index 87cb2ef655e..38107f936f4 100644 --- a/sequence_python/i18n/sequence_python.pot +++ b/sequence_python/i18n/sequence_python.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" +"Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -55,11 +55,26 @@ msgstr "" 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" @@ -80,6 +95,11 @@ msgstr "" 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 "" diff --git a/sequence_python/models/ir_sequence.py b/sequence_python/models/ir_sequence.py index 7c1535e7b00..4da75f9fc38 100644 --- a/sequence_python/models/ir_sequence.py +++ b/sequence_python/models/ir_sequence.py @@ -4,9 +4,10 @@ import random import string import uuid +from inspect import getmembers, isclass, isfunction from odoo import fields, models -from odoo.tools import safe_eval +from odoo.tools.safe_eval import safe_eval, wrap_module _logger = logging.getLogger(__name__) @@ -40,13 +41,19 @@ def _get_python_eval_context(self, number_next): 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__) return { "number": number_next[0] if isinstance(number_next, tuple) else number_next, "number_padded": "%%0%sd" % self.padding % number_next, "sequence": self, - "random": random, - "uuid": uuid, - "string": string, + "random": wrap_random, + "uuid": wrap_uuid, + "string": wrap_string, } def _get_python_value(self, number_next): diff --git a/sequence_python/readme/CONTRIBUTORS.rst b/sequence_python/readme/CONTRIBUTORS.rst index 68c0876aa4b..fa027040f9c 100644 --- a/sequence_python/readme/CONTRIBUTORS.rst +++ b/sequence_python/readme/CONTRIBUTORS.rst @@ -1 +1,2 @@ * Tom Blauwendraat +* Francesco Apruzzese diff --git a/sequence_python/static/description/index.html b/sequence_python/static/description/index.html index ce598bd4d49..64b6758cd76 100644 --- a/sequence_python/static/description/index.html +++ b/sequence_python/static/description/index.html @@ -367,7 +367,7 @@

Sequence from Python expression

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

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 @@ -422,7 +422,7 @@

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 smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -437,6 +437,7 @@

Authors

Contributors

@@ -446,7 +447,7 @@

Maintainers

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.

+

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/test_ir_sequence.py b/sequence_python/tests/test_ir_sequence.py index 29a083da5d4..6dd5835929a 100644 --- a/sequence_python/tests/test_ir_sequence.py +++ b/sequence_python/tests/test_ir_sequence.py @@ -25,15 +25,16 @@ def setUpClass(cls): ) def test_standard_sequence(self): - self.assertEquals(self.sequence.python_code_preview, "AB01C") + # import pdb;pdb.set_trace() + self.assertEqual(self.sequence.python_code_preview, "AB01C") next_number = self.sequence._next() - self.assertEquals(next_number, "AB01C") + self.assertEqual(next_number, "AB01C") next_number = self.sequence._next() - self.assertEquals(next_number, "AB02C") + self.assertEqual(next_number, "AB02C") def test_nogap_sequence(self): self.sequence.write(dict(implementation="no_gap")) next_number = self.sequence._next() - self.assertEquals(next_number, "AB01C") + self.assertEqual(next_number, "AB01C") next_number = self.sequence._next() - self.assertEquals(next_number, "AB02C") + self.assertEqual(next_number, "AB02C") From cae773c0551ad22dca81537aa2250fc25808a8bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dept=2E=20T=C3=A9cnico?= Date: Mon, 14 Feb 2022 11:27:56 +0000 Subject: [PATCH 26/65] Added translation using Weblate (Catalan) --- sequence_python/i18n/ca.po | 129 +++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 sequence_python/i18n/ca.po 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 "" From 4ddd6f115fd841e6e6b708009da77e2af8b8fa41 Mon Sep 17 00:00:00 2001 From: Ignacio Buioli Date: Sun, 4 Sep 2022 22:28:27 +0000 Subject: [PATCH 27/65] Added translation using Weblate (Spanish (Argentina)) --- sequence_python/i18n/es_AR.po | 129 ++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 sequence_python/i18n/es_AR.po diff --git a/sequence_python/i18n/es_AR.po b/sequence_python/i18n/es_AR.po new file mode 100644 index 00000000000..28c895deed2 --- /dev/null +++ b/sequence_python/i18n/es_AR.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: 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" + +#. 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 "" From c2c5e2bb43b0846cc3cc16943dfb22206e89574b Mon Sep 17 00:00:00 2001 From: Ignacio Buioli Date: Sun, 4 Sep 2022 22:35:30 +0000 Subject: [PATCH 28/65] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (21 of 21 strings) Translation: server-tools-14.0/server-tools-14.0-sequence_python Translate-URL: https://translation.odoo-community.org/projects/server-tools-14-0/server-tools-14-0-sequence_python/es_AR/ --- sequence_python/i18n/es_AR.po | 44 ++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/sequence_python/i18n/es_AR.po b/sequence_python/i18n/es_AR.po index 28c895deed2..22bc069b2bd 100644 --- a/sequence_python/i18n/es_AR.po +++ b/sequence_python/i18n/es_AR.po @@ -6,24 +6,27 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\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 "" +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 @@ -31,11 +34,14 @@ 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 @@ -43,6 +49,8 @@ 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 @@ -50,56 +58,58 @@ 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 "" +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 "" +msgstr "Mostrar Nombre" #. module: sequence_python #: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view msgid "Help with Python expressions" -msgstr "" +msgstr "Ayuda con expresiones Python" #. module: sequence_python #: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__id msgid "ID" -msgstr "" +msgstr "ID" #. module: sequence_python #: model:ir.model.fields,field_description:sequence_python.field_ir_sequence____last_update msgid "Last Modified on" -msgstr "" +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 "" +msgstr "Previsualización" #. module: sequence_python #: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view msgid "Python Code" -msgstr "" +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 "" +msgstr "Expresión de Python" #. module: sequence_python #: model:ir.model,name:sequence_python.model_ir_sequence msgid "Sequence" -msgstr "" +msgstr "Secuencia" #. module: sequence_python #: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__smart_search msgid "Smart Search" -msgstr "" +msgstr "Búsqueda Inteligente" #. module: sequence_python #: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view @@ -107,23 +117,25 @@ 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 "" +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 "" +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 "" +msgstr "Funciones de Python incorporadas" #. module: sequence_python #: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view msgid "number" -msgstr "" +msgstr "number" From 25ad8ec8cd41b6f68fccd758f1511ac5a5818075 Mon Sep 17 00:00:00 2001 From: Emeric Panisset Date: Wed, 30 Nov 2022 15:00:05 +0100 Subject: [PATCH 29/65] [MIG] sequence_python: Migration to 15.0 --- sequence_python/README.rst | 23 ++++---- sequence_python/__manifest__.py | 2 +- sequence_python/i18n/sequence_python.pot | 22 +------- sequence_python/static/description/index.html | 53 ++++++++++--------- 4 files changed, 42 insertions(+), 58 deletions(-) diff --git a/sequence_python/README.rst b/sequence_python/README.rst index ae63ee5e916..810ffff2e0c 100644 --- a/sequence_python/README.rst +++ b/sequence_python/README.rst @@ -2,10 +2,13 @@ Sequence from Python expression =============================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:a8de58fae139e80e530b657b68f0b305d59789a34359e5932317ec82f227b0eb + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -14,16 +17,16 @@ Sequence from Python expression :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/14.0/sequence_python + :target: https://github.com/OCA/server-tools/tree/15.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-14-0/server-tools-14-0-sequence_python + :target: https://translation.odoo-community.org/projects/server-tools-15-0/server-tools-15-0-sequence_python :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/149/14.0 - :alt: Try me on Runbot +.. |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=15.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module allows to generate a sequence by a Python formula expression. @@ -77,8 +80,8 @@ 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 smashing it by providing a detailed and welcomed -`feedback `_. +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. @@ -109,6 +112,6 @@ 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. +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/__manifest__.py b/sequence_python/__manifest__.py index 0365689a90d..58948382c7a 100644 --- a/sequence_python/__manifest__.py +++ b/sequence_python/__manifest__.py @@ -5,7 +5,7 @@ "summary": """Calculate a sequence number from a Python expression""", "author": "Sunflower IT,Odoo Community Association (OCA)", "website": "https://github.com/OCA/server-tools", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "license": "AGPL-3", "category": "Generic Modules", "depends": ["base"], diff --git a/sequence_python/i18n/sequence_python.pot b/sequence_python/i18n/sequence_python.pot index 38107f936f4..2f0749c8ed5 100644 --- a/sequence_python/i18n/sequence_python.pot +++ b/sequence_python/i18n/sequence_python.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -55,26 +55,11 @@ msgstr "" 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" @@ -95,11 +80,6 @@ msgstr "" 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 "" diff --git a/sequence_python/static/description/index.html b/sequence_python/static/description/index.html index 64b6758cd76..a0a4dda84ab 100644 --- a/sequence_python/static/description/index.html +++ b/sequence_python/static/description/index.html @@ -1,20 +1,19 @@ - - + Sequence from Python expression + + +
+

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.

+
+
+
+ + From 5d9d85e76432a847b4e56bd52d80c9405809c42f Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Thu, 21 Nov 2024 11:59:52 +0100 Subject: [PATCH 37/65] [BACKPORT] odoo_test_xmlrunner to 16.0 Also implement a better patch and merge test results. --- odoo_test_xmlrunner/README.rst | 20 +++--- odoo_test_xmlrunner/__init__.py | 2 +- odoo_test_xmlrunner/__manifest__.py | 2 +- odoo_test_xmlrunner/odoo_tests/__init__.py | 2 +- odoo_test_xmlrunner/odoo_tests/loader.py | 68 +++++++++++-------- odoo_test_xmlrunner/readme/CONFIGURATION.md | 2 +- odoo_test_xmlrunner/readme/CREDITS.md | 6 +- odoo_test_xmlrunner/readme/DESCRIPTION.md | 2 +- odoo_test_xmlrunner/readme/INSTALL.md | 2 +- odoo_test_xmlrunner/readme/USAGE.md | 2 +- .../static/description/index.html | 23 ++++--- 11 files changed, 79 insertions(+), 52 deletions(-) diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst index c8d5c9881e5..e4bd556217d 100644 --- a/odoo_test_xmlrunner/README.rst +++ b/odoo_test_xmlrunner/README.rst @@ -7,7 +7,7 @@ Unittest xUnit reports !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:782b2ed22876a72d28e0e67c5ff949d6d104c2da4bd0cf36ca7dbf3597900604 + !! source digest: sha256:c168ead1259f832fbcdbe238c9bd5a9eb692d3e0c712130ab2103e4a2dcba36b !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -17,13 +17,13 @@ Unittest xUnit reports :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/17.0/odoo_test_xmlrunner + :target: https://github.com/OCA/server-tools/tree/16.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-17-0/server-tools-17-0-odoo_test_xmlrunner + :target: https://translation.odoo-community.org/projects/server-tools-16-0/server-tools-16-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=17.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=16.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -164,7 +164,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -179,9 +179,13 @@ Authors Other credits ------------- -- `Smile `__: +- `Smile `__: - - Martin Deconinck martin.deconinck@smile.fr + - Martin Deconinck martin.deconinck@smile.fr + +- `Akretion `__: + + - Florian Mounier florian.mounier@akretion.com Maintainers ----------- @@ -196,6 +200,6 @@ 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. +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 index 48ff93bf29f..382130c7586 100644 --- a/odoo_test_xmlrunner/__init__.py +++ b/odoo_test_xmlrunner/__init__.py @@ -1 +1 @@ -from . import odoo_tests # F401 imported but unused +from . import odoo_tests # F401 imported but unused diff --git a/odoo_test_xmlrunner/__manifest__.py b/odoo_test_xmlrunner/__manifest__.py index 21e67c9a0e7..3425fb207e5 100644 --- a/odoo_test_xmlrunner/__manifest__.py +++ b/odoo_test_xmlrunner/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Unittest xUnit reports", - "version": "17.0.1.0.0", + "version": "16.0.1.0.0", "depends": ["base"], "author": "Smile, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/odoo_test_xmlrunner/odoo_tests/__init__.py b/odoo_test_xmlrunner/odoo_tests/__init__.py index 4ad46195b0f..571c37ecce6 100644 --- a/odoo_test_xmlrunner/odoo_tests/__init__.py +++ b/odoo_test_xmlrunner/odoo_tests/__init__.py @@ -1 +1 @@ -from . import loader # F401 imported but unused +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 index 1e8ab4590d4..297e54ceffa 100644 --- a/odoo_test_xmlrunner/odoo_tests/loader.py +++ b/odoo_test_xmlrunner/odoo_tests/loader.py @@ -1,33 +1,47 @@ import os -import threading +from unittest.mock import patch -import xmlrunner +from xmlrunner import XMLTestRunner +from xmlrunner.result import _XMLTestResult -from odoo.tests import loader as odoo_loader from odoo.tests.result import OdooTestResult +from odoo.tests.suite import OdooSuite from odoo.tools import config - -def new_run_suite(suite, module_name=None): - # 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) - - # avoid dependency hell - from odoo.modules import module - - module.current_test = module_name - threading.current_thread().testing = True - results = OdooTestResult() - - # Override : XMLTestRunner to run the tests and generate XML reports - xmlrunner.XMLTestRunner(output=test_result_directory, verbosity=2).run(suite) - - threading.current_thread().testing = False - module.current_test = None - return results - - -odoo_loader.run_suite = new_run_suite +if config["test_enable"]: + 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 + with patch.object(self, "run", lambda result: unpatched_run(self, result)): + # Override : XMLTestRunner to run the tests and generate XML reports + results = XMLTestRunner( + output=test_result_directory, + verbosity=2, + ).run(self) + + result.update(results) + return result + + patch("odoo.tests.suite.OdooSuite.run", run).start() + + 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) + + patch("odoo.tests.result.OdooTestResult.update", update).start() diff --git a/odoo_test_xmlrunner/readme/CONFIGURATION.md b/odoo_test_xmlrunner/readme/CONFIGURATION.md index aa2c51f2d0a..ebd8c0c3852 100644 --- a/odoo_test_xmlrunner/readme/CONFIGURATION.md +++ b/odoo_test_xmlrunner/readme/CONFIGURATION.md @@ -1,2 +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. \ No newline at end of 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 index 41c88d09352..25c6a27a7d8 100644 --- a/odoo_test_xmlrunner/readme/CREDITS.md +++ b/odoo_test_xmlrunner/readme/CREDITS.md @@ -1,2 +1,4 @@ -* [Smile](https://smile.eu/fr): - * Martin Deconinck \ No newline at end of file +- [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 index 16d28d3c5f9..a6e2fc9ef35 100644 --- a/odoo_test_xmlrunner/readme/DESCRIPTION.md +++ b/odoo_test_xmlrunner/readme/DESCRIPTION.md @@ -1 +1 @@ -This module generate unittest reports using unittest-xml-reporting tool. \ No newline at end of file +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 index 8079d04b1d7..bd127a850b9 100644 --- a/odoo_test_xmlrunner/readme/INSTALL.md +++ b/odoo_test_xmlrunner/readme/INSTALL.md @@ -1,3 +1,3 @@ Install python library https://pypi.org/project/unittest-xml-reporting/ -The module is automatically installed on the Odoo instance. \ No newline at end of file +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 index 647f60df8fd..6e22e01c08a 100644 --- a/odoo_test_xmlrunner/readme/USAGE.md +++ b/odoo_test_xmlrunner/readme/USAGE.md @@ -105,4 +105,4 @@ jobs: with: report_paths: 'test_results/*.xml' -``` \ No newline at end of file +``` diff --git a/odoo_test_xmlrunner/static/description/index.html b/odoo_test_xmlrunner/static/description/index.html index e545c902885..c71e686f9ed 100644 --- a/odoo_test_xmlrunner/static/description/index.html +++ b/odoo_test_xmlrunner/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -366,9 +367,9 @@

Unittest xUnit reports

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

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

+

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

@@ -511,7 +512,7 @@

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.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -529,16 +530,22 @@

Other credits

  • Martin Deconinck martin.deconinck@smile.fr
  • +
  • Akretion: +
  • Maintainers

    This module is maintained by the OCA.

    -Odoo Community Association + +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.

    +

    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.

    From baff1f130b40f3169ff9744814dbd48feb32901f Mon Sep 17 00:00:00 2001 From: oca-ci Date: Fri, 27 Dec 2024 09:22:18 +0000 Subject: [PATCH 38/65] [UPD] Update odoo_test_xmlrunner.pot --- odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot 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..78d58d53fe0 --- /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 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" From b2543664dfd532961840aba5f89a9e052b3d7901 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 27 Dec 2024 09:30:37 +0000 Subject: [PATCH 39/65] [BOT] post-merge updates --- odoo_test_xmlrunner/static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 odoo_test_xmlrunner/static/description/icon.png diff --git a/odoo_test_xmlrunner/static/description/icon.png b/odoo_test_xmlrunner/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From 398280c0a22a20f459acfe11c7b4ea0ec32a603e Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Wed, 8 Jan 2025 23:24:59 +0100 Subject: [PATCH 40/65] [FIX] odoo_test_xmlrunner: set auto_install to False. - It doesn't make sense to make this module auto installable. - As the module depends only on 'base' AND introduces a new external dependency to an extra library (unittest-xml-reporting) all the instances that are cloning server-tools repo will have trouble, because it will not be possible to install this module, due to missing dependency --- odoo_test_xmlrunner/README.rst | 8 ++++---- odoo_test_xmlrunner/__manifest__.py | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst index e4bd556217d..b3d6961392d 100644 --- a/odoo_test_xmlrunner/README.rst +++ b/odoo_test_xmlrunner/README.rst @@ -179,13 +179,13 @@ Authors Other credits ------------- -- `Smile `__: +- `Smile `__: - - Martin Deconinck martin.deconinck@smile.fr + - Martin Deconinck martin.deconinck@smile.fr -- `Akretion `__: +- `Akretion `__: - - Florian Mounier florian.mounier@akretion.com + - Florian Mounier florian.mounier@akretion.com Maintainers ----------- diff --git a/odoo_test_xmlrunner/__manifest__.py b/odoo_test_xmlrunner/__manifest__.py index 3425fb207e5..09358b62e11 100644 --- a/odoo_test_xmlrunner/__manifest__.py +++ b/odoo_test_xmlrunner/__manifest__.py @@ -10,7 +10,6 @@ "website": "https://github.com/OCA/server-tools", "category": "Tools", "sequence": 20, - "auto_install": True, "installable": True, "application": False, "external_dependencies": { From d368d934fc41dc95dabec49c4c81a94eb9fe33b0 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 8 Jan 2025 22:34:38 +0000 Subject: [PATCH 41/65] [BOT] post-merge updates --- odoo_test_xmlrunner/README.rst | 10 +++++----- odoo_test_xmlrunner/__manifest__.py | 2 +- odoo_test_xmlrunner/static/description/index.html | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst index b3d6961392d..4dc21559332 100644 --- a/odoo_test_xmlrunner/README.rst +++ b/odoo_test_xmlrunner/README.rst @@ -7,7 +7,7 @@ Unittest xUnit reports !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:c168ead1259f832fbcdbe238c9bd5a9eb692d3e0c712130ab2103e4a2dcba36b + !! source digest: sha256:dc5901a41067fac6a375c2ba99ceaf485afc9273c2248b73255cc1b99e6fddcf !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -179,13 +179,13 @@ Authors Other credits ------------- -- `Smile `__: +- `Smile `__: - - Martin Deconinck martin.deconinck@smile.fr + - Martin Deconinck martin.deconinck@smile.fr -- `Akretion `__: +- `Akretion `__: - - Florian Mounier florian.mounier@akretion.com + - Florian Mounier florian.mounier@akretion.com Maintainers ----------- diff --git a/odoo_test_xmlrunner/__manifest__.py b/odoo_test_xmlrunner/__manifest__.py index 09358b62e11..88569e6be15 100644 --- a/odoo_test_xmlrunner/__manifest__.py +++ b/odoo_test_xmlrunner/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Unittest xUnit reports", - "version": "16.0.1.0.0", + "version": "16.0.1.0.1", "depends": ["base"], "author": "Smile, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/odoo_test_xmlrunner/static/description/index.html b/odoo_test_xmlrunner/static/description/index.html index c71e686f9ed..f2d8d581973 100644 --- a/odoo_test_xmlrunner/static/description/index.html +++ b/odoo_test_xmlrunner/static/description/index.html @@ -367,7 +367,7 @@

    Unittest xUnit reports

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

    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.

    From 0b103b7f1a921087bba1c6434186ebf0c058db3d Mon Sep 17 00:00:00 2001 From: mymage Date: Fri, 10 Jan 2025 12:29:52 +0000 Subject: [PATCH 42/65] Added translation using Weblate (Italian) --- odoo_test_xmlrunner/i18n/it.po | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 odoo_test_xmlrunner/i18n/it.po 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" From f9de3deb8fab9734ab0369cd0e63ff3e43867cef Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Tue, 30 Sep 2025 14:51:17 +0200 Subject: [PATCH 43/65] [IMP] odoo_test_xmlrunner: pre-commit auto fixes --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index c7931f3cd0d..f12f1f9f201 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,3 +8,4 @@ openupgradelib paramiko<4.0.0 pysftp sentry_sdk>=2.0.0,<=2.22.0 +unittest-xml-reporting From 3316296d93fd9baad25b8423ea6c68b3035342ad Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Tue, 30 Sep 2025 15:18:45 +0200 Subject: [PATCH 44/65] [MIG] odoo_test_xmlrunner: Migration to 18.0 --- odoo_test_xmlrunner/README.rst | 10 +++++----- odoo_test_xmlrunner/__manifest__.py | 2 +- odoo_test_xmlrunner/static/description/index.html | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst index 4dc21559332..c3bef9dafd2 100644 --- a/odoo_test_xmlrunner/README.rst +++ b/odoo_test_xmlrunner/README.rst @@ -17,13 +17,13 @@ Unittest xUnit reports :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/16.0/odoo_test_xmlrunner + :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-16-0/server-tools-16-0-odoo_test_xmlrunner + :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=16.0 + :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| @@ -164,7 +164,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -200,6 +200,6 @@ 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. +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/__manifest__.py b/odoo_test_xmlrunner/__manifest__.py index 88569e6be15..395b79fc803 100644 --- a/odoo_test_xmlrunner/__manifest__.py +++ b/odoo_test_xmlrunner/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Unittest xUnit reports", - "version": "16.0.1.0.1", + "version": "18.0.1.0.0", "depends": ["base"], "author": "Smile, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/odoo_test_xmlrunner/static/description/index.html b/odoo_test_xmlrunner/static/description/index.html index f2d8d581973..cb3de94c822 100644 --- a/odoo_test_xmlrunner/static/description/index.html +++ b/odoo_test_xmlrunner/static/description/index.html @@ -369,7 +369,7 @@

    Unittest xUnit reports

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:dc5901a41067fac6a375c2ba99ceaf485afc9273c2248b73255cc1b99e6fddcf !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

    +

    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

    @@ -512,7 +512,7 @@

    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.

    +feedback.

    Do not contact contributors directly about support or help with technical issues.

    @@ -545,7 +545,7 @@

    Maintainers

    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.

    +

    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.

    From 54cd4649ea53ccc08c2bd03bb9585c1f19ec46d9 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Tue, 30 Sep 2025 15:19:40 +0200 Subject: [PATCH 45/65] [FIX] odoo_test_xmlrunner: Import odoo tests only in test mode This removes the new warning in 18.0 --- odoo_test_xmlrunner/odoo_tests/loader.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/odoo_test_xmlrunner/odoo_tests/loader.py b/odoo_test_xmlrunner/odoo_tests/loader.py index 297e54ceffa..a6f96102bfd 100644 --- a/odoo_test_xmlrunner/odoo_tests/loader.py +++ b/odoo_test_xmlrunner/odoo_tests/loader.py @@ -1,14 +1,15 @@ import os from unittest.mock import patch -from xmlrunner import XMLTestRunner -from xmlrunner.result import _XMLTestResult - -from odoo.tests.result import OdooTestResult -from odoo.tests.suite import OdooSuite 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): From b993275eedc6a5a0dadb3553d90faf4dd4aedb48 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Tue, 30 Sep 2025 15:21:27 +0200 Subject: [PATCH 46/65] [FIX] odoo_test_xmlrunner: Patch manually to avoid patch being restored at test end --- odoo_test_xmlrunner/odoo_tests/loader.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/odoo_test_xmlrunner/odoo_tests/loader.py b/odoo_test_xmlrunner/odoo_tests/loader.py index a6f96102bfd..5ce61cc4e23 100644 --- a/odoo_test_xmlrunner/odoo_tests/loader.py +++ b/odoo_test_xmlrunner/odoo_tests/loader.py @@ -1,5 +1,4 @@ import os -from unittest.mock import patch from odoo.tools import config @@ -21,17 +20,21 @@ def run(self, result): # Suite run method will be called by the XMLTestRunner, # so we need to run the original run method - with patch.object(self, "run", lambda result: unpatched_run(self, result)): - # Override : XMLTestRunner to run the tests and generate XML reports + 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 - patch("odoo.tests.suite.OdooSuite.run", run).start() + OdooSuite.run = run unpatched_update = OdooTestResult.update @@ -45,4 +48,4 @@ def update(self, other): else: unpatched_update(self, other) - patch("odoo.tests.result.OdooTestResult.update", update).start() + OdooTestResult.update = update From 5667f5e448e1883c5920cb7909df95fc97566e2d Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Fri, 2 Jan 2026 22:05:43 +0100 Subject: [PATCH 47/65] [FIX] auditlog: ensure methods from test template are actually run Since https://github.com/odoo/odoo/commit/6dc96811c24ec, test methods from inherited test classes are not run by default. --- auditlog/tests/test_auditlog.py | 6 ++++++ 1 file changed, 6 insertions(+) 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() From d9c93fffa1aeb0366e6129727b11fcfd1c3d5d86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bet=C3=BCl=20=C3=96=C4=9Fmen?= Date: Thu, 22 Jan 2026 06:17:30 +0000 Subject: [PATCH 48/65] Translated using Weblate (Turkish) Currently translated at 100.0% (4 of 4 strings) Translation: server-tools-18.0/server-tools-18.0-base_view_inheritance_extension Translate-URL: https://translation.odoo-community.org/projects/server-tools-18-0/server-tools-18-0-base_view_inheritance_extension/tr/ --- base_view_inheritance_extension/i18n/tr.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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" From fe5a61cf923dfb5babbe3fc85c21edcd0f12e508 Mon Sep 17 00:00:00 2001 From: Matjaz Mozetic Date: Thu, 22 Jan 2026 16:54:52 +0000 Subject: [PATCH 49/65] Translated using Weblate (Slovenian) Currently translated at 54.3% (44 of 81 strings) Translation: server-tools-18.0/server-tools-18.0-database_cleanup Translate-URL: https://translation.odoo-community.org/projects/server-tools-18-0/server-tools-18-0-database_cleanup/sl/ --- database_cleanup/i18n/sl.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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 From 63e753fdeb7c2a5f97f3468bb6435e1a9f7200ef Mon Sep 17 00:00:00 2001 From: Matjaz Mozetic Date: Thu, 22 Jan 2026 16:53:10 +0000 Subject: [PATCH 50/65] Translated using Weblate (Slovenian) Currently translated at 63.5% (47 of 74 strings) Translation: server-tools-18.0/server-tools-18.0-auto_backup Translate-URL: https://translation.odoo-community.org/projects/server-tools-18-0/server-tools-18-0-auto_backup/sl/ --- auto_backup/i18n/sl.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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 From 66a8650eb1d544b9427d3dec95f106995ecbec2f Mon Sep 17 00:00:00 2001 From: Tom Date: Sun, 25 Jan 2026 12:12:47 +0100 Subject: [PATCH 51/65] [FIX] fetchmail_attach_from_folder tests: mock expunge() --- fetchmail_attach_from_folder/tests/test_match_algorithms.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fetchmail_attach_from_folder/tests/test_match_algorithms.py b/fetchmail_attach_from_folder/tests/test_match_algorithms.py index 394e7fb2ebb..9c43b03b951 100644 --- a/fetchmail_attach_from_folder/tests/test_match_algorithms.py +++ b/fetchmail_attach_from_folder/tests/test_match_algorithms.py @@ -54,6 +54,10 @@ def search(self, charset, criteria): def close(self): pass + def expunge(self): + """Mock an IMAP4.expunge action""" + return ("OK", None) + class TestMatchAlgorithms(TransactionCase): @classmethod From cf777bf2af4d6bd3afb5e67a2c2d87dac7573158 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 25 Jan 2026 22:13:14 +0000 Subject: [PATCH 52/65] [BOT] post-merge updates --- README.md | 2 +- auditlog/README.rst | 2 +- auditlog/__manifest__.py | 2 +- auditlog/static/description/index.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e4892df7417..7c8f364b354 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ addon | version | maintainers | summary [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. 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 From 81de1d097c4daf62383d76fa42bd7e213de95d21 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Sun, 25 Jan 2026 22:31:32 +0000 Subject: [PATCH 53/65] [UPD] Update sequence_python.pot --- sequence_python/i18n/sequence_python.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sequence_python/i18n/sequence_python.pot b/sequence_python/i18n/sequence_python.pot index 23379e65e50..ec8af7e3e1c 100644 --- a/sequence_python/i18n/sequence_python.pot +++ b/sequence_python/i18n/sequence_python.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" +"Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" From ce786c2760c67b1520973018c87105a434870b9d Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 25 Jan 2026 22:39:09 +0000 Subject: [PATCH 54/65] [BOT] post-merge updates --- README.md | 1 + sequence_python/README.rst | 8 ++++-- sequence_python/static/description/index.html | 28 +++++++++++-------- setup/_metapackage/pyproject.toml | 3 +- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 7c8f364b354..295423ad71a 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ addon | version | maintainers | summary [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/sequence_python/README.rst b/sequence_python/README.rst index 98fa5be95b2..820df473009 100644 --- a/sequence_python/README.rst +++ b/sequence_python/README.rst @@ -1,3 +1,7 @@ +.. 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 =============================== @@ -7,13 +11,13 @@ Sequence from Python expression !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:2577b1699eaf32186615d1426d69a461c185cd70423a76700e336c09cf5c7056 + !! 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/licence-AGPL--3-blue.png +.. |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 diff --git a/sequence_python/static/description/index.html b/sequence_python/static/description/index.html index 65f00a3f6ef..deef03047ba 100644 --- a/sequence_python/static/description/index.html +++ b/sequence_python/static/description/index.html @@ -3,7 +3,7 @@ -Sequence from Python expression +README.rst -

    -

    Sequence from Python expression

    +
    + + +Odoo Community Association + +
    +

    Sequence from Python expression

    -

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

    +

    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 @@ -399,7 +404,7 @@

    Sequence from Python expression

    -

    Usage

    +

    Usage

    To use this module, you need to:

    • Go to the form view of an ir.sequence record
    • @@ -421,7 +426,7 @@

      Usage

      And so on.

    -

    Bug Tracker

    +

    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 @@ -429,15 +434,15 @@

    Bug Tracker

    Do not contact contributors directly about support or help with technical issues.

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Sunflower IT
    -

    Contributors

    +

    Contributors

    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -461,5 +466,6 @@

    Maintainers

    +
    diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 87f29e54cad..5002d4628b4 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "odoo-addons-oca-server-tools" -version = "18.0.20251216.0" +version = "18.0.20260125.0" dependencies = [ "odoo-addon-attachment_queue==18.0.*", "odoo-addon-attachment_synchronize==18.0.*", @@ -43,6 +43,7 @@ dependencies = [ "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.*", From 7f9b9b24138d95a0dbf82e0c5f5fe162f5c97736 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Sun, 25 Jan 2026 22:48:41 +0000 Subject: [PATCH 55/65] [UPD] Update attachment_delete_restrict.pot --- .../i18n/attachment_delete_restrict.pot | 106 +++--------------- 1 file changed, 17 insertions(+), 89 deletions(-) diff --git a/attachment_delete_restrict/i18n/attachment_delete_restrict.pot b/attachment_delete_restrict/i18n/attachment_delete_restrict.pot index 822e1b1c331..a2a7c32e442 100644 --- a/attachment_delete_restrict/i18n/attachment_delete_restrict.pot +++ b/attachment_delete_restrict/i18n/attachment_delete_restrict.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" +"Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,6 +13,16 @@ msgstr "" "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" @@ -45,30 +55,7 @@ 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" +msgid "Authorized Groups and Users" msgstr "" #. module: attachment_delete_restrict @@ -76,33 +63,6 @@ msgstr "" msgid "Config Settings" msgstr "" -#. 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 "" - -#. 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 @@ -149,6 +109,11 @@ msgstr "" 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" @@ -168,33 +133,6 @@ msgstr "" msgid "Smart Search" msgstr "" -#. 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 "" - -#. 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 "" - -#. 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 "" - #. module: attachment_delete_restrict #: model:ir.model.fields,help:attachment_delete_restrict.field_res_users__delete_attachment_model_ids msgid "" @@ -244,15 +182,6 @@ msgstr "" msgid "User" 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.fields,help:attachment_delete_restrict.field_ir_model__restrict_delete_attachment msgid "" @@ -263,7 +192,6 @@ msgstr "" #. 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" From 09180fad351a0e25880a4909614c8d232d0d4551 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 25 Jan 2026 22:56:48 +0000 Subject: [PATCH 56/65] [BOT] post-merge updates --- README.md | 1 + attachment_delete_restrict/README.rst | 26 +++++----- .../static/description/index.html | 49 +++++++++++-------- setup/_metapackage/pyproject.toml | 3 +- 4 files changed, 47 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 295423ad71a..7163fc3b85f 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ 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 diff --git a/attachment_delete_restrict/README.rst b/attachment_delete_restrict/README.rst index e3152fcd232..19de923ebf3 100644 --- a/attachment_delete_restrict/README.rst +++ b/attachment_delete_restrict/README.rst @@ -1,3 +1,7 @@ +.. 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 ================================ @@ -7,13 +11,13 @@ Restrict Deletion of Attachments !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:f29bf33d2719e11ecbc0e7a7341f424b412b08c775dd2d391818da5f939ff65d + !! 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/licence-AGPL--3-blue.png +.. |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 @@ -49,12 +53,12 @@ Select 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 +- 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. @@ -93,9 +97,9 @@ Authors Contributors ------------ -- Yoshi Tashiro -- Kévin Roche -- Sébastien BEAU +- Yoshi Tashiro +- Kévin Roche +- Sébastien BEAU Maintainers ----------- diff --git a/attachment_delete_restrict/static/description/index.html b/attachment_delete_restrict/static/description/index.html index 435aa673cda..367733f568b 100644 --- a/attachment_delete_restrict/static/description/index.html +++ b/attachment_delete_restrict/static/description/index.html @@ -3,15 +3,16 @@ -Restrict Deletion of Attachments +README.rst -
    -

    Restrict Deletion of Attachments

    +
    + + +Odoo Community Association + +
    +

    Restrict Deletion of Attachments

    -

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

    +

    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

    @@ -390,9 +396,9 @@

    Restrict Deletion of Attachments

    -

    Configuration

    +

    Configuration

    -

    Select level:

    +

    Select level:

    1. Go to Settings > General Settings> Permission section.
    2. Choose the level of Restrict Delete Attachment for all models by @@ -400,19 +406,19 @@

      Select level:

    -

    Five levels:

    +

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

    +

    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. @@ -426,7 +432,7 @@

      For Custom and Owner + Custom lev

    -

    Bug Tracker

    +

    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 @@ -434,16 +440,16 @@

    Bug Tracker

    Do not contact contributors directly about support or help with technical issues.

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Quartile
    • Akretion
    -

    Contributors

    +

    Contributors

    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    -Odoo Community Association + +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.

    @@ -464,5 +472,6 @@

    Maintainers

    +
    diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 5002d4628b4..63f94d6f9dc 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.20260125.0" +version = "18.0.20260125.1" 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.*", From d5c64669f41010c676530ba4d7d47e406325360e Mon Sep 17 00:00:00 2001 From: Tom Date: Thu, 9 Jan 2025 10:56:35 +0100 Subject: [PATCH 57/65] [FIX] fetchmail_attach_from_folder: be able to open form view even when connection fails Background: on Outlook servers and possibly on other providers as well, connect can fail with a UserError. Before this fix this results in the form view not being able to open because the compute cannot complete. This fixes that, so that the connection error may be resolved by the user. --- fetchmail_attach_from_folder/models/fetchmail_server.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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.") From dc87bfc8f6b156cc0fe85837d1fc4a2cf275bbd0 Mon Sep 17 00:00:00 2001 From: Ronald Portier Date: Thu, 22 Aug 2024 16:33:04 +0200 Subject: [PATCH 58/65] [FIX] fetch...folder: use message uid's not sequence --- .../models/fetchmail_server_folder.py | 64 +++++++++++-------- .../tests/test_match_algorithms.py | 5 ++ 2 files changed, 42 insertions(+), 27 deletions(-) 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/tests/test_match_algorithms.py b/fetchmail_attach_from_folder/tests/test_match_algorithms.py index 9c43b03b951..70da96dd399 100644 --- a/fetchmail_attach_from_folder/tests/test_match_algorithms.py +++ b/fetchmail_attach_from_folder/tests/test_match_algorithms.py @@ -58,6 +58,11 @@ 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 From 395a0217d133b143bc86ef326f7b5dd8f25713ac Mon Sep 17 00:00:00 2001 From: Ronald Portier Date: Fri, 23 Aug 2024 09:41:45 +0200 Subject: [PATCH 59/65] [FIX] fetch...folder: test message archiving --- .../tests/test_match_algorithms.py | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/fetchmail_attach_from_folder/tests/test_match_algorithms.py b/fetchmail_attach_from_folder/tests/test_match_algorithms.py index 70da96dd399..33fd3286a59 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,16 +40,24 @@ 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): @@ -153,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 @@ -162,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 From eb8878eaeb830202926b171128b6636868cd72ed Mon Sep 17 00:00:00 2001 From: Ronald Portier Date: Mon, 26 Jan 2026 12:00:40 +0100 Subject: [PATCH 60/65] [FIX] fetch..folder: adapt manual wizard to message_uids --- .../tests/test_match_algorithms.py | 23 +++++++++++-------- .../wizard/attach_mail_manually.py | 20 ++++++++-------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/fetchmail_attach_from_folder/tests/test_match_algorithms.py b/fetchmail_attach_from_folder/tests/test_match_algorithms.py index 33fd3286a59..2666a10ecf9 100644 --- a/fetchmail_attach_from_folder/tests/test_match_algorithms.py +++ b/fetchmail_attach_from_folder/tests/test_match_algorithms.py @@ -251,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")], @@ -261,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", @@ -282,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({}) @@ -297,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", @@ -315,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, }, @@ -324,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}", }, @@ -342,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", @@ -350,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

    ", @@ -366,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) From a4f87006a13a3e5a91eefdd75a2ee915ce6fb5de Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 28 Jan 2026 11:11:40 +0000 Subject: [PATCH 61/65] [UPD] Update odoo_test_xmlrunner.pot --- odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot b/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot index 78d58d53fe0..aadee09bfed 100644 --- a/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot +++ b/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot @@ -3,7 +3,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" +"Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" From 107beae02e989bc0ef4f5eac87a632b1c5011ca2 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 28 Jan 2026 11:20:06 +0000 Subject: [PATCH 62/65] [BOT] post-merge updates --- README.md | 1 + odoo_test_xmlrunner/README.rst | 8 +++-- .../static/description/index.html | 36 +++++++++++-------- setup/_metapackage/pyproject.toml | 3 +- 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 7163fc3b85f..155a9a7c675 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ 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 diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst index c3bef9dafd2..9c7913840b0 100644 --- a/odoo_test_xmlrunner/README.rst +++ b/odoo_test_xmlrunner/README.rst @@ -1,3 +1,7 @@ +.. 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 ====================== @@ -7,13 +11,13 @@ Unittest xUnit reports !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:dc5901a41067fac6a375c2ba99ceaf485afc9273c2248b73255cc1b99e6fddcf + !! 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/licence-AGPL--3-blue.png +.. |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 diff --git a/odoo_test_xmlrunner/static/description/index.html b/odoo_test_xmlrunner/static/description/index.html index cb3de94c822..e71f15fb742 100644 --- a/odoo_test_xmlrunner/static/description/index.html +++ b/odoo_test_xmlrunner/static/description/index.html @@ -3,7 +3,7 @@ -Unittest xUnit reports +README.rst -
    -

    Unittest xUnit reports

    +
    + + +Odoo Community Association + +
    +

    Unittest xUnit reports

    -

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

    +

    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

    @@ -393,19 +398,19 @@

    Unittest xUnit reports

    -

    Installation

    +

    Installation

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

    The module is automatically installed on the Odoo instance.

    -

    Usage

    +

    Usage

    -

    Run the native Odoo tests

    +

    Run the native Odoo tests

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

    -

    Gitlab CI usage example

    +

    Gitlab CI usage example

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

     stages:
    @@ -445,7 +450,7 @@ 

    Gitlab CI usage example

    -

    Github Actions usage example

    +

    Github Actions usage example

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

     name: tests
    @@ -508,7 +513,7 @@ 

    Github Actions usage example<

    -

    Bug Tracker

    +

    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 @@ -516,15 +521,15 @@

    Bug Tracker

    Do not contact contributors directly about support or help with technical issues.

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Smile
    -

    Other credits

    +

    Other credits

    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -550,5 +555,6 @@

    Maintainers

    +
    diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 63f94d6f9dc..546ff5cabc2 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "odoo-addons-oca-server-tools" -version = "18.0.20260125.1" +version = "18.0.20260128.0" dependencies = [ "odoo-addon-attachment_delete_restrict==18.0.*", "odoo-addon-attachment_queue==18.0.*", @@ -40,6 +40,7 @@ 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.*", From c1ca5e601c294d71ca8d00fde8c4b3f85c6cd0a9 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 28 Jan 2026 13:15:01 +0000 Subject: [PATCH 63/65] [UPD] Update fetchmail_attach_from_folder.pot --- .../i18n/fetchmail_attach_from_folder.pot | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 "" From 7b1952e9ced9e0ccaf72426d09dca451853fae76 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 28 Jan 2026 13:23:12 +0000 Subject: [PATCH 64/65] [BOT] post-merge updates --- README.md | 2 +- fetchmail_attach_from_folder/README.rst | 2 +- fetchmail_attach_from_folder/__manifest__.py | 2 +- fetchmail_attach_from_folder/static/description/index.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 155a9a7c675..2547e9864a9 100644 --- a/README.md +++ b/README.md @@ -50,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 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/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 From dfcf0b562f9e5349b76299761146581984741b6a Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 28 Jan 2026 13:23:22 +0000 Subject: [PATCH 65/65] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: server-tools-18.0/server-tools-18.0-fetchmail_attach_from_folder Translate-URL: https://translation.odoo-community.org/projects/server-tools-18-0/server-tools-18-0-fetchmail_attach_from_folder/ --- fetchmail_attach_from_folder/i18n/de.po | 106 ++------------- fetchmail_attach_from_folder/i18n/es.po | 106 ++------------- fetchmail_attach_from_folder/i18n/fr.po | 106 ++------------- fetchmail_attach_from_folder/i18n/fr_CA.po | 101 ++------------ fetchmail_attach_from_folder/i18n/it.po | 146 +++++++-------------- fetchmail_attach_from_folder/i18n/pt_BR.po | 124 ++++------------- fetchmail_attach_from_folder/i18n/ru.po | 101 ++------------ fetchmail_attach_from_folder/i18n/sl.po | 107 +++------------ 8 files changed, 155 insertions(+), 742 deletions(-) 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/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"