diff --git a/README.md b/README.md index 394a86099c..8bc0b9eca9 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ addon | version | maintainers | summary [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.0 | | 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.0.0 | LoisRForgeFlow | Implement a validation process based on tiers. +[base_tier_validation](base_tier_validation/) | 18.0.3.1.0 | LoisRForgeFlow | Implement a validation process based on tiers. [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.0 | 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 @@ -47,8 +47,8 @@ addon | version | maintainers | summary [multi_step_wizard](multi_step_wizard/) | 18.0.1.0.0 | | 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.0 | | Mass Editing -[server_action_mass_edit_onchange](server_action_mass_edit_onchange/) | 18.0.1.1.0 | | Extension of server_action_mass_edit +[server_action_mass_edit](server_action_mass_edit/) | 18.0.1.1.1 | | Mass Editing +[server_action_mass_edit_onchange](server_action_mass_edit_onchange/) | 18.0.1.1.1 | | Extension of server_action_mass_edit [template_content_swapper](template_content_swapper/) | 18.0.1.0.0 | yostashiro AungKoKoLin1997 | Template Content Swapper [//]: # (end addons) diff --git a/base_tier_validation/README.rst b/base_tier_validation/README.rst index 9e7da43fb8..ce33fce265 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:6d11975caf64405a5a43026ff242109052744ce42ab068f3e50f93dd016d1208 + !! source digest: sha256:3e44413fd72f8949deba313c3f31047cbf30ba3b17d78342590d2376001d905f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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 588e7a61dd..005c6ca483 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.0.0", + "version": "18.0.3.1.0", "development_status": "Mature", "maintainers": ["LoisRForgeFlow"], "category": "Tools", diff --git a/base_tier_validation/i18n/base_tier_validation.pot b/base_tier_validation/i18n/base_tier_validation.pot index 28c631a21a..1636308417 100644 --- a/base_tier_validation/i18n/base_tier_validation.pot +++ b/base_tier_validation/i18n/base_tier_validation.pot @@ -648,12 +648,6 @@ msgstr "" msgid "The review has been reset by %s." msgstr "" -#. module: base_tier_validation -#. odoo-python -#: code:addons/base_tier_validation/models/tier_review.py:0 -msgid "There are no res.users in the selected field" -msgstr "" - #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -814,6 +808,12 @@ msgstr "" msgid "Validation Status" msgstr "" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids msgid "Validations" diff --git a/base_tier_validation/i18n/es.po b/base_tier_validation/i18n/es.po index 1ba164005e..308529a112 100644 --- a/base_tier_validation/i18n/es.po +++ b/base_tier_validation/i18n/es.po @@ -681,12 +681,6 @@ msgstr "Estado" msgid "The review has been reset by %s." msgstr "La revisión ha sido reiniciada por %s." -#. module: base_tier_validation -#. odoo-python -#: code:addons/base_tier_validation/models/tier_review.py:0 -msgid "There are no res.users in the selected field" -msgstr "No hay res.usuarios en el campo seleccionado" - #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -847,6 +841,12 @@ msgstr "Fecha de Validación Formateada" msgid "Validation Status" msgstr "Estado de validación" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids msgid "Validations" @@ -910,6 +910,9 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "ej. Validación de Nivel por..." +#~ msgid "There are no res.users in the selected field" +#~ msgstr "No hay res.usuarios en el campo seleccionado" + #, python-format #~ msgid "Activity" #~ msgstr "Actividades" diff --git a/base_tier_validation/i18n/es_MX.po b/base_tier_validation/i18n/es_MX.po index b3dacca49a..6483283e1b 100644 --- a/base_tier_validation/i18n/es_MX.po +++ b/base_tier_validation/i18n/es_MX.po @@ -656,12 +656,6 @@ msgstr "Estatus" msgid "The review has been reset by %s." msgstr "%s ha restablecido la revisión." -#. module: base_tier_validation -#. odoo-python -#: code:addons/base_tier_validation/models/tier_review.py:0 -msgid "There are no res.users in the selected field" -msgstr "No hay res.users en el campo seleccionado" - #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -822,6 +816,12 @@ msgstr "" msgid "Validation Status" msgstr "" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids msgid "Validations" @@ -885,6 +885,9 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "p.ej. Validación de nivel para ..." +#~ msgid "There are no res.users in the selected field" +#~ msgstr "No hay res.users en el campo seleccionado" + #, python-format #~ msgid "" #~ "This action needs to be validated for at least one record. \n" diff --git a/base_tier_validation/i18n/fr.po b/base_tier_validation/i18n/fr.po index 5eef6fb330..8d6b934d06 100644 --- a/base_tier_validation/i18n/fr.po +++ b/base_tier_validation/i18n/fr.po @@ -659,12 +659,6 @@ msgstr "Statut" msgid "The review has been reset by %s." msgstr "Cette revue a été réinitialisée par %s." -#. module: base_tier_validation -#. odoo-python -#: code:addons/base_tier_validation/models/tier_review.py:0 -msgid "There are no res.users in the selected field" -msgstr "Le champ sélectionné ne référence pas des res.users" - #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -825,6 +819,12 @@ msgstr "Date de validation formatée" msgid "Validation Status" msgstr "" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids msgid "Validations" @@ -888,6 +888,9 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "par ex Niveau de validation pour..." +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Le champ sélectionné ne référence pas des res.users" + #, python-format #~ msgid "Activity" #~ msgstr "Activité" diff --git a/base_tier_validation/i18n/it.po b/base_tier_validation/i18n/it.po index 8b7ef87c30..f464fabdba 100644 --- a/base_tier_validation/i18n/it.po +++ b/base_tier_validation/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-07-23 14:25+0000\n" +"PO-Revision-Date: 2025-10-21 09:43+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -688,12 +688,6 @@ msgstr "Stato" msgid "The review has been reset by %s." msgstr "L'approvazione è stata riavviata da %s." -#. module: base_tier_validation -#. odoo-python -#: code:addons/base_tier_validation/models/tier_review.py:0 -msgid "There are no res.users in the selected field" -msgstr "Non ci sono res.users nel campo selezionato" - #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -858,6 +852,12 @@ msgstr "Data formattata validazione" msgid "Validation Status" msgstr "Stato validazione" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "Il campo del revisore di convalida deve essere del tipo appropriato" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids msgid "Validations" @@ -931,6 +931,9 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "es. Validazione livello per ..." +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Non ci sono res.users nel campo selezionato" + #, python-format #~ msgid "Activity" #~ msgstr "Attività" diff --git a/base_tier_validation/i18n/nl.po b/base_tier_validation/i18n/nl.po index bea044bf65..96229640f5 100644 --- a/base_tier_validation/i18n/nl.po +++ b/base_tier_validation/i18n/nl.po @@ -691,12 +691,6 @@ msgstr "Status" msgid "The review has been reset by %s." msgstr "De beoordeling is opnieuw ingesteld door %s." -#. module: base_tier_validation -#. odoo-python -#: code:addons/base_tier_validation/models/tier_review.py:0 -msgid "There are no res.users in the selected field" -msgstr "Er zijn geen res.users in het geselecteerde veld" - #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -861,6 +855,12 @@ msgstr "Validatie Datum" msgid "Validation Status" msgstr "Validatiestatus" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids msgid "Validations" @@ -933,3 +933,6 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form msgid "e.g. Tier Validation for..." msgstr "bijv. Niveau Validatie voor..." + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Er zijn geen res.users in het geselecteerde veld" diff --git a/base_tier_validation/i18n/nl_NL.po b/base_tier_validation/i18n/nl_NL.po index 055c755812..efb4b172ba 100644 --- a/base_tier_validation/i18n/nl_NL.po +++ b/base_tier_validation/i18n/nl_NL.po @@ -691,12 +691,6 @@ msgstr "Status" msgid "The review has been reset by %s." msgstr "De beoordeling is opnieuw gestart door %s." -#. module: base_tier_validation -#. odoo-python -#: code:addons/base_tier_validation/models/tier_review.py:0 -msgid "There are no res.users in the selected field" -msgstr "Er zijn geen res.users in het geselecteerde veld" - #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -861,6 +855,12 @@ msgstr "Validatie Datum" msgid "Validation Status" msgstr "Validatie Status" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids msgid "Validations" @@ -934,6 +934,9 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "bijv. Tier validatie voor..." +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Er zijn geen res.users in het geselecteerde veld" + #, python-format #~ msgid "Activity" #~ msgstr "Activiteit" diff --git a/base_tier_validation/i18n/sv.po b/base_tier_validation/i18n/sv.po index 76b8f7ebef..d7d4ff1370 100644 --- a/base_tier_validation/i18n/sv.po +++ b/base_tier_validation/i18n/sv.po @@ -682,12 +682,6 @@ msgstr "Status" msgid "The review has been reset by %s." msgstr "Granskningen har återställts av %s." -#. module: base_tier_validation -#. odoo-python -#: code:addons/base_tier_validation/models/tier_review.py:0 -msgid "There are no res.users in the selected field" -msgstr "Det finns inga res.users i det valda fältet" - #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -848,6 +842,12 @@ msgstr "Validering Formated Date" msgid "Validation Status" msgstr "Status för validering" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids msgid "Validations" @@ -911,6 +911,9 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "t.ex. attestvalidering för..." +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Det finns inga res.users i det valda fältet" + #, python-format #~ msgid "Activity" #~ msgstr "Aktivitet" diff --git a/base_tier_validation/i18n/tr.po b/base_tier_validation/i18n/tr.po index 9c80b66d1e..393a8fff84 100644 --- a/base_tier_validation/i18n/tr.po +++ b/base_tier_validation/i18n/tr.po @@ -686,12 +686,6 @@ msgstr "Durumu" msgid "The review has been reset by %s." msgstr "İnceleme %s tarafından sıfırlandı." -#. module: base_tier_validation -#. odoo-python -#: code:addons/base_tier_validation/models/tier_review.py:0 -msgid "There are no res.users in the selected field" -msgstr "Seçili alanda res.kullanıcı yok" - #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -855,6 +849,12 @@ msgstr "Doğrulama Format Tarihi" msgid "Validation Status" msgstr "Doğrulama Durumu" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids msgid "Validations" @@ -928,6 +928,9 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "ör. Şunun için Seviye Doğrulaması..." +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Seçili alanda res.kullanıcı yok" + #, python-format #~ msgid "Activity" #~ msgstr "Aktivite" diff --git a/base_tier_validation/i18n/vi_VN.po b/base_tier_validation/i18n/vi_VN.po index 3ed155112c..99e64c83de 100644 --- a/base_tier_validation/i18n/vi_VN.po +++ b/base_tier_validation/i18n/vi_VN.po @@ -664,12 +664,6 @@ msgstr "" msgid "The review has been reset by %s." msgstr "Đánh giá đã được thiết lập lại bởi %s." -#. module: base_tier_validation -#. odoo-python -#: code:addons/base_tier_validation/models/tier_review.py:0 -msgid "There are no res.users in the selected field" -msgstr "" - #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -833,6 +827,12 @@ msgstr "" msgid "Validation Status" msgstr "" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids msgid "Validations" diff --git a/base_tier_validation/i18n/zh_CN.po b/base_tier_validation/i18n/zh_CN.po index 45a7fca376..21f90865a0 100644 --- a/base_tier_validation/i18n/zh_CN.po +++ b/base_tier_validation/i18n/zh_CN.po @@ -651,12 +651,6 @@ msgstr "状态" msgid "The review has been reset by %s." msgstr "" -#. module: base_tier_validation -#. odoo-python -#: code:addons/base_tier_validation/models/tier_review.py:0 -msgid "There are no res.users in the selected field" -msgstr "" - #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -819,6 +813,12 @@ msgstr "" msgid "Validation Status" msgstr "" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids msgid "Validations" diff --git a/base_tier_validation/models/tier_definition.py b/base_tier_validation/models/tier_definition.py index 5f5d221774..7bd7c3940a 100644 --- a/base_tier_validation/models/tier_definition.py +++ b/base_tier_validation/models/tier_definition.py @@ -120,7 +120,12 @@ def _compute_domain_reviewer_field(self): IrModelFields = self.env["ir.model.fields"].sudo() valid_reviewer_fields = dict( IrModelFields._read_group( - domain=[("model", "in", models), ("relation", "=", "res.users")], + domain=[ + ("model", "in", models), + "|", + ("relation", "=", "res.users"), + ("relation", "=", "res.groups"), + ], groupby=["model"], aggregates=["id:array_agg"], ) diff --git a/base_tier_validation/models/tier_review.py b/base_tier_validation/models/tier_review.py index cd5dc3bf4f..fa277921fd 100644 --- a/base_tier_validation/models/tier_review.py +++ b/base_tier_validation/models/tier_review.py @@ -150,15 +150,22 @@ def _compute_todo_by(self): def _get_reviewers(self): if self.reviewer_id or self.reviewer_group_id.users: return self.reviewer_id + self.reviewer_group_id.users - reviewer_field = self.env["res.users"] if self.reviewer_field_id: resource = self.env[self.model].browse(self.res_id) reviewer_field = getattr(resource, self.reviewer_field_id.name, False) - if not reviewer_field or not reviewer_field._name == "res.users": - raise ValidationError( - self.env._("There are no res.users in the selected field") - ) - return reviewer_field + if reviewer_field: + if reviewer_field._name == "res.groups": + return reviewer_field.users + elif reviewer_field._name == "res.users": + return reviewer_field + else: + raise ValidationError( + self.env._( + "Validation reviewer field " + "should be of the appropriate type" + ) + ) + return self.env["res.users"] def _notify_pending_status(self, review_ids): """Method to call and reuse abstract notification method""" diff --git a/base_tier_validation/static/description/index.html b/base_tier_validation/static/description/index.html index a9c8064f6d..7b55c53b67 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:6d11975caf64405a5a43026ff242109052744ce42ab068f3e50f93dd016d1208 +!! source digest: sha256:3e44413fd72f8949deba313c3f31047cbf30ba3b17d78342590d2376001d905f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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/static/src/components/tier_review_widget/tier_review_widget.esm.js b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js index 7514d2ad4d..b9b87135af 100644 --- a/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js +++ b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js @@ -12,7 +12,7 @@ export class ReviewsTable extends Component { } _getReviewData() { - const records = this.env.model.root.data.review_ids.records; + const records = this.props.record.data.review_ids.records; return records.map((record) => record.data); } diff --git a/base_tier_validation/tests/common.py b/base_tier_validation/tests/common.py index 1da841584f..ccac99bffe 100644 --- a/base_tier_validation/tests/common.py +++ b/base_tier_validation/tests/common.py @@ -94,6 +94,13 @@ def setUpClass(cls): login="test3", company_ids=[Command.set([cls.main_company.id, cls.other_company.id])], ) + # Create groups + cls.test_group = cls.env["res.groups"].create( + { + "name": "TestGroup", + "users": [(4, cls.test_user_1.id), (4, cls.test_user_2.id)], + } + ) # Create tier definitions: cls.tier_def_obj = cls.env["tier.definition"] cls.tier_definition = cls.tier_def_obj.create( diff --git a/base_tier_validation/tests/test_tier_validation.py b/base_tier_validation/tests/test_tier_validation.py index 26e228a3f7..4103d54853 100644 --- a/base_tier_validation/tests/test_tier_validation.py +++ b/base_tier_validation/tests/test_tier_validation.py @@ -1202,6 +1202,57 @@ def test_31_request_validation(self): self.test_user_3_multi_company.partner_id, followers.mapped("partner_id") ) + def test_32_test_review_by_res_groups_field(self): + """Test using field-based validation with groups""" + selected_field = self.env["ir.model.fields"].search( + [("model", "=", self.test_model._name), ("name", "=", "group_id")] + ) + test_record = self.test_model.create( + {"test_field": 2.5, "group_id": self.test_group.id} + ) + + definition = self.env["tier.definition"].create( + { + "model_id": self.tester_model.id, + "review_type": "field", + "reviewer_field_id": selected_field.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + } + ) + + reviews = test_record.request_validation() + review = reviews.filtered(lambda r: r.definition_id == definition) + self.assertTrue(review) + self.assertEqual(review.reviewer_ids, self.test_user_2 | self.test_user_1) + + def test_33_test_review_by_wrong_field_type(self): + """Test using field-based validation with groups""" + selected_field = self.env["ir.model.fields"].search( + [("model", "=", self.test_model._name), ("name", "=", "menu_id")] + ) + test_record = self.test_model.create( + { + "test_field": 2.5, + "menu_id": self.env["ir.ui.menu"].search([], limit=1).id, + } + ) + self.assertTrue(test_record.menu_id) + self.env["tier.definition"].create( + { + "model_id": self.tester_model.id, + "review_type": "field", + "reviewer_field_id": selected_field.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + } + ) + with self.assertRaisesRegex( + ValidationError, + "Validation reviewer field should be of the appropriate type", + ): + test_record.request_validation() + @tagged("at_install") class TierTierValidationView(CommonTierValidation): diff --git a/base_tier_validation/tests/tier_validation_tester.py b/base_tier_validation/tests/tier_validation_tester.py index 7e171e753e..85cc08a8d4 100644 --- a/base_tier_validation/tests/tier_validation_tester.py +++ b/base_tier_validation/tests/tier_validation_tester.py @@ -21,6 +21,10 @@ class TierValidationTester(models.Model): test_validation_field = fields.Integer(default=0) test_field = fields.Float() user_id = fields.Many2one(string="Assigned to:", comodel_name="res.users") + group_id = fields.Many2one("res.groups", string="Assigned to (group)") + menu_id = fields.Many2one( + "ir.ui.menu", help="For testing choosing a wrong field type" + ) def action_confirm(self): self.write({"state": "confirmed"}) diff --git a/server_action_mass_edit/README.rst b/server_action_mass_edit/README.rst index 3a998a2389..2d5f61725c 100644 --- a/server_action_mass_edit/README.rst +++ b/server_action_mass_edit/README.rst @@ -11,7 +11,7 @@ Mass Editing !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:ad5b24fa705bc1129ad8931d6df7ffede0b4bfc4740e526e137dffeaee8af422 + !! source digest: sha256:c1f6aa8b7cc70dd834b9fc4bfdf6715a737a8a9ab1ea49f4867d5731ad8632f8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/server_action_mass_edit/__manifest__.py b/server_action_mass_edit/__manifest__.py index f810236012..59d6f90f8c 100644 --- a/server_action_mass_edit/__manifest__.py +++ b/server_action_mass_edit/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { "name": "Mass Editing", - "version": "18.0.1.1.0", + "version": "18.0.1.1.1", "author": "Serpent Consulting Services Pvt. Ltd., " "Tecnativa, " "GRAP, " diff --git a/server_action_mass_edit/static/description/index.html b/server_action_mass_edit/static/description/index.html index 0f2bfaaec0..382a2ca420 100644 --- a/server_action_mass_edit/static/description/index.html +++ b/server_action_mass_edit/static/description/index.html @@ -372,7 +372,7 @@

Mass Editing

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

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

This module allows to edit several records at the same time in any Odoo diff --git a/server_action_mass_edit/tests/test_mass_editing.py b/server_action_mass_edit/tests/test_mass_editing.py index 77ddc70338..e152df8a75 100644 --- a/server_action_mass_edit/tests/test_mass_editing.py +++ b/server_action_mass_edit/tests/test_mass_editing.py @@ -388,6 +388,21 @@ def test_onchanges(self): mass_edit_line_form.field_id = self.env.ref("base.field_res_users__country_id") self.assertFalse(mass_edit_line_form.widget_option) + def test_onchange_call(self): + """Onchange call does not error on dynamically added fields""" + self.env["mass.editing.wizard"].with_context( + active_ids=self.env.user.ids, + active_model=self.env.user._name, + server_action_id=self.mass_editing_user.id, + ).onchange( + values={}, + field_names={}, + fields_spec={ + "selection__email": {}, + "email": {}, + }, + ) + def test_onchange_model_id(self): """Test super call of `_onchange_model_id`""" diff --git a/server_action_mass_edit/wizard/mass_editing_wizard.py b/server_action_mass_edit/wizard/mass_editing_wizard.py index d87e91501e..0f3c235260 100644 --- a/server_action_mass_edit/wizard/mass_editing_wizard.py +++ b/server_action_mass_edit/wizard/mass_editing_wizard.py @@ -69,6 +69,56 @@ def default_get(self, fields): return res + def onchange(self, values, field_names, fields_spec): + # Make sure the values passed to the super cover the dynamic fields. + # No onchanges are defined, but Odoo will call the onchange with empty + # values for all fields when opening the wizard form view. + first_call = not field_names + if first_call: + field_names = [fname for fname in values if fname != "id"] + missing_names = [fname for fname in fields_spec if fname not in values] + defaults = self.default_get(missing_names) + for field_name in missing_names: + values[field_name] = defaults.get(field_name, False) + if field_name in defaults: + field_names.append(field_name) + + server_action_id = self.env.context.get("server_action_id") + server_action = self.env["ir.actions.server"].sudo().browse(server_action_id) + if not server_action: + return super().onchange(values, field_names, fields_spec) + dynamic_fields = {} + + for line in server_action.mapped("mass_edit_line_ids"): + values["selection__" + line.field_id.name] = "ignore" + values[line.field_id.name] = False + + # Make sure there is an entry for the default value retrieved above. + dynamic_fields["selection__" + line.field_id.name] = fields.Selection( + [("ignore", _("Don't touch"))], default="ignore" + ) + dynamic_fields[line.field_id.name] = fields.Text([()], default=False) + + self._fields.update(dynamic_fields) + + res = super().onchange(values, field_names, fields_spec) + if not res["value"]: + value = {key: value for key, value in values.items() if value is not False} + res["value"] = value + + for field in dynamic_fields: + self._fields.pop(field) + + view_temp = ( + self.env["ir.ui.view"] + .sudo() + .search([("name", "=", "Temporary Mass Editing Wizard")], limit=1) + ) + if view_temp: + view_temp.unlink() + + return res + @api.model def _prepare_fields(self, line, field, field_info): result = {} diff --git a/server_action_mass_edit_onchange/README.rst b/server_action_mass_edit_onchange/README.rst index 040259c7ed..c99291990a 100644 --- a/server_action_mass_edit_onchange/README.rst +++ b/server_action_mass_edit_onchange/README.rst @@ -11,7 +11,7 @@ Server Action Mass Edit Onchange !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:4ecb83298926e7e790173247738d18205a50ef65a90e98d405627251de3de3ad + !! source digest: sha256:2f70ce6aa21a25dfd9ed1741f2fea8469e77fe5d91d0fa4ed7df629fcc0d07a4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/server_action_mass_edit_onchange/__manifest__.py b/server_action_mass_edit_onchange/__manifest__.py index 87f675fe86..875856a2fe 100644 --- a/server_action_mass_edit_onchange/__manifest__.py +++ b/server_action_mass_edit_onchange/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Server Action Mass Edit Onchange", "summary": """Extension of server_action_mass_edit""", - "version": "18.0.1.1.0", + "version": "18.0.1.1.1", "license": "AGPL-3", "author": "Camptocamp, Odoo Community Association (OCA)", "website": "https://github.com/OCA/server-ux", diff --git a/server_action_mass_edit_onchange/static/description/index.html b/server_action_mass_edit_onchange/static/description/index.html index 0874d6a26b..1bd6fb2545 100644 --- a/server_action_mass_edit_onchange/static/description/index.html +++ b/server_action_mass_edit_onchange/static/description/index.html @@ -372,7 +372,7 @@

Server Action Mass Edit Onchange

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

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

This module is an extension of module Mass Editing to support playing diff --git a/server_action_mass_edit_onchange/wizard/mass_editing_wizard.py b/server_action_mass_edit_onchange/wizard/mass_editing_wizard.py index f6e5065b76..b72d4843ee 100644 --- a/server_action_mass_edit_onchange/wizard/mass_editing_wizard.py +++ b/server_action_mass_edit_onchange/wizard/mass_editing_wizard.py @@ -24,53 +24,6 @@ def default_get(self, fields): ) return res - def onchange(self, values, field_names, fields_spec): - first_call = not field_names - if first_call: - field_names = [fname for fname in values if fname != "id"] - missing_names = [fname for fname in fields_spec if fname not in values] - defaults = self.default_get(missing_names) - for field_name in missing_names: - values[field_name] = defaults.get(field_name, False) - if field_name in defaults: - field_names.append(field_name) - - server_action_id = self.env.context.get("server_action_id") - server_action = self.env["ir.actions.server"].sudo().browse(server_action_id) - if not server_action: - return super().onchange(values, field_names, fields_spec) - dynamic_fields = {} - - for line in server_action.mapped("mass_edit_line_ids"): - values["selection__" + line.field_id.name] = "ignore" - values[line.field_id.name] = False - - dynamic_fields["selection__" + line.field_id.name] = fields.Selection( - [], default="ignore" - ) - - dynamic_fields[line.field_id.name] = fields.Text([()], default=False) - - self._fields.update(dynamic_fields) - - res = super().onchange(values, field_names, fields_spec) - if not res["value"]: - value = {key: value for key, value in values.items() if value is not False} - res["value"] = value - - for field in dynamic_fields: - self._fields.pop(field) - - view_temp = ( - self.env["ir.ui.view"] - .sudo() - .search([("name", "=", "Temporary Mass Editing Wizard")], limit=1) - ) - if view_temp: - view_temp.unlink() - - return res - def _exec_write(self, server_action, vals): active_ids = self.env.context.get("active_ids", []) model = self.env[server_action.model_id.model].with_context(mass_edit=True)