diff --git a/README.md b/README.md index 909404abaf..449934e5de 100644 --- a/README.md +++ b/README.md @@ -23,25 +23,25 @@ addon | version | maintainers | summary --- | --- | --- | --- [announcement](announcement/) | 18.0.1.0.1 | | Notify internal users about relevant organization stuff [barcode_action](barcode_action/) | 18.0.1.0.0 | | Allows to use barcodes as a launcher -[base_cancel_confirm](base_cancel_confirm/) | 18.0.1.0.0 | kittiu | Base Cancel Confirm +[base_cancel_confirm](base_cancel_confirm/) | 18.0.1.0.1 | kittiu | Base Cancel Confirm [base_custom_filter](base_custom_filter/) | 18.0.1.0.0 | AshishHirapara ForgeFlow | Add custom filters in standard filters and group by dropdowns [base_export_manager](base_export_manager/) | 18.0.1.0.2 | | Manage model export profiles [base_import_security_group](base_import_security_group/) | 18.0.1.0.0 | | Group-based permissions for importing CSV files [base_menu_visibility_restriction](base_menu_visibility_restriction/) | 18.0.1.0.0 | victoralmau | Restrict (with groups) menu visibilty -[base_optional_quick_create](base_optional_quick_create/) | 18.0.1.0.0 | | Avoid "quick create" on m2o fields, on a "by model" basis -[base_revision](base_revision/) | 18.0.1.0.0 | | Keep track of revised document -[base_search_custom_field_filter](base_search_custom_field_filter/) | 18.0.1.0.0 | pedrobaeza | Add custom filters for fields via UI -[base_substate](base_substate/) | 18.0.1.0.1 | | Base Sub State +[base_optional_quick_create](base_optional_quick_create/) | 18.0.1.0.1 | | Avoid "quick create" on m2o fields, on a "by model" basis +[base_revision](base_revision/) | 18.0.1.0.1 | | Keep track of revised document +[base_search_custom_field_filter](base_search_custom_field_filter/) | 18.0.1.0.1 | pedrobaeza | Add custom filters for fields via UI +[base_substate](base_substate/) | 18.0.1.0.2 | | Base Sub State [base_technical_features](base_technical_features/) | 18.0.1.0.2 | | Access to technical features without activating debug mode -[base_tier_validation](base_tier_validation/) | 18.0.3.1.2 | LoisRForgeFlow | Implement a validation process based on tiers. +[base_tier_validation](base_tier_validation/) | 18.0.3.1.4 | LoisRForgeFlow | Implement a validation process based on tiers. [base_tier_validation_confirm_auth](base_tier_validation_confirm_auth/) | 18.0.1.0.0 | | Authentication confirmation for base tiers. -[base_tier_validation_correction](base_tier_validation_correction/) | 18.0.1.0.0 | kittiu | Correct tier.review data after it has been created. -[base_tier_validation_formula](base_tier_validation_formula/) | 18.0.1.0.0 | | Formulas for Base tier validation -[base_tier_validation_forward](base_tier_validation_forward/) | 18.0.2.0.1 | kittiu | Forward option for base tiers -[base_tier_validation_server_action](base_tier_validation_server_action/) | 18.0.1.0.0 | kittiu | Add option to call server action when a tier is validated +[base_tier_validation_correction](base_tier_validation_correction/) | 18.0.1.0.1 | kittiu | Correct tier.review data after it has been created. +[base_tier_validation_formula](base_tier_validation_formula/) | 18.0.1.0.1 | | Formulas for Base tier validation +[base_tier_validation_forward](base_tier_validation_forward/) | 18.0.2.0.2 | kittiu | Forward option for base tiers +[base_tier_validation_server_action](base_tier_validation_server_action/) | 18.0.1.0.1 | kittiu | Add option to call server action when a tier is validated [base_warn_option](base_warn_option/) | 18.0.1.0.0 | Shide rafaelbn | Add Options to Warn Messages [chained_swapper](chained_swapper/) | 18.0.1.0.0 | | Chained Swapper -[date_range](date_range/) | 18.0.5.0.0 | lmignon | Manage all kind of date range +[date_range](date_range/) | 18.0.5.0.1 | lmignon | Manage all kind of date range [date_range_account](date_range_account/) | 18.0.1.0.0 | alexis-via | Add Date Range menu entry in Invoicing app [default_multi_user](default_multi_user/) | 18.0.1.0.0 | LoisRForgeFlow | Allows to share user-defined defaults among several users. [developer_menu](developer_menu/) | 18.0.1.1.0 | bealdav | Menu Shortcut for developer usage @@ -49,7 +49,7 @@ addon | version | maintainers | summary [document_quick_access_folder_auto_classification](document_quick_access_folder_auto_classification/) | 18.0.1.0.0 | etobella | Auto classification of Documents after reading a QR [filter_multi_user](filter_multi_user/) | 18.0.1.0.0 | LoisRForgeFlow | Allows to share user-defined filters filters among several users. [mail_message_destiny_link_template](mail_message_destiny_link_template/) | 18.0.1.0.0 | Shide rafaelbn | Mail template to show destiny records in chatter. -[multi_step_wizard](multi_step_wizard/) | 18.0.1.0.0 | | Multi-Steps Wizards +[multi_step_wizard](multi_step_wizard/) | 18.0.1.0.1 | | Multi-Steps Wizards [sequence_check_digit](sequence_check_digit/) | 18.0.1.1.0 | | Adds a check digit on sequences [sequence_reset_period](sequence_reset_period/) | 18.0.1.0.0 | | Auto-generate yearly/monthly/weekly/daily sequence period ranges [server_action_mass_edit](server_action_mass_edit/) | 18.0.1.1.1 | | Mass Editing diff --git a/base_cancel_confirm/README.rst b/base_cancel_confirm/README.rst index b7f0dc9105..faf20db14d 100644 --- a/base_cancel_confirm/README.rst +++ b/base_cancel_confirm/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 + =================== Base Cancel Confirm =================== @@ -7,13 +11,13 @@ Base Cancel Confirm !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:27aca3aeae58b252f6db12e2f9abb388a47be1daa042902839d138712832f66e + !! source digest: sha256:fae0ef1c6d1dd76aad220b3620639cbafd2aa06efca75a41d0476c706db7b068 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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--ux-lightgray.png?logo=github diff --git a/base_cancel_confirm/__manifest__.py b/base_cancel_confirm/__manifest__.py index 1eca8b8910..f3a5567138 100644 --- a/base_cancel_confirm/__manifest__.py +++ b/base_cancel_confirm/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Cancel Confirm", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "author": "Ecosoft,Odoo Community Association (OCA)", "category": "Usability", "license": "AGPL-3", diff --git a/base_cancel_confirm/static/description/index.html b/base_cancel_confirm/static/description/index.html index 971023d13d..c84ee47194 100644 --- a/base_cancel_confirm/static/description/index.html +++ b/base_cancel_confirm/static/description/index.html @@ -3,7 +3,7 @@ -Base Cancel Confirm +README.rst -
-

Base Cancel Confirm

+
+ + +Odoo Community Association + +
+

Base Cancel Confirm

-

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

+

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

Many document model that already has cancel action may also want a confirm dialog with option to provide reason.

This module does not provide a functionality by itself but an abstract @@ -399,7 +404,7 @@

Base Cancel Confirm

-

Configuration

+

Configuration

By default, the cancel confirm will be disabled (to ensure no side effect on other module unit test)

To enable cancel confirm wizard, please add System Parameter @@ -412,7 +417,7 @@

Configuration

-

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 @@ -420,21 +425,21 @@

Bug Tracker

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

+
diff --git a/base_cancel_confirm/tests/test_cancel_confirm.py b/base_cancel_confirm/tests/test_cancel_confirm.py index 8638fa6776..0aa72a06a8 100644 --- a/base_cancel_confirm/tests/test_cancel_confirm.py +++ b/base_cancel_confirm/tests/test_cancel_confirm.py @@ -8,27 +8,26 @@ @tagged("post_install", "-at_install") class TestCancelConfirm(common.TransactionCase): - @classmethod - def setUpClass(cls): - super().setUpClass() + def setUp(self): + super().setUp() - cls.loader = FakeModelLoader(cls.env, cls.__module__) - cls.loader.backup_registry() + self.loader = FakeModelLoader(self.env, self.__module__) + self.loader.backup_registry() from .cancel_confirm_tester import CancelConfirmTester - cls.loader.update_registry((CancelConfirmTester,)) - cls.test_model = cls.env[CancelConfirmTester._name] - cls.tester_model = cls.env["ir.model"].search( + self.loader.update_registry((CancelConfirmTester,)) + self.test_model = self.env[CancelConfirmTester._name] + self.tester_model = self.env["ir.model"].search( [("model", "=", "cancel.confirm.tester")] ) - cls.env["ir.config_parameter"].create( + self.env["ir.config_parameter"].create( {"key": "cancel.confirm.tester.cancel_confirm_disable", "value": "False"} ) # Access record: - cls.env["ir.model.access"].create( + self.env["ir.model.access"].create( { "name": "access.cancel.confirm.tester", - "model_id": cls.tester_model.id, + "model_id": self.tester_model.id, "perm_read": 1, "perm_write": 1, "perm_create": 1, @@ -36,12 +35,11 @@ def setUpClass(cls): } ) - cls.test_record = cls.test_model.create({"name": "DOC-001"}) + self.test_record = self.test_model.create({"name": "DOC-001"}) - @classmethod - def tearDownClass(cls): - cls.loader.restore_registry() - return super().tearDownClass() + def tearDown(self): + self.loader.restore_registry() + return super().tearDown() def test_01_cancel_confirm_tester(self): """Cancel a document, I expect cancel_reason. diff --git a/base_optional_quick_create/README.rst b/base_optional_quick_create/README.rst index 758055aa32..a5a3839caa 100644 --- a/base_optional_quick_create/README.rst +++ b/base_optional_quick_create/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 + ===================== Optional quick create ===================== @@ -7,13 +11,13 @@ Optional quick create !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:5e477253013871e04de8253f8c4ac46b91f53d41cbb7b9cbcb12de5b86c5d31c + !! source digest: sha256:0f856e368d9ea04e58c6ae01a6136cf584e54631c21450b77945e6a91b13a3ca !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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--ux-lightgray.png?logo=github diff --git a/base_optional_quick_create/__manifest__.py b/base_optional_quick_create/__manifest__.py index bd0412570a..1934fa41db 100644 --- a/base_optional_quick_create/__manifest__.py +++ b/base_optional_quick_create/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Optional quick create", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "category": "Tools", "summary": 'Avoid "quick create" on m2o fields, on a "by model" basis', "author": "Agile Business Group,Odoo Community Association (OCA)", diff --git a/base_optional_quick_create/static/description/index.html b/base_optional_quick_create/static/description/index.html index b895311714..682dd66c38 100644 --- a/base_optional_quick_create/static/description/index.html +++ b/base_optional_quick_create/static/description/index.html @@ -3,7 +3,7 @@ -Optional quick create +README.rst -
-

Optional quick create

+
+ + +Odoo Community Association + +
+

Optional quick create

-

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

+

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

This module allows to avoid to quick create new records, through many2one fields, for a specific model. You can configure which models should allow quick create. When specified, the quick create option @@ -390,7 +395,7 @@

Optional quick create

-

Usage

+

Usage

To use this module, you need to:

    @@ -402,7 +407,7 @@

    Usage

-

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 @@ -410,15 +415,15 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Agile Business Group
-

Contributors

+

Contributors

-

Other credits

+

Other credits

This module is maintained by: * Odoo Community Association

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -445,5 +450,6 @@

Maintainers

+
diff --git a/base_optional_quick_create/tests/test_quick_create.py b/base_optional_quick_create/tests/test_quick_create.py index fe4847c375..f08f4fd7c6 100644 --- a/base_optional_quick_create/tests/test_quick_create.py +++ b/base_optional_quick_create/tests/test_quick_create.py @@ -2,15 +2,37 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo.exceptions import UserError -from odoo.tests.common import TransactionCase +from odoo.tests.common import SETATTR_SOURCES, TransactionCase + +# Register ir_model.py as a known path in odoo.tests.common for patching methods +SETATTR_SOURCES["_patch_method"] = tuple( + list(SETATTR_SOURCES.get("_patch_method", [])) + + ["/base_optional_quick_create/models/ir_model.py"], +) +SETATTR_SOURCES["_revert_method"] = tuple( + list(SETATTR_SOURCES.get("_revert_method", [])) + + ["/base_optional_quick_create/models/ir_model.py"], +) class TestQuickCreate(TransactionCase): def setUp(self, *args, **kwargs): super().setUp() + self.patched_models = [ + model._name + for model in self.env.registry.values() + if "name_create" in vars(model) + ] model_model = self.env["ir.model"] self.partner_model = model_model.search([("model", "=", "res.partner")]) + def tearDown(self): + # Revert any patched method to avoid side effects on other tests + for model in self.env.registry.values(): + if "name_create" in vars(model) and model._name not in self.patched_models: + delattr(model, "name_create") + return super().tearDown() + def test_quick_create(self): partner_id = self.env["res.partner"].name_create("TEST partner") self.assertEqual(bool(partner_id), True) diff --git a/base_revision/README.rst b/base_revision/README.rst index c41a213720..c267901748 100644 --- a/base_revision/README.rst +++ b/base_revision/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 + ======================== Base Revision (abstract) ======================== @@ -7,13 +11,13 @@ Base Revision (abstract) !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:2746724ea785f12468aaff9dee4aec94036aab03df38394da1d4581105ec2eef + !! source digest: sha256:43de683941465fe0c45b78b7b6e1829a277b28abaa1c34676baa9457bf605c02 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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--ux-lightgray.png?logo=github diff --git a/base_revision/__manifest__.py b/base_revision/__manifest__.py index 6912b1f9af..3d9470ab1c 100644 --- a/base_revision/__manifest__.py +++ b/base_revision/__manifest__.py @@ -7,7 +7,7 @@ { "name": "Base Revision (abstract)", "summary": "Keep track of revised document", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "category": "Tools", "author": "Agile Business Group," "Dreambits," diff --git a/base_revision/static/description/index.html b/base_revision/static/description/index.html index b310d4d085..80c14a34d1 100644 --- a/base_revision/static/description/index.html +++ b/base_revision/static/description/index.html @@ -3,7 +3,7 @@ -Base Revision (abstract) +README.rst -
-

Base Revision (abstract)

+
+ + +Odoo Community Association + +
+

Base Revision (abstract)

-

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

+

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

Making revision(s) of a document is a common need across many area.

This module does not provide a functionality by itself but an abstract model to implement revision capality in other models (e.g. purchase @@ -407,7 +412,7 @@

Base Revision (abstract)

-

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 @@ -415,9 +420,9 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Agile Business Group
  • Dreambits
  • @@ -428,7 +433,7 @@

    Authors

-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -455,5 +460,6 @@

Maintainers

+
diff --git a/base_revision/tests/test_base_revision.py b/base_revision/tests/test_base_revision.py index 973e7033b8..8672ecd36c 100644 --- a/base_revision/tests/test_base_revision.py +++ b/base_revision/tests/test_base_revision.py @@ -9,22 +9,20 @@ class TestBaseRevision(common.TransactionCase): - @classmethod - def setUpClass(cls): - super().setUpClass() + def setUp(self): + super().setUp() - cls.loader = FakeModelLoader(cls.env, cls.__module__) - cls.loader.backup_registry() + self.loader = FakeModelLoader(self.env, self.__module__) + self.loader.backup_registry() from .base_revision_tester import BaseRevisionTester - cls.loader.update_registry((BaseRevisionTester,)) + self.loader.update_registry((BaseRevisionTester,)) - cls.revision_model = cls.env[BaseRevisionTester._name] + self.revision_model = self.env[BaseRevisionTester._name] - @classmethod - def tearDownClass(cls): - cls.loader.restore_registry() - return super().tearDownClass() + def tearDown(self): + self.loader.restore_registry() + return super().tearDown() def _create_tester(self, vals_list=None): if not vals_list: diff --git a/base_search_custom_field_filter/README.rst b/base_search_custom_field_filter/README.rst index 45e52a9c15..030ea9222f 100644 --- a/base_search_custom_field_filter/README.rst +++ b/base_search_custom_field_filter/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 + ==================================== Add custom filters for fields via UI ==================================== @@ -7,13 +11,13 @@ Add custom filters for fields via UI !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:19aa62127a448495b032c5a3827309e7a4df28661da05ea908163234fe3711e7 + !! source digest: sha256:7a5777173e05b0dd0ac5574653cf58f0ff33b798381ab1431880abf1792e222a !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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--ux-lightgray.png?logo=github diff --git a/base_search_custom_field_filter/__manifest__.py b/base_search_custom_field_filter/__manifest__.py index 51e2e6dad0..ab11556525 100644 --- a/base_search_custom_field_filter/__manifest__.py +++ b/base_search_custom_field_filter/__manifest__.py @@ -4,7 +4,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { "name": "Add custom filters for fields via UI", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "category": "Usability", "website": "https://github.com/OCA/server-ux", "author": "Tecnativa, Amitaujas, Odoo Community Association (OCA)", diff --git a/base_search_custom_field_filter/i18n/base_search_custom_field_filter.pot b/base_search_custom_field_filter/i18n/base_search_custom_field_filter.pot index 62089a7e0e..91e66ad320 100644 --- a/base_search_custom_field_filter/i18n/base_search_custom_field_filter.pot +++ b/base_search_custom_field_filter/i18n/base_search_custom_field_filter.pot @@ -13,12 +13,6 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" -#. module: base_search_custom_field_filter -#. odoo-python -#: code:addons/base_search_custom_field_filter/models/base.py:0 -msgid "//field[@name='%s']" -msgstr "" - #. module: base_search_custom_field_filter #: model:ir.model.constraint,message:base_search_custom_field_filter.constraint_ir_ui_custom_field_filter_unique_model_expression msgid "A filter with the same expression already exists for this model." diff --git a/base_search_custom_field_filter/i18n/es.po b/base_search_custom_field_filter/i18n/es.po index 4bb54e9051..b7fe0a74b0 100644 --- a/base_search_custom_field_filter/i18n/es.po +++ b/base_search_custom_field_filter/i18n/es.po @@ -16,6 +16,17 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17\n" +#. module: base_search_custom_field_filter +#: model:ir.model.constraint,message:base_search_custom_field_filter.constraint_ir_ui_custom_field_filter_unique_model_expression +msgid "A filter with the same expression already exists for this model." +msgstr "" + +#. module: base_search_custom_field_filter +#. odoo-python +#: code:addons/base_search_custom_field_filter/models/ir_ui_custom_field_filter.py:0 +msgid "A filter with the same name already exists for this model." +msgstr "" + #. module: base_search_custom_field_filter #: model:ir.model,name:base_search_custom_field_filter.model_base msgid "Base" @@ -60,7 +71,6 @@ msgstr "ID" #. module: base_search_custom_field_filter #. odoo-python #: code:addons/base_search_custom_field_filter/models/ir_ui_custom_field_filter.py:0 -#, python-format msgid "Incorrect expression: %s." msgstr "Expresión incorrecta: %s." @@ -69,11 +79,6 @@ msgstr "Expresión incorrecta: %s." msgid "Language" msgstr "Idioma" -#. module: base_search_custom_field_filter -#: model:ir.model.fields,field_description:base_search_custom_field_filter.field_ir_ui_custom_field_filter____last_update -msgid "Last Modified on" -msgstr "Última modificación el" - #. module: base_search_custom_field_filter #: model:ir.model.fields,field_description:base_search_custom_field_filter.field_ir_ui_custom_field_filter__write_uid msgid "Last Updated by" @@ -117,3 +122,6 @@ msgstr "Posición Después" #: model:ir.model.fields,field_description:base_search_custom_field_filter.field_ir_ui_custom_field_filter__sequence msgid "Sequence" msgstr "Secuencia" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación el" diff --git a/base_search_custom_field_filter/i18n/it.po b/base_search_custom_field_filter/i18n/it.po index 9d325e3d2d..e537dcdb8d 100644 --- a/base_search_custom_field_filter/i18n/it.po +++ b/base_search_custom_field_filter/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-06-09 14:26+0000\n" +"PO-Revision-Date: 2026-02-10 13:24+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,7 +14,18 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.10.4\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: base_search_custom_field_filter +#: model:ir.model.constraint,message:base_search_custom_field_filter.constraint_ir_ui_custom_field_filter_unique_model_expression +msgid "A filter with the same expression already exists for this model." +msgstr "Esiste già un filtro con la stessa espressione per questo modello." + +#. module: base_search_custom_field_filter +#. odoo-python +#: code:addons/base_search_custom_field_filter/models/ir_ui_custom_field_filter.py:0 +msgid "A filter with the same name already exists for this model." +msgstr "Esiste già un filtro con lo stesso nome per questo modello." #. module: base_search_custom_field_filter #: model:ir.model,name:base_search_custom_field_filter.model_base @@ -60,7 +71,6 @@ msgstr "ID" #. module: base_search_custom_field_filter #. odoo-python #: code:addons/base_search_custom_field_filter/models/ir_ui_custom_field_filter.py:0 -#, python-format msgid "Incorrect expression: %s." msgstr "Espressione non corretta: %s." @@ -69,11 +79,6 @@ msgstr "Espressione non corretta: %s." msgid "Language" msgstr "Lingua" -#. module: base_search_custom_field_filter -#: model:ir.model.fields,field_description:base_search_custom_field_filter.field_ir_ui_custom_field_filter____last_update -msgid "Last Modified on" -msgstr "Ultima modifica il" - #. module: base_search_custom_field_filter #: model:ir.model.fields,field_description:base_search_custom_field_filter.field_ir_ui_custom_field_filter__write_uid msgid "Last Updated by" @@ -117,3 +122,6 @@ msgstr "Posiziona dopo" #: model:ir.model.fields,field_description:base_search_custom_field_filter.field_ir_ui_custom_field_filter__sequence msgid "Sequence" msgstr "Sequenza" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" diff --git a/base_search_custom_field_filter/models/base.py b/base_search_custom_field_filter/models/base.py index 050f77e731..98dba5ddd4 100644 --- a/base_search_custom_field_filter/models/base.py +++ b/base_search_custom_field_filter/models/base.py @@ -7,7 +7,6 @@ from lxml import etree from odoo import api, models -from odoo.tools.translate import _ class Base(models.AbstractModel): @@ -34,9 +33,7 @@ def _add_custom_filters(self, res, custom_filters): for custom_filter in custom_filters: node = False if custom_filter.position_after: - node = arch.xpath( - _("//field[@name='%s']") % custom_filter.position_after - ) + node = arch.xpath(f"//field[@name='{custom_filter.position_after}']") if not node: node = arch.xpath("//field[last()]") if node: @@ -65,7 +62,7 @@ def get_views(self, views, options=None): """Inject fake field definition for having custom filters available.""" res = super().get_views(views, options) if self._name not in res["models"]: - res["models"][self._name] = {} + res["models"][self._name] = {"fields": {}} custom_filters = self.env["ir.ui.custom.field.filter"].search( [("model_name", "=", self._name)] ) @@ -78,9 +75,11 @@ def get_views(self, views, options=None): if not field: continue field_name = custom_filter.expression - res["models"][self._name][field_name] = field.get_description(self.env) + res["models"][self._name]["fields"][field_name] = field.get_description( + self.env + ) # Force these properties to prevent the field from appearing in the UI - res["models"][self._name][field_name]["selectable"] = False - res["models"][self._name][field_name]["sortable"] = False - res["models"][self._name][field_name]["store"] = False + res["models"][self._name]["fields"][field_name]["selectable"] = False + res["models"][self._name]["fields"][field_name]["sortable"] = False + res["models"][self._name]["fields"][field_name]["store"] = False return res diff --git a/base_search_custom_field_filter/static/description/index.html b/base_search_custom_field_filter/static/description/index.html index 01ad51207a..c23f6a35a3 100644 --- a/base_search_custom_field_filter/static/description/index.html +++ b/base_search_custom_field_filter/static/description/index.html @@ -3,7 +3,7 @@ -Add custom filters for fields via UI +README.rst -
-

Add custom filters for fields via UI

+
+ + +Odoo Community Association + +
+

Add custom filters for fields via UI

-

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

+

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

This module allows to define custom filters in the search views for an specific field belonging to the document or any other related document.

This nature makes the definition quite technical, but once done, it adds @@ -389,7 +394,7 @@

Add custom filters for fields via UI

-

Configuration

+

Configuration

  1. Go to Settings > Technical > User Interface > Custom Field Filters.
  2. Create a new record, and define following information:
-

Usage

+

Usage

  1. Go to the menu entry for which you have defined the custom field filter.
  2. @@ -430,7 +435,7 @@

    Usage

    image1

-

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 @@ -438,16 +443,16 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Tecnativa
  • Amitaujas
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -473,5 +478,6 @@

Maintainers

+
diff --git a/base_search_custom_field_filter/tests/test_filter.py b/base_search_custom_field_filter/tests/test_filter.py index 64d5899c71..c2e8cc9b4f 100644 --- a/base_search_custom_field_filter/tests/test_filter.py +++ b/base_search_custom_field_filter/tests/test_filter.py @@ -104,8 +104,8 @@ def test_05_get_views_with_custom_filter(self): } ) res = self.env["res.partner"].get_views([], {}) - self.assertIn("name", res["models"]["res.partner"]) - self.assertFalse(res["models"]["res.partner"]["name"]["selectable"]) + self.assertIn("name", res["models"]["res.partner"]["fields"]) + self.assertFalse(res["models"]["res.partner"]["fields"]["name"]["selectable"]) def test_06_invalid_related_field(self): with self.assertRaises(ValidationError): diff --git a/base_substate/README.rst b/base_substate/README.rst index 91ac81bc83..ac57c4685d 100644 --- a/base_substate/README.rst +++ b/base_substate/README.rst @@ -11,7 +11,7 @@ Base Sub State !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:989e77bd2157db91cb6553141740809178a29d1850c2a4725241d9cd9582c06a + !! source digest: sha256:dc38555765d9feb2fa24612bfc24dd44a8d0dc9df47f690ae1ac8b251e8362f7 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/base_substate/__manifest__.py b/base_substate/__manifest__.py index 0d7a7d76c6..cdeae4fecb 100644 --- a/base_substate/__manifest__.py +++ b/base_substate/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Sub State", - "version": "18.0.1.0.1", + "version": "18.0.1.0.2", "category": "Tools", "author": "Akretion, Odoo Community Association (OCA)", "website": "https://github.com/OCA/server-ux", diff --git a/base_substate/static/description/index.html b/base_substate/static/description/index.html index 8f33128f11..5c7764e305 100644 --- a/base_substate/static/description/index.html +++ b/base_substate/static/description/index.html @@ -372,7 +372,7 @@

Base Sub State

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

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

This module provide abstract models to manage customizable substates to diff --git a/base_substate/tests/common.py b/base_substate/tests/common.py index 0168238001..d578acaa4f 100644 --- a/base_substate/tests/common.py +++ b/base_substate/tests/common.py @@ -7,18 +7,17 @@ class CommonBaseSubstate(BaseCommon): - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.loader = FakeModelLoader(cls.env, cls.__module__) - cls.loader.backup_registry() + def setUp(self): + super().setUp() + self.loader = FakeModelLoader(self.env, self.__module__) + self.loader.backup_registry() from .sale_test import ( BaseSubstateType, LineTest, SaleTest, ) - cls.loader.update_registry( + self.loader.update_registry( ( SaleTest, LineTest, @@ -26,10 +25,10 @@ def setUpClass(cls): ) ) - cls.sale_test_model = cls.env[SaleTest._name] - cls.sale_line_test_model = cls.env[LineTest._name] + self.sale_test_model = self.env[SaleTest._name] + self.sale_line_test_model = self.env[LineTest._name] - models = cls.env["ir.model"].search( + models = self.env["ir.model"].search( [ ( "model", @@ -40,7 +39,7 @@ def setUpClass(cls): ) for model in models: # Access record: - cls.env["ir.model.access"].create( + self.env["ir.model.access"].create( { "name": f"access {model.name}", "model_id": model.id, @@ -51,7 +50,6 @@ def setUpClass(cls): } ) - @classmethod - def tearDownClass(cls): - cls.loader.restore_registry() - super().tearDownClass() + def tearDown(self): + self.loader.restore_registry() + super().tearDown() diff --git a/base_substate/tests/test_base_substate.py b/base_substate/tests/test_base_substate.py index e63ae7dbd2..7a02d5e4f5 100644 --- a/base_substate/tests/test_base_substate.py +++ b/base_substate/tests/test_base_substate.py @@ -9,21 +9,20 @@ @tagged("post_install", "-at_install", "mi_tag") class TestBaseSubstate(CommonBaseSubstate): - @classmethod - def setUpClass(cls): - super().setUpClass() + def setUp(self): + super().setUp() - cls.substate_type = cls.env["base.substate.type"] - cls.base_substate = cls.env["base.substate"] + self.substate_type = self.env["base.substate.type"] + self.base_substate = self.env["base.substate"] - cls.mail_template = cls.env["mail.template"].create( + self.mail_template = self.env["mail.template"].create( { "name": "Waiting for legal documents", - "model_id": cls.env["ir.model"]._get(cls.sale_test_model._name).id, + "model_id": self.env["ir.model"]._get(self.sale_test_model._name).id, "subject": "Test Email Substate", } ) - cls.sale_test_substate_type = cls.substate_type.create( + self.sale_test_substate_type = self.substate_type.create( { "name": "Sale", "model": "base.substate.test.sale", @@ -31,59 +30,59 @@ def setUpClass(cls): } ) - cls.substate_val_quotation = cls.env["target.state.value"].create( + self.substate_val_quotation = self.env["target.state.value"].create( { "name": "Quotation", - "base_substate_type_id": cls.sale_test_substate_type.id, + "base_substate_type_id": self.sale_test_substate_type.id, "target_state_value": "draft", } ) - cls.substate_val_sale = cls.env["target.state.value"].create( + self.substate_val_sale = self.env["target.state.value"].create( { "name": "Sale order", - "base_substate_type_id": cls.sale_test_substate_type.id, + "base_substate_type_id": self.sale_test_substate_type.id, "target_state_value": "sale", } ) - cls.substate_under_negotiation = cls.base_substate.create( + self.substate_under_negotiation = self.base_substate.create( { "name": "Under negotiation", "sequence": 1, - "target_state_value_id": cls.substate_val_quotation.id, + "target_state_value_id": self.substate_val_quotation.id, } ) - cls.substate_won = cls.base_substate.create( + self.substate_won = self.base_substate.create( { "name": "Won", "sequence": 1, - "target_state_value_id": cls.substate_val_quotation.id, + "target_state_value_id": self.substate_val_quotation.id, } ) - cls.substate_wait_docs = cls.base_substate.create( + self.substate_wait_docs = self.base_substate.create( { "name": "Waiting for legal documents", "sequence": 2, - "target_state_value_id": cls.substate_val_sale.id, - "mail_template_id": cls.mail_template.id, + "target_state_value_id": self.substate_val_sale.id, + "mail_template_id": self.mail_template.id, } ) - cls.substate_valid_docs = cls.base_substate.create( + self.substate_valid_docs = self.base_substate.create( { "name": "To validate legal documents", "sequence": 3, - "target_state_value_id": cls.substate_val_sale.id, + "target_state_value_id": self.substate_val_sale.id, } ) - cls.substate_in_delivering = cls.base_substate.create( + self.substate_in_delivering = self.base_substate.create( { "name": "In delivering", "sequence": 4, - "target_state_value_id": cls.substate_val_sale.id, + "target_state_value_id": self.substate_val_sale.id, } ) diff --git a/base_tier_validation/README.rst b/base_tier_validation/README.rst index 28feb57387..1b2dfee08d 100644 --- a/base_tier_validation/README.rst +++ b/base_tier_validation/README.rst @@ -11,7 +11,7 @@ Base Tier Validation !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:9cc5960dec9b1355f4839a79c70c3b97249bf5bc0b33c22520b2c64fe007bed4 + !! source digest: sha256:645e44c3fcf23d79b54630957e5d799ea2ed485c7feb8c465638608181537bde !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png diff --git a/base_tier_validation/__manifest__.py b/base_tier_validation/__manifest__.py index 2e5b26816c..20a1f98959 100644 --- a/base_tier_validation/__manifest__.py +++ b/base_tier_validation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation", "summary": "Implement a validation process based on tiers.", - "version": "18.0.3.1.2", + "version": "18.0.3.1.4", "development_status": "Mature", "maintainers": ["LoisRForgeFlow"], "category": "Tools", diff --git a/base_tier_validation/models/tier_review.py b/base_tier_validation/models/tier_review.py index fa277921fd..ef64f2b029 100644 --- a/base_tier_validation/models/tier_review.py +++ b/base_tier_validation/models/tier_review.py @@ -14,6 +14,7 @@ class TierReview(models.Model): _name = "tier.review" _description = "Tier Review" + _order = "sequence, id" name = fields.Char(related="definition_id.name") status = fields.Selection( @@ -93,6 +94,14 @@ def _compute_reviewed_formated_date(self): @api.depends("definition_id.approve_sequence") def _compute_can_review(self): + """Update review status. Called manually from various review operations. + + To defer recompute, use context key + `tier_validation_defer_compute_can_review`. Be sure to explicitely call + the method afterwards. + """ + if self.env.context.get("tier_validation_defer_compute_can_review"): + return reviews = self.filtered(lambda rev: rev.status in ["waiting", "pending"]) if reviews: # get minimum sequence of all to prevent jumps diff --git a/base_tier_validation/static/description/index.html b/base_tier_validation/static/description/index.html index bbcd50479f..2836f62926 100644 --- a/base_tier_validation/static/description/index.html +++ b/base_tier_validation/static/description/index.html @@ -372,7 +372,7 @@

Base Tier Validation

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:9cc5960dec9b1355f4839a79c70c3b97249bf5bc0b33c22520b2c64fe007bed4 +!! source digest: sha256:645e44c3fcf23d79b54630957e5d799ea2ed485c7feb8c465638608181537bde !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Mature License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

Validating some operations is a common need across different areas in a diff --git a/base_tier_validation/tests/common.py b/base_tier_validation/tests/common.py index ccac99bffe..41ffd04813 100644 --- a/base_tier_validation/tests/common.py +++ b/base_tier_validation/tests/common.py @@ -10,11 +10,10 @@ class CommonTierValidation(BaseCommon): - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.loader = FakeModelLoader(cls.env, cls.__module__) - cls.loader.backup_registry() + def setUp(self): + super().setUp() + self.loader = FakeModelLoader(self.env, self.__module__) + self.loader.backup_registry() from .tier_validation_tester import ( TierDefinition, TierValidationTester, @@ -22,7 +21,7 @@ def setUpClass(cls): TierValidationTesterComputed, ) - cls.loader.update_registry( + self.loader.update_registry( ( TierValidationTester, TierValidationTester2, @@ -31,31 +30,31 @@ def setUpClass(cls): ) ) - cls.test_model = cls.env[TierValidationTester._name] - cls.test_model_2 = cls.env[TierValidationTester2._name] - cls.test_model_computed = cls.env[TierValidationTesterComputed._name] + self.test_model = self.env[TierValidationTester._name] + self.test_model_2 = self.env[TierValidationTester2._name] + self.test_model_computed = self.env[TierValidationTesterComputed._name] - cls.tester_model = cls.env["ir.model"].search( + self.tester_model = self.env["ir.model"].search( [("model", "=", "tier.validation.tester")] ) - cls.tester_model_2 = cls.env["ir.model"].search( + self.tester_model_2 = self.env["ir.model"].search( [("model", "=", "tier.validation.tester2")] ) - cls.tester_model_computed = cls.env["ir.model"].search( + self.tester_model_computed = self.env["ir.model"].search( [("model", "=", "tier.validation.tester.computed")] ) # Create a multi-company - cls.main_company = cls.env.ref("base.main_company") - cls.other_company = cls.env["res.company"].create({"name": "My Company"}) + self.main_company = self.env.ref("base.main_company") + self.other_company = self.env["res.company"].create({"name": "My Company"}) models = ( - cls.tester_model, - cls.tester_model_2, - cls.tester_model_computed, + self.tester_model, + self.tester_model_2, + self.tester_model_computed, ) for model in models: # Access record: - cls.env["ir.model.access"].create( + self.env["ir.model.access"].create( { "name": f"access {model.name}", "model_id": model.id, @@ -67,7 +66,7 @@ def setUpClass(cls): ) # Define views to avoid automatic views with all fields. - cls.env["ir.ui.view"].create( + self.env["ir.ui.view"].create( { "model": model.model, "name": f"Demo view for {model}", @@ -84,44 +83,44 @@ def setUpClass(cls): ) # Create users: - cls.test_user_1 = new_test_user( - cls.env, name="John", login="test1", groups="base.group_system" + self.test_user_1 = new_test_user( + self.env, name="John", login="test1", groups="base.group_system" ) - cls.test_user_2 = new_test_user(cls.env, name="Mike", login="test2") - cls.test_user_3_multi_company = new_test_user( - cls.env, + self.test_user_2 = new_test_user(self.env, name="Mike", login="test2") + self.test_user_3_multi_company = new_test_user( + self.env, name="Jane", login="test3", - company_ids=[Command.set([cls.main_company.id, cls.other_company.id])], + company_ids=[Command.set([self.main_company.id, self.other_company.id])], ) # Create groups - cls.test_group = cls.env["res.groups"].create( + self.test_group = self.env["res.groups"].create( { "name": "TestGroup", - "users": [(4, cls.test_user_1.id), (4, cls.test_user_2.id)], + "users": [(4, self.test_user_1.id), (4, self.test_user_2.id)], } ) # Create tier definitions: - cls.tier_def_obj = cls.env["tier.definition"] - cls.tier_definition = cls.tier_def_obj.create( + self.tier_def_obj = self.env["tier.definition"] + self.tier_definition = self.tier_def_obj.create( { - "model_id": cls.tester_model.id, + "model_id": self.tester_model.id, "review_type": "individual", - "reviewer_id": cls.test_user_1.id, + "reviewer_id": self.test_user_1.id, "definition_domain": "[('test_field', '=', 1.0)]", "sequence": 30, } ) - cls.test_record = cls.test_model.create({"test_field": 1.0}) - cls.test_record_2 = cls.test_model_2.create({"test_field": 1.0}) - cls.test_record_computed = cls.test_model_computed.create({"test_field": 1.0}) + self.test_record = self.test_model.create({"test_field": 1.0}) + self.test_record_2 = self.test_model_2.create({"test_field": 1.0}) + self.test_record_computed = self.test_model_computed.create({"test_field": 1.0}) - cls.tier_def_obj.create( + self.tier_def_obj.create( { - "model_id": cls.tester_model.id, + "model_id": self.tester_model.id, "review_type": "individual", - "reviewer_id": cls.test_user_1.id, + "reviewer_id": self.test_user_1.id, "definition_domain": "[('test_field', '>', 3.0)]", "approve_sequence": True, "notify_on_pending": False, @@ -129,11 +128,11 @@ def setUpClass(cls): "name": "Definition for test 19 - sequence - user 1", } ) - cls.tier_def_obj.create( + self.tier_def_obj.create( { - "model_id": cls.tester_model.id, + "model_id": self.tester_model.id, "review_type": "individual", - "reviewer_id": cls.test_user_2.id, + "reviewer_id": self.test_user_2.id, "definition_domain": "[('test_field', '>', 3.0)]", "approve_sequence": True, "notify_on_pending": True, @@ -142,11 +141,11 @@ def setUpClass(cls): } ) # Create definition for test 20 - cls.tier_def_obj.create( + self.tier_def_obj.create( { - "model_id": cls.tester_model.id, + "model_id": self.tester_model.id, "review_type": "individual", - "reviewer_id": cls.test_user_1.id, + "reviewer_id": self.test_user_1.id, "definition_domain": "[('test_field', '=', 0.9)]", "approve_sequence": False, "notify_on_pending": True, @@ -155,11 +154,11 @@ def setUpClass(cls): } ) - cls.tier_def_obj.create( + self.tier_def_obj.create( { - "model_id": cls.tester_model_computed.id, + "model_id": self.tester_model_computed.id, "review_type": "individual", - "reviewer_id": cls.test_user_1.id, + "reviewer_id": self.test_user_1.id, "definition_domain": "[]", "approve_sequence": True, "notify_on_pending": False, @@ -170,48 +169,47 @@ def setUpClass(cls): # Create definition for test 30, 31 # Main company tier definition - cls.tier_def_obj.create( + self.tier_def_obj.create( { - "model_id": cls.tester_model_2.id, + "model_id": self.tester_model_2.id, "review_type": "individual", - "reviewer_id": cls.test_user_1.id, + "reviewer_id": self.test_user_1.id, "definition_domain": "[('test_field', '>=', 1.0)]", "approve_sequence": True, "notify_on_pending": False, "sequence": 30, "name": "Definition for test 30 - sequence - user 1 - main company", - "company_id": cls.main_company.id, + "company_id": self.main_company.id, } ) - cls.tier_def_obj.create( + self.tier_def_obj.create( { - "model_id": cls.tester_model_2.id, + "model_id": self.tester_model_2.id, "review_type": "individual", - "reviewer_id": cls.test_user_3_multi_company.id, + "reviewer_id": self.test_user_3_multi_company.id, "definition_domain": "[('test_field', '>=', 1.0)]", "approve_sequence": True, "notify_on_pending": False, "sequence": 20, "name": "Definition for test 30 - sequence - user 3 - main company", - "company_id": cls.main_company.id, + "company_id": self.main_company.id, } ) # Other company tier definition - cls.tier_def_obj.create( + self.tier_def_obj.create( { - "model_id": cls.tester_model_2.id, + "model_id": self.tester_model_2.id, "review_type": "individual", - "reviewer_id": cls.test_user_3_multi_company.id, + "reviewer_id": self.test_user_3_multi_company.id, "definition_domain": "[('test_field', '>=', 1.0)]", "approve_sequence": True, "notify_on_pending": False, "sequence": 30, "name": "Definition for test 30 - sequence - user 3 - other company", - "company_id": cls.other_company.id, + "company_id": self.other_company.id, } ) - @classmethod - def tearDownClass(cls): - cls.loader.restore_registry() - super().tearDownClass() + def tearDown(self): + self.loader.restore_registry() + super().tearDown() diff --git a/base_tier_validation_confirm_auth/i18n/it.po b/base_tier_validation_confirm_auth/i18n/it.po new file mode 100644 index 0000000000..a75443690c --- /dev/null +++ b/base_tier_validation_confirm_auth/i18n/it.po @@ -0,0 +1,66 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation_confirm_auth +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-02-10 13:24+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: base_tier_validation_confirm_auth +#: model:ir.model,name:base_tier_validation_confirm_auth.model_comment_wizard +msgid "Comment Wizard" +msgstr "Procedura guidata commento" + +#. module: base_tier_validation_confirm_auth +#: model:ir.model.fields,help:base_tier_validation_confirm_auth.field_tier_definition__require_authentication +#: model:ir.model.fields,help:base_tier_validation_confirm_auth.field_tier_review__require_authentication +msgid "" +"If enabled, the user will be asked to authenticate himself in order to " +"validate or reject the tier." +msgstr "" +"Se abilitata, verrà chiesto all'utente di autenticarsi per validare o " +"rifiutare il livello." + +#. module: base_tier_validation_confirm_auth +#: model:ir.model.fields,field_description:base_tier_validation_confirm_auth.field_tier_definition__require_authentication +#: model:ir.model.fields,field_description:base_tier_validation_confirm_auth.field_tier_review__require_authentication +#: model:ir.model.fields,field_description:base_tier_validation_confirm_auth.field_tier_validation__require_authentication +msgid "Require Authentication" +msgstr "Richiede autenticazione" + +#. module: base_tier_validation_confirm_auth +#. odoo-python +#: code:addons/base_tier_validation_confirm_auth/models/res_users.py:0 +msgid "Security Control" +msgstr "Controllo di sicurezza" + +#. module: base_tier_validation_confirm_auth +#. odoo-python +#: code:addons/base_tier_validation_confirm_auth/models/res_users.py:0 +msgid "This method can only be accessed over HTTP" +msgstr "Si può accedere a questo metodo solo tramite accesso con HTTP" + +#. module: base_tier_validation_confirm_auth +#: model:ir.model,name:base_tier_validation_confirm_auth.model_tier_definition +msgid "Tier Definition" +msgstr "Definizione livello" + +#. module: base_tier_validation_confirm_auth +#: model:ir.model,name:base_tier_validation_confirm_auth.model_tier_review +msgid "Tier Review" +msgstr "Revisione livello" + +#. module: base_tier_validation_confirm_auth +#: model:ir.model,name:base_tier_validation_confirm_auth.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Validazione livello (sintesi)" diff --git a/base_tier_validation_correction/README.rst b/base_tier_validation_correction/README.rst index a5c5f55c9c..bde5211497 100644 --- a/base_tier_validation_correction/README.rst +++ b/base_tier_validation_correction/README.rst @@ -11,7 +11,7 @@ Base Tier Validation Correction !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:5ef682f702644c92187a7951b68516f4bbaa5d21a1e5766e2d76d88e343432a3 + !! source digest: sha256:4a81d2472d4cf81cd1b1c54ee9f8df778654d8f3888ba34b66837e6b9110fbbc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png diff --git a/base_tier_validation_correction/__manifest__.py b/base_tier_validation_correction/__manifest__.py index b2b72dcad3..df19fa89d1 100644 --- a/base_tier_validation_correction/__manifest__.py +++ b/base_tier_validation_correction/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation Correction", "summary": "Correct tier.review data after it has been created.", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "category": "Tools", "website": "https://github.com/OCA/server-ux", "author": "Ecosoft,Odoo Community Association (OCA)", diff --git a/base_tier_validation_correction/static/description/index.html b/base_tier_validation_correction/static/description/index.html index 72f79eb1b9..28a6fd3ecd 100644 --- a/base_tier_validation_correction/static/description/index.html +++ b/base_tier_validation_correction/static/description/index.html @@ -372,7 +372,7 @@

Base Tier Validation Correction

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

Alpha License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

This module provide a new operation to correct the information in diff --git a/base_tier_validation_correction/tests/test_tier_validation.py b/base_tier_validation_correction/tests/test_tier_validation.py index 0f30cd3412..0d6bad1b7c 100644 --- a/base_tier_validation_correction/tests/test_tier_validation.py +++ b/base_tier_validation_correction/tests/test_tier_validation.py @@ -9,15 +9,14 @@ class TierTierValidation(CommonTierValidation): - @classmethod - def setUpClass(cls): - super().setUpClass() + def setUp(self): + super().setUp() from .tier_validation_tester import TierValidationTester - cls.loader.update_registry((TierValidationTester,)) + self.loader.update_registry((TierValidationTester,)) - cls.test_record.name = "test" + self.test_record.name = "test" def test_01_tier_correction(self): """With the document in validation, diff --git a/base_tier_validation_formula/README.rst b/base_tier_validation_formula/README.rst index cccefa2142..05911dcb26 100644 --- a/base_tier_validation_formula/README.rst +++ b/base_tier_validation_formula/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 + ============================ Base Tier Validation Formula ============================ @@ -7,13 +11,13 @@ Base Tier Validation Formula !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:57ad8cd1879192037266bba67cdf5e43636d79da7ca0536dae323454c7286a86 + !! source digest: sha256:2dda79f5e977900dd6b6ff1fbb0d9dd6b612ee3b25170b6dcc383d65152afff0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png :target: https://odoo-community.org/page/development-status :alt: Mature -.. |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--ux-lightgray.png?logo=github diff --git a/base_tier_validation_formula/__manifest__.py b/base_tier_validation_formula/__manifest__.py index ea14ecc917..800c3a7e67 100644 --- a/base_tier_validation_formula/__manifest__.py +++ b/base_tier_validation_formula/__manifest__.py @@ -5,7 +5,7 @@ "name": "Base Tier Validation Formula", "summary": """ Formulas for Base tier validation""", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "category": "Tools", "license": "AGPL-3", "development_status": "Mature", diff --git a/base_tier_validation_formula/static/description/index.html b/base_tier_validation_formula/static/description/index.html index 2c3876018f..93473f3795 100644 --- a/base_tier_validation_formula/static/description/index.html +++ b/base_tier_validation_formula/static/description/index.html @@ -3,7 +3,7 @@ -Base Tier Validation Formula +README.rst -

-

Base Tier Validation Formula

+
+ + +Odoo Community Association + +
+

Base Tier Validation Formula

-

Mature License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

+

Mature License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

This module includes the ability to define the tier definition domain and the tier reviewers using python code.

Table of contents

@@ -387,7 +392,7 @@

Base Tier Validation Formula

-

Usage

+

Usage

To define the domain, * By python code choose the Formula option in the Definition field. * By both domain and python code, choose the Domain & Formula option in the Definition field.

@@ -395,7 +400,7 @@

Usage

option in the Validated by field.

-

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 @@ -403,15 +408,15 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Creu Blanca
-

Contributors

+

Contributors

-

Other credits

+

Other credits

The migration of this module from 15.0 to 16.0 was financially supported by Camptocamp

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -450,5 +455,6 @@

Maintainers

+
diff --git a/base_tier_validation_formula/tests/test_tier_validation.py b/base_tier_validation_formula/tests/test_tier_validation.py index 58b0b4af64..d61eaa2322 100644 --- a/base_tier_validation_formula/tests/test_tier_validation.py +++ b/base_tier_validation_formula/tests/test_tier_validation.py @@ -12,27 +12,26 @@ # Use Base Common @tagged("post_install", "-at_install") class TierTierValidation(BaseCommon): - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.loader = FakeModelLoader(cls.env, cls.__module__) - cls.loader.backup_registry() + def setUp(self): + super().setUp() + self.loader = FakeModelLoader(self.env, self.__module__) + self.loader.backup_registry() from odoo.addons.base_tier_validation.tests.tier_validation_tester import ( TierValidationTester, ) - cls.loader.update_registry((TierValidationTester,)) - cls.test_model = cls.env[TierValidationTester._name] + self.loader.update_registry((TierValidationTester,)) + self.test_model = self.env[TierValidationTester._name] - cls.tester_model = cls.env["ir.model"].search( + self.tester_model = self.env["ir.model"].search( [("model", "=", "tier.validation.tester")] ) # Access record: - cls.env["ir.model.access"].create( + self.env["ir.model.access"].create( { "name": "access.tester", - "model_id": cls.tester_model.id, + "model_id": self.tester_model.id, "perm_read": 1, "perm_write": 1, "perm_create": 1, @@ -40,30 +39,29 @@ def setUpClass(cls): } ) - cls.test_user_1 = cls.env.ref("base.user_admin") - cls.test_user_2 = cls.env.ref("base.user_demo") + self.test_user_1 = self.env.ref("base.user_admin") + self.test_user_2 = self.env.ref("base.user_demo") # Create users: - cls.test_user_3 = cls.env["res.users"].create( + self.test_user_3 = self.env["res.users"].create( {"name": "Mary", "login": "test3", "email": "mary@yourcompany.example.com"} ) # Create tier definitions: - cls.tier_def_obj = cls.env["tier.definition"] - cls.tier_def_obj.create( + self.tier_def_obj = self.env["tier.definition"] + self.tier_def_obj.create( { - "model_id": cls.tester_model.id, + "model_id": self.tester_model.id, "review_type": "individual", - "reviewer_id": cls.test_user_1.id, + "reviewer_id": self.test_user_1.id, "definition_domain": "[('test_field', '>', 1.0)]", } ) - cls.test_record = cls.test_model.create({"test_field": 2.5}) + self.test_record = self.test_model.create({"test_field": 2.5}) - @classmethod - def tearDownClass(cls): - cls.loader.restore_registry() - return super().tearDownClass() + def tearDown(self): + self.loader.restore_registry() + super().tearDown() def test_01_reviewer_from_python_expression(self): tier_definition = self.tier_def_obj.create( diff --git a/base_tier_validation_forward/README.rst b/base_tier_validation_forward/README.rst index 2f72b0f468..0fbe9b3073 100644 --- a/base_tier_validation_forward/README.rst +++ b/base_tier_validation_forward/README.rst @@ -11,7 +11,7 @@ Base Tier Validation Forward !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:3132fe5779f9454c430ca06f8976d6f47ca050f93a5a4916141151891436f8a2 + !! source digest: sha256:7c49d5a804b52033c16495bcd0f3a92c029fd541ae532e3b0be11b26da1d9c61 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png diff --git a/base_tier_validation_forward/__manifest__.py b/base_tier_validation_forward/__manifest__.py index 2f16f0a911..7dd44e57d3 100644 --- a/base_tier_validation_forward/__manifest__.py +++ b/base_tier_validation_forward/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation Forward", "summary": "Forward option for base tiers", - "version": "18.0.2.0.1", + "version": "18.0.2.0.2", "category": "Tools", "website": "https://github.com/OCA/server-ux", "author": "Ecosoft,Odoo Community Association (OCA)", diff --git a/base_tier_validation_forward/models/tier_review.py b/base_tier_validation_forward/models/tier_review.py index 0e0fbaffc7..2455cfe0af 100644 --- a/base_tier_validation_forward/models/tier_review.py +++ b/base_tier_validation_forward/models/tier_review.py @@ -5,7 +5,6 @@ class TierReview(models.Model): _inherit = "tier.review" - _order = "sequence" # NOTE: Added translate=True because in the compute method we assign: # rec.name = rec.definition_id.name diff --git a/base_tier_validation_forward/static/description/index.html b/base_tier_validation_forward/static/description/index.html index 4171780a1b..34fa3192b6 100644 --- a/base_tier_validation_forward/static/description/index.html +++ b/base_tier_validation_forward/static/description/index.html @@ -372,7 +372,7 @@

Base Tier Validation Forward

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:3132fe5779f9454c430ca06f8976d6f47ca050f93a5a4916141151891436f8a2 +!! source digest: sha256:7c49d5a804b52033c16495bcd0f3a92c029fd541ae532e3b0be11b26da1d9c61 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Alpha License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

This module add an advance option to base_tier_validation.

diff --git a/base_tier_validation_forward/tests/test_tier_validation.py b/base_tier_validation_forward/tests/test_tier_validation.py index ef39bdbd0e..811591874e 100644 --- a/base_tier_validation_forward/tests/test_tier_validation.py +++ b/base_tier_validation_forward/tests/test_tier_validation.py @@ -1,7 +1,7 @@ # Copyright 2018 ForgeFlow S.L. # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). -from odoo.tests import Form, tagged +from odoo.tests import Form, new_test_user, tagged from odoo.addons.base_tier_validation.tests.common import CommonTierValidation @@ -11,6 +11,7 @@ class TierTierValidation(CommonTierValidation): @classmethod def setUpClass(cls): super().setUpClass() + cls.other_test_user = new_test_user(cls.env, name="Clarissa", login="forward") def test_01_forward_tier(self): # Create new test record @@ -65,3 +66,143 @@ def test_01_forward_tier(self): wiz = wizard.save() wiz.add_comment() self.assertEqual(record.validation_status, "validated") + + def _test_forward_tier_multiple(self, has_comment=False): + """Run forwarding flow with or without comments""" + self.tier_def_obj.create( + { + "approve_sequence": True, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": has_comment, + "has_forward": True, + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "sequence": 2, + } + ) + self.tier_def_obj.create( + { + "approve_sequence": True, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": True, + "has_forward": True, + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "sequence": 1, + } + ) + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + test_record.with_user(self.test_user_2.id).request_validation() + self.env.invalidate_all() + self.assertRecordValues( + test_record.review_ids, + [ + { + "reviewer_id": self.test_user_1.id, + "status": "pending", + }, + { + "reviewer_id": self.test_user_2.id, + "status": "waiting", + }, + ], + ) + # Forward the first review + action = test_record.with_user(self.test_user_1).forward_tier() + self.env[action["res_model"]].with_user(self.test_user_1).with_context( + **action["context"] + ).create( + { + "forward_reviewer_id": self.other_test_user.id, + "forward_description": "Have a look", + } + ).add_forward() + # The forwarded review is now in status 'forwarded', + # The new review is in state 'pending', + # and the remaining review is in status 'waiting'. + self.assertRecordValues( + test_record.review_ids, + [ + { + "reviewer_id": self.test_user_1.id, + "status": "forwarded", + }, + { + "reviewer_id": self.other_test_user.id, + "status": "pending", + }, + { + "reviewer_id": self.test_user_2.id, + "status": "waiting", + }, + ], + ) + + action = test_record.with_user(self.other_test_user).validate_tier() + if action: + self.env[action["res_model"]].with_user(self.other_test_user).with_context( + **action["context"] + ).create( + { + "comment": "Reviewed", + } + ).add_comment() + + self.assertRecordValues( + test_record.review_ids, + [ + { + "reviewer_id": self.test_user_1.id, + "status": "forwarded", + }, + { + "reviewer_id": self.other_test_user.id, + "status": "approved", + }, + { + "reviewer_id": self.test_user_2.id, + "status": "pending", + }, + ], + ) + + action = test_record.with_user(self.test_user_2).validate_tier() + if action: + self.env[action["res_model"]].with_user(self.test_user_2).with_context( + **action["context"] + ).create( + { + "comment": "Reviewed", + } + ).add_comment() + + self.assertRecordValues( + test_record.review_ids, + [ + { + "reviewer_id": self.test_user_1.id, + "status": "forwarded", + }, + { + "reviewer_id": self.other_test_user.id, + "status": "approved", + }, + { + "reviewer_id": self.test_user_2.id, + "status": "approved", + }, + ], + ) + self.assertEqual(test_record.validation_status, "validated") + + def test_02_forward_tier_multiple_with_comment(self): + """Expected flow with forwards and comments""" + # Create tier definitions with a different sequence + self._test_forward_tier_multiple(has_comment=True) + + def test_03_forward_tier_multiple_without_comment(self): + """Expected flow with forwards, but without comments""" + self._test_forward_tier_multiple(has_comment=False) diff --git a/base_tier_validation_forward/wizard/forward_wizard.py b/base_tier_validation_forward/wizard/forward_wizard.py index 86253ffe57..c59d4fc2e3 100644 --- a/base_tier_validation_forward/wizard/forward_wizard.py +++ b/base_tier_validation_forward/wizard/forward_wizard.py @@ -35,15 +35,21 @@ def add_forward(self): ) } ) - prev_comment.add_comment() + prev_comment.with_context( + tier_validation_defer_compute_can_review=True + ).add_comment() prev_reviews = prev_comment.review_ids - review = self.env["tier.review"].create( - { - "model": rec._name, - "res_id": rec.id, - "sequence": max(prev_reviews.mapped("sequence")) + 0.1, - "requested_by": self.env.uid, - } + review = ( + self.env["tier.review"] + .with_context(tier_validation_defer_compute_can_review=True) + .create( + { + "model": rec._name, + "res_id": rec.id, + "sequence": max(prev_reviews.mapped("sequence")), + "requested_by": self.env.uid, + } + ) ) # Because following fields are readonly, we need to write after create review.write( diff --git a/base_tier_validation_server_action/README.rst b/base_tier_validation_server_action/README.rst index e25fd91bec..0dbb966286 100644 --- a/base_tier_validation_server_action/README.rst +++ b/base_tier_validation_server_action/README.rst @@ -11,7 +11,7 @@ Base Tier Validation - Server Action !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:d2423fd167c12f75c0dddb01d1e6d3d466dded51f278ab5a4c478e4f218dd0a3 + !! source digest: sha256:d48528f20aa3399ca23b8de6f65f75c91d14423e28b51cc2f3efe38041f174e5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/base_tier_validation_server_action/__manifest__.py b/base_tier_validation_server_action/__manifest__.py index 863fb02ff6..9100fc3e6b 100644 --- a/base_tier_validation_server_action/__manifest__.py +++ b/base_tier_validation_server_action/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation - Server Action", "summary": "Add option to call server action when a tier is validated", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "category": "Tools", "website": "https://github.com/OCA/server-ux", "author": "Ecosoft, Odoo Community Association (OCA)", diff --git a/base_tier_validation_server_action/static/description/index.html b/base_tier_validation_server_action/static/description/index.html index 3f4deb48ac..2759dd680b 100644 --- a/base_tier_validation_server_action/static/description/index.html +++ b/base_tier_validation_server_action/static/description/index.html @@ -372,7 +372,7 @@

Base Tier Validation - Server Action

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

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

This module add option to call “Server Action” when a tier definition is diff --git a/base_tier_validation_server_action/tests/test_tier_validation.py b/base_tier_validation_server_action/tests/test_tier_validation.py index 797f15fee2..bb91cad75a 100644 --- a/base_tier_validation_server_action/tests/test_tier_validation.py +++ b/base_tier_validation_server_action/tests/test_tier_validation.py @@ -8,25 +8,24 @@ @tagged("post_install", "-at_install") class TierTierValidation(common.TransactionCase): - @classmethod - def setUpClass(cls): - super().setUpClass() + def setUp(self): + super().setUp() - cls.loader = FakeModelLoader(cls.env, cls.__module__) - cls.loader.backup_registry() + self.loader = FakeModelLoader(self.env, self.__module__) + self.loader.backup_registry() from .tier_validation_tester import TierValidationTester - cls.loader.update_registry((TierValidationTester,)) - cls.test_model = cls.env[TierValidationTester._name] - cls.tester_model = cls.env["ir.model"].search( + self.loader.update_registry((TierValidationTester,)) + self.test_model = self.env[TierValidationTester._name] + self.tester_model = self.env["ir.model"].search( [("model", "=", "tier.validation.tester")] ) # Access record: - cls.env["ir.model.access"].create( + self.env["ir.model.access"].create( { "name": "access.tester", - "model_id": cls.tester_model.id, + "model_id": self.tester_model.id, "perm_read": 1, "perm_write": 1, "perm_create": 1, @@ -35,36 +34,35 @@ def setUpClass(cls): ) # Create users: - cls.group_system = cls.env.ref("base.group_system") - group_ids = cls.group_system.ids - cls.test_user_1 = cls.env["res.users"].create( + self.group_system = self.env.ref("base.group_system") + group_ids = self.group_system.ids + self.test_user_1 = self.env["res.users"].create( {"name": "John", "login": "test1", "groups_id": [(6, 0, group_ids)]} ) - cls.test_user_2 = cls.env["res.users"].create( + self.test_user_2 = self.env["res.users"].create( {"name": "Mike", "login": "test2"} ) - cls.test_user_3 = cls.env["res.users"].create( + self.test_user_3 = self.env["res.users"].create( {"name": "John Wick", "login": "test3", "groups_id": [(6, 0, group_ids)]} ) # Create tier definitions: - cls.tier_def_obj = cls.env["tier.definition"] - cls.tier_def_obj.create( + self.tier_def_obj = self.env["tier.definition"] + self.tier_def_obj.create( { - "model_id": cls.tester_model.id, + "model_id": self.tester_model.id, "review_type": "individual", - "reviewer_id": cls.test_user_1.id, + "reviewer_id": self.test_user_1.id, "definition_domain": "[('test_field', '>', 1.0)]", "sequence": 30, } ) - cls.test_record = cls.test_model.create({"test_field": 2.5}) + self.test_record = self.test_model.create({"test_field": 2.5}) - @classmethod - def tearDownClass(cls): - cls.loader.restore_registry() - super().tearDownClass() + def tearDown(self): + self.loader.restore_registry() + super().tearDown() def test_1_auto_validation(self): # Create new test record diff --git a/date_range/README.rst b/date_range/README.rst index ba2cea1863..925d626ec2 100644 --- a/date_range/README.rst +++ b/date_range/README.rst @@ -11,7 +11,7 @@ Date Range !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:e798e5e6789b928f8ef43072de6c2276e3cdccf25828da785d6a5feb2054492b + !! source digest: sha256:5f66cec3859fdf0bc0166a89912cf934086824c3400201e6172858f3d13f6bc1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png diff --git a/date_range/__manifest__.py b/date_range/__manifest__.py index b52b6a7fbf..03598aa065 100644 --- a/date_range/__manifest__.py +++ b/date_range/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Date Range", "summary": "Manage all kind of date range", - "version": "18.0.5.0.0", + "version": "18.0.5.0.1", "category": "Uncategorized", "website": "https://github.com/OCA/server-ux", "author": "ACSONE SA/NV, Odoo Community Association (OCA)", diff --git a/date_range/static/description/index.html b/date_range/static/description/index.html index 3a0364af41..8c6430db41 100644 --- a/date_range/static/description/index.html +++ b/date_range/static/description/index.html @@ -372,7 +372,7 @@

Date Range

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

Mature License: LGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

This module lets you define global date ranges that can be used to diff --git a/date_range/tests/test_date_range_search_mixin.py b/date_range/tests/test_date_range_search_mixin.py index 185dcf9779..7db2204486 100644 --- a/date_range/tests/test_date_range_search_mixin.py +++ b/date_range/tests/test_date_range_search_mixin.py @@ -8,21 +8,20 @@ class TestDateRangeSearchMixin(TransactionCase): - @classmethod - def setUpClass(cls): - super().setUpClass() + def setUp(self): + super().setUp() # Load a test model using odoo_test_helper - cls.loader = FakeModelLoader(cls.env, cls.__module__) - cls.loader.backup_registry() + self.loader = FakeModelLoader(self.env, self.__module__) + self.loader.backup_registry() from .models import TestDateRangeSearchMixin - cls.loader.update_registry((TestDateRangeSearchMixin,)) + self.loader.update_registry((TestDateRangeSearchMixin,)) - cls.env.user.lang = "en_US" - rtype = cls.env["date.range.type"].create( + self.env.user.lang = "en_US" + rtype = self.env["date.range.type"].create( {"name": __name__, "company_id": False, "allow_overlap": False} ) - cls.env["date.range.generator"].create( + self.env["date.range.generator"].create( { "date_start": "1943-01-01", "name_prefix": "1943-", @@ -32,13 +31,12 @@ def setUpClass(cls): "count": 4, } ).action_apply() - cls.ranges = cls.env["date.range"].search([("type_id", "=", rtype.id)]) - cls.model = cls.env[TestDateRangeSearchMixin._name] + self.ranges = self.env["date.range"].search([("type_id", "=", rtype.id)]) + self.model = self.env[TestDateRangeSearchMixin._name] - @classmethod - def tearDownClass(cls): - cls.loader.restore_registry() - return super().tearDownClass() + def tearDown(self): + self.loader.restore_registry() + return super().tearDown() def test_01_search_view(self): """The search field is injected in the model's search view""" diff --git a/multi_step_wizard/README.rst b/multi_step_wizard/README.rst index 1b9a154a26..20af96bb37 100644 --- a/multi_step_wizard/README.rst +++ b/multi_step_wizard/README.rst @@ -11,7 +11,7 @@ Multi-Steps Wizards !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:2c613316e4fe93360ef0a61580e69ab980e62bce673bf708502b8e0f2aceb7f2 + !! source digest: sha256:aa17cb8213ca51dc75d305ec7f980540547f7f20cc760fcb8924715152b93643 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/multi_step_wizard/__manifest__.py b/multi_step_wizard/__manifest__.py index 7b4a530570..fc0dd18726 100644 --- a/multi_step_wizard/__manifest__.py +++ b/multi_step_wizard/__manifest__.py @@ -2,7 +2,7 @@ { "name": "Multi-Steps Wizards", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "author": "Camptocamp,Odoo Community Association (OCA)", "license": "AGPL-3", "depends": ["base"], diff --git a/multi_step_wizard/static/description/index.html b/multi_step_wizard/static/description/index.html index 230ec9a026..d196705a1a 100644 --- a/multi_step_wizard/static/description/index.html +++ b/multi_step_wizard/static/description/index.html @@ -372,7 +372,7 @@

Multi-Steps Wizards

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

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

This module is a base for creating multi-steps wizards. It does nothing diff --git a/multi_step_wizard/tests/common.py b/multi_step_wizard/tests/common.py index c872354e7d..dbd0b3c452 100644 --- a/multi_step_wizard/tests/common.py +++ b/multi_step_wizard/tests/common.py @@ -7,16 +7,14 @@ class CommonTestMultiStepWizard(common.TransactionCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.loader = FakeModelLoader(cls.env, cls.__module__) - cls.loader.backup_registry() + def setUp(self): + super().setUp() + self.loader = FakeModelLoader(self.env, self.__module__) + self.loader.backup_registry() from .multi_step_wizard_test import MultiStepWizardTest - cls.loader.update_registry((MultiStepWizardTest,)) + self.loader.update_registry((MultiStepWizardTest,)) - @classmethod - def tearDownClass(cls): - cls.loader.restore_registry() + def tearDown(self): + self.loader.restore_registry() return super().tearDownClass()