From ae4e980f43cc2424b63517d45c8e6cfb6c23b633 Mon Sep 17 00:00:00 2001 From: Kitti U Date: Fri, 26 Feb 2021 23:06:12 +0700 Subject: [PATCH 01/27] [14.0][ADD] base_cancel_confirm --- base_cancel_confirm/__init__.py | 5 + base_cancel_confirm/__manifest__.py | 20 + base_cancel_confirm/model/__init__.py | 4 + .../model/base_cancel_confirm.py | 66 +++ base_cancel_confirm/readme/CONTRIBUTORS.rst | 1 + base_cancel_confirm/readme/DESCRIPTION.rst | 15 + .../security/ir.model.access.csv | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 435 ++++++++++++++++++ .../templates/cancel_confirm_template.xml | 14 + base_cancel_confirm/tests/__init__.py | 3 + .../tests/cancel_confirm_tester.py | 34 ++ .../tests/test_cancel_confirm.py | 83 ++++ base_cancel_confirm/wizard/__init__.py | 4 + base_cancel_confirm/wizard/cancel_confirm.py | 34 ++ base_cancel_confirm/wizard/cancel_confirm.xml | 38 ++ 16 files changed, 758 insertions(+) create mode 100644 base_cancel_confirm/__init__.py create mode 100644 base_cancel_confirm/__manifest__.py create mode 100644 base_cancel_confirm/model/__init__.py create mode 100644 base_cancel_confirm/model/base_cancel_confirm.py create mode 100644 base_cancel_confirm/readme/CONTRIBUTORS.rst create mode 100644 base_cancel_confirm/readme/DESCRIPTION.rst create mode 100644 base_cancel_confirm/security/ir.model.access.csv create mode 100644 base_cancel_confirm/static/description/icon.png create mode 100644 base_cancel_confirm/static/description/index.html create mode 100644 base_cancel_confirm/templates/cancel_confirm_template.xml create mode 100644 base_cancel_confirm/tests/__init__.py create mode 100644 base_cancel_confirm/tests/cancel_confirm_tester.py create mode 100644 base_cancel_confirm/tests/test_cancel_confirm.py create mode 100644 base_cancel_confirm/wizard/__init__.py create mode 100644 base_cancel_confirm/wizard/cancel_confirm.py create mode 100644 base_cancel_confirm/wizard/cancel_confirm.xml diff --git a/base_cancel_confirm/__init__.py b/base_cancel_confirm/__init__.py new file mode 100644 index 0000000000..8a240a4d67 --- /dev/null +++ b/base_cancel_confirm/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import wizard +from . import model diff --git a/base_cancel_confirm/__manifest__.py b/base_cancel_confirm/__manifest__.py new file mode 100644 index 0000000000..ac2c258d60 --- /dev/null +++ b/base_cancel_confirm/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Base Cancel Confirm", + "version": "14.0.1.0.0", + "author": "Ecosoft,Odoo Community Association (OCA)", + "category": "Usability", + "license": "AGPL-3", + "website": "https://github.com/OCA/server-ux", + "depends": ["base"], + "data": [ + "wizard/cancel_confirm.xml", + "security/ir.model.access.csv", + "templates/cancel_confirm_template.xml", + ], + "auto_install": False, + "installable": True, + "maintainers": ["kittiu"], +} diff --git a/base_cancel_confirm/model/__init__.py b/base_cancel_confirm/model/__init__.py new file mode 100644 index 0000000000..6a575eedfe --- /dev/null +++ b/base_cancel_confirm/model/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import base_cancel_confirm diff --git a/base_cancel_confirm/model/base_cancel_confirm.py b/base_cancel_confirm/model/base_cancel_confirm.py new file mode 100644 index 0000000000..9734e9977b --- /dev/null +++ b/base_cancel_confirm/model/base_cancel_confirm.py @@ -0,0 +1,66 @@ +# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import inspect + +from lxml import etree + +from odoo import fields, models + + +class BaseCancelConfirm(models.AbstractModel): + _name = "base.cancel.confirm" + _description = "Cancel Confirmation" + + _has_cancel_reason = "no" # ["no", "optional", "required"] + _cancel_reason_xpath = "/form/sheet/group[last()]" + + cancel_confirm = fields.Boolean( + string="Cancel Confirmed", + help="A flag signify that this document is confirmed for cancellation", + ) + cancel_reason = fields.Text( + string="Cancel Reason", + help="An optional cancel reason", + ) + + def open_cancel_confirm_wizard(self): + action = self.env.ref( + "base_cancel_confirm.action_cancel_confirm_wizard" + ).read()[0] + action["context"] = { + "cancel_res_model": self._name, + "cancel_res_ids": self.ids, + "cancel_method": inspect.stack()[1][3], + "default_has_cancel_reason": self._has_cancel_reason, + } + return action + + def clear_cancel_confirm_data(self): + self.write({"cancel_confirm": False, "cancel_reason": False}) + + def fields_view_get( + self, view_id=None, view_type="form", toolbar=False, submenu=False + ): + res = super().fields_view_get( + view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu + ) + if view_type == "form": + doc = etree.XML(res["arch"]) + for node in doc.xpath(self._cancel_reason_xpath): + str_element = self.env["ir.qweb"]._render( + "base_cancel_confirm.cancel_reason_template" + ) + new_node = etree.fromstring(str_element) + for new_element in new_node: + node.addnext(new_element) + # Override context for postprocessing + View = self.env["ir.ui.view"] + if view_id and res.get("base_model", self._name) != self._name: + View = View.with_context(base_model_name=res["base_model"]) + new_arch, new_fields = View.postprocess_and_fields(doc, self._name) + res["arch"] = new_arch + # We don't want to loose previous configuration, so, we only want to add + # the new fields + new_fields.update(res["fields"]) + res["fields"] = new_fields + return res diff --git a/base_cancel_confirm/readme/CONTRIBUTORS.rst b/base_cancel_confirm/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..6ce956d961 --- /dev/null +++ b/base_cancel_confirm/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Kitti U. diff --git a/base_cancel_confirm/readme/DESCRIPTION.rst b/base_cancel_confirm/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..1176b32303 --- /dev/null +++ b/base_cancel_confirm/readme/DESCRIPTION.rst @@ -0,0 +1,15 @@ +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 model +to easily implement a confirm with reason wizard when cancel button is clicked. +If reason is provided, it will be visible in form view. + +**Note:** To be able to use this module in a new model you will need some +development. + +You can see implementation example as followings, + +* `sale_cancel_confirm `_ +* `purchase_cancel_confirm `_ +* `purchase_request_cancel_confirm `_ +* `account_move_cancel_confirm `_ diff --git a/base_cancel_confirm/security/ir.model.access.csv b/base_cancel_confirm/security/ir.model.access.csv new file mode 100644 index 0000000000..b798d0c1a4 --- /dev/null +++ b/base_cancel_confirm/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_cancel_confirm,access_cancel_confirm,model_cancel_confirm,base.group_user,1,1,1,1 diff --git a/base_cancel_confirm/static/description/icon.png b/base_cancel_confirm/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/base_cancel_confirm/static/description/index.html b/base_cancel_confirm/static/description/index.html new file mode 100644 index 0000000000..b8d2ded74f --- /dev/null +++ b/base_cancel_confirm/static/description/index.html @@ -0,0 +1,435 @@ + + + + + + +Sale Cancel Reason + + + +
+

Sale Cancel Reason

+ + +

Beta License: AGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runbot

+

When a sale order is canceled, a reason must be given, +it is chosen from a configured list.

+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+
    +
  • Click at “Cancel Order” button from a sales order which state equal +to Draft, Quotation or Sales Order
  • +
  • A wizard will show a list of cancel reasons
  • +
  • Choose a reason and confirm cancellation, the reason will be stamped in the sales order
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/sale-workflow project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/base_cancel_confirm/templates/cancel_confirm_template.xml b/base_cancel_confirm/templates/cancel_confirm_template.xml new file mode 100644 index 0000000000..7e39a9d065 --- /dev/null +++ b/base_cancel_confirm/templates/cancel_confirm_template.xml @@ -0,0 +1,14 @@ + + + + diff --git a/base_cancel_confirm/tests/__init__.py b/base_cancel_confirm/tests/__init__.py new file mode 100644 index 0000000000..de24118a3d --- /dev/null +++ b/base_cancel_confirm/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_cancel_confirm diff --git a/base_cancel_confirm/tests/cancel_confirm_tester.py b/base_cancel_confirm/tests/cancel_confirm_tester.py new file mode 100644 index 0000000000..c18dc31e4b --- /dev/null +++ b/base_cancel_confirm/tests/cancel_confirm_tester.py @@ -0,0 +1,34 @@ +# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class CancelConfirmTester(models.Model): + _name = "cancel.confirm.tester" + _description = "Cancel Confirm Tester" + _inherit = ["base.cancel.confirm"] + + _has_cancel_reason = "optional" + + name = fields.Char() + state = fields.Selection( + selection=[ + ("draft", "Draft"), + ("confirmed", "Confirmed"), + ("cancel", "Cancel"), + ], + default="draft", + ) + + def action_confirm(self): + self.write({"state": "confirmed"}) + + def action_cancel(self): + if not self.filtered("cancel_confirm"): + return self.open_cancel_confirm_wizard() + self.write({"state": "cancel"}) + + def action_draft(self): + self.clear_cancel_confirm_data() + self.write({"state": "draft"}) diff --git a/base_cancel_confirm/tests/test_cancel_confirm.py b/base_cancel_confirm/tests/test_cancel_confirm.py new file mode 100644 index 0000000000..9f29c5d328 --- /dev/null +++ b/base_cancel_confirm/tests/test_cancel_confirm.py @@ -0,0 +1,83 @@ +# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). +from lxml import etree +from odoo_test_helper import FakeModelLoader + +from odoo.tests import Form, common + + +class TestCancelConfirm(common.SavepointCase): + @classmethod + def setUpClass(cls): + super(TestCancelConfirm, cls).setUpClass() + + cls.loader = FakeModelLoader(cls.env, cls.__module__) + cls.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( + [("model", "=", "cancel.confirm.tester")] + ) + + # Access record: + cls.env["ir.model.access"].create( + { + "name": "access.cancel.confirm.tester", + "model_id": cls.tester_model.id, + "perm_read": 1, + "perm_write": 1, + "perm_create": 1, + "perm_unlink": 1, + } + ) + + cls.test_record = cls.test_model.create({"name": "DOC-001"}) + + @classmethod + def tearDownClass(cls): + cls.loader.restore_registry() + super(TestCancelConfirm, cls).tearDownClass() + + def test_01_cancel_confirm_tester(self): + """Cancel a document, I expect cancel_reason. + Then, set to draft, I expect cancel_reason is deleted. + """ + self.test_record.action_confirm() + # Click cance, cancel confirm wizard will open. Type in cancel_reason + res = self.test_record.action_cancel() + ctx = res.get("context") + self.assertEqual(ctx["cancel_method"], "action_cancel") + self.assertEqual(ctx["default_has_cancel_reason"], "optional") + wizard = Form(self.env["cancel.confirm"].with_context(ctx)) + wizard.cancel_reason = "Wrong information" + wiz = wizard.save() + # Confirm cancel on wizard + wiz.confirm_cancel() + self.assertEqual(self.test_record.cancel_reason, wizard.cancel_reason) + self.assertEqual(self.test_record.state, "cancel") + # Set to draft + self.test_record.action_draft() + self.assertEqual(self.test_record.cancel_reason, False) + self.assertEqual(self.test_record.state, "draft") + + def test_view_automatic(self): + # We need to add a view in order to test fields_view_get() + self.env["ir.ui.view"].create( + { + "model": self.test_record._name, + "name": "Demo view", + "arch": """
+ + + + + +
""", + } + ) + with Form(self.test_record) as f: + form = etree.fromstring(f._view["arch"]) + self.assertTrue(form.xpath("//field[@name='cancel_confirm']")) + self.assertTrue(form.xpath("//field[@name='cancel_reason']")) diff --git a/base_cancel_confirm/wizard/__init__.py b/base_cancel_confirm/wizard/__init__.py new file mode 100644 index 0000000000..38920ac7c0 --- /dev/null +++ b/base_cancel_confirm/wizard/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import cancel_confirm diff --git a/base_cancel_confirm/wizard/cancel_confirm.py b/base_cancel_confirm/wizard/cancel_confirm.py new file mode 100644 index 0000000000..6e8a818681 --- /dev/null +++ b/base_cancel_confirm/wizard/cancel_confirm.py @@ -0,0 +1,34 @@ +# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import fields, models + + +class CancelConfirm(models.TransientModel): + _name = "cancel.confirm" + _description = "Cancel Confirm" + + cancel_reason = fields.Text( + string="Cancel Reason", + ) + has_cancel_reason = fields.Selection( + selection=[ + ("no", "None"), + ("optional", "Optional"), + ("required", "Required"), + ], + default="no", + required=True, + ) + + def confirm_cancel(self): + self.ensure_one() + res_model = self._context.get("cancel_res_model") + res_ids = self._context.get("cancel_res_ids") + cancel_method = self._context.get("cancel_method") + docs = self.env[res_model].browse(res_ids) + docs.write({"cancel_confirm": True}) + # Cancel Reason + if self.has_cancel_reason in ["optional", "required"]: + docs.write({"cancel_reason": self.cancel_reason}) + res = getattr(docs, cancel_method)() + return res diff --git a/base_cancel_confirm/wizard/cancel_confirm.xml b/base_cancel_confirm/wizard/cancel_confirm.xml new file mode 100644 index 0000000000..80e0854b63 --- /dev/null +++ b/base_cancel_confirm/wizard/cancel_confirm.xml @@ -0,0 +1,38 @@ + + + + Cancel Confirmation + cancel.confirm + +
+

Are you sure to cancel this document?

+ + + + +
+
+
+
+
+ + Cancel Confirmation + ir.actions.act_window + cancel.confirm + form + + new + +
From 46d3be164a03b398d3d60d6a04e3086f96b037a2 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 25 Mar 2021 09:24:58 +0000 Subject: [PATCH 02/27] [UPD] Update base_cancel_confirm.pot --- .../i18n/base_cancel_confirm.pot | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 base_cancel_confirm/i18n/base_cancel_confirm.pot diff --git a/base_cancel_confirm/i18n/base_cancel_confirm.pot b/base_cancel_confirm/i18n/base_cancel_confirm.pot new file mode 100644 index 0000000000..df7fc6c908 --- /dev/null +++ b/base_cancel_confirm/i18n/base_cancel_confirm.pot @@ -0,0 +1,125 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_cancel_confirm +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: base_cancel_confirm +#: model:ir.model.fields,help:base_cancel_confirm.field_base_cancel_confirm__cancel_confirm +msgid "A flag signify that this document is confirmed for cancellation" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,help:base_cancel_confirm.field_base_cancel_confirm__cancel_reason +msgid "An optional cancel reason" +msgstr "" + +#. module: base_cancel_confirm +#: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard +msgid "Are you sure to cancel this document?" +msgstr "" + +#. module: base_cancel_confirm +#: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard +msgid "Cancel" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model,name:base_cancel_confirm.model_cancel_confirm +msgid "Cancel Confirm" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.actions.act_window,name:base_cancel_confirm.action_cancel_confirm_wizard +#: model:ir.model,name:base_cancel_confirm.model_base_cancel_confirm +#: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard +msgid "Cancel Confirmation" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm__cancel_confirm +msgid "Cancel Confirmed" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm__cancel_reason +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__cancel_reason +msgid "Cancel Reason" +msgstr "" + +#. module: base_cancel_confirm +#: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard +msgid "Confirm" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__create_uid +msgid "Created by" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__create_date +msgid "Created on" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm__display_name +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__display_name +msgid "Display Name" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__has_cancel_reason +msgid "Has Cancel Reason" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm__id +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__id +msgid "ID" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm____last_update +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm____last_update +msgid "Last Modified on" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields.selection,name:base_cancel_confirm.selection__cancel_confirm__has_cancel_reason__no +msgid "None" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields.selection,name:base_cancel_confirm.selection__cancel_confirm__has_cancel_reason__optional +msgid "Optional" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields.selection,name:base_cancel_confirm.selection__cancel_confirm__has_cancel_reason__required +msgid "Required" +msgstr "" + +#. module: base_cancel_confirm +#: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard +msgid "or" +msgstr "" From 725c6bf051dc63b28327c058ee6a922679b6cfcd Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 25 Mar 2021 09:29:45 +0000 Subject: [PATCH 03/27] [UPD] README.rst --- base_cancel_confirm/README.rst | 95 +++++++++++++++++++ .../static/description/index.html | 68 +++++++------ 2 files changed, 128 insertions(+), 35 deletions(-) create mode 100644 base_cancel_confirm/README.rst diff --git a/base_cancel_confirm/README.rst b/base_cancel_confirm/README.rst new file mode 100644 index 0000000000..be3be004da --- /dev/null +++ b/base_cancel_confirm/README.rst @@ -0,0 +1,95 @@ +=================== +Base Cancel Confirm +=================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github + :target: https://github.com/OCA/server-ux/tree/14.0/base_cancel_confirm + :alt: OCA/server-ux +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-ux-14-0/server-ux-14-0-base_cancel_confirm + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/250/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +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 model +to easily implement a confirm with reason wizard when cancel button is clicked. +If reason is provided, it will be visible in form view. + +**Note:** To be able to use this module in a new model you will need some +development. + +You can see implementation example as followings, + +* `sale_cancel_confirm `_ +* `purchase_cancel_confirm `_ +* `purchase_request_cancel_confirm `_ +* `account_move_cancel_confirm `_ + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Ecosoft + +Contributors +~~~~~~~~~~~~ + +* Kitti U. + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-kittiu| image:: https://github.com/kittiu.png?size=40px + :target: https://github.com/kittiu + :alt: kittiu + +Current `maintainer `__: + +|maintainer-kittiu| + +This module is part of the `OCA/server-ux `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_cancel_confirm/static/description/index.html b/base_cancel_confirm/static/description/index.html index b8d2ded74f..39b8de86dc 100644 --- a/base_cancel_confirm/static/description/index.html +++ b/base_cancel_confirm/static/description/index.html @@ -4,7 +4,7 @@ -Sale Cancel Reason +Base Cancel Confirm -
-

Sale Cancel Reason

+
+

Base Cancel Confirm

-

Beta License: AGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runbot

-

When a sale order is canceled, a reason must be given, -it is chosen from a configured list.

+

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

+

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 model +to easily implement a confirm with reason wizard when cancel button is clicked. +If reason is provided, it will be visible in form view.

+

Note: To be able to use this module in a new model you will need some +development.

+

You can see implementation example as followings,

+

Table of contents

-
-

Usage

-

To use this module, you need to:

-
    -
  • Click at “Cancel Order” button from a sales order which state equal -to Draft, Quotation or Sales Order
  • -
  • A wizard will show a list of cancel reasons
  • -
  • Choose a reason and confirm cancellation, the reason will be stamped in the sales order
  • -
-
-

Bug Tracker

-

Bugs are tracked on GitHub Issues. +

Bug Tracker

+

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

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

-

Credits

+

Credits

-

Authors

+

Authors

    -
  • Camptocamp
  • +
  • Ecosoft
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/sale-workflow project on GitHub.

+

Current maintainer:

+

kittiu

+

This module is part of the OCA/server-ux project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

From 541b96768335b5ba8d672a43d9110f50f122073d Mon Sep 17 00:00:00 2001 From: Bosd Date: Sun, 18 Apr 2021 08:45:14 +0000 Subject: [PATCH 04/27] Added translation using Weblate (Dutch) --- base_cancel_confirm/i18n/nl.po | 126 +++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 base_cancel_confirm/i18n/nl.po diff --git a/base_cancel_confirm/i18n/nl.po b/base_cancel_confirm/i18n/nl.po new file mode 100644 index 0000000000..88eeb88c24 --- /dev/null +++ b/base_cancel_confirm/i18n/nl.po @@ -0,0 +1,126 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_cancel_confirm +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: base_cancel_confirm +#: model:ir.model.fields,help:base_cancel_confirm.field_base_cancel_confirm__cancel_confirm +msgid "A flag signify that this document is confirmed for cancellation" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,help:base_cancel_confirm.field_base_cancel_confirm__cancel_reason +msgid "An optional cancel reason" +msgstr "" + +#. module: base_cancel_confirm +#: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard +msgid "Are you sure to cancel this document?" +msgstr "" + +#. module: base_cancel_confirm +#: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard +msgid "Cancel" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model,name:base_cancel_confirm.model_cancel_confirm +msgid "Cancel Confirm" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.actions.act_window,name:base_cancel_confirm.action_cancel_confirm_wizard +#: model:ir.model,name:base_cancel_confirm.model_base_cancel_confirm +#: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard +msgid "Cancel Confirmation" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm__cancel_confirm +msgid "Cancel Confirmed" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm__cancel_reason +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__cancel_reason +msgid "Cancel Reason" +msgstr "" + +#. module: base_cancel_confirm +#: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard +msgid "Confirm" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__create_uid +msgid "Created by" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__create_date +msgid "Created on" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm__display_name +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__display_name +msgid "Display Name" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__has_cancel_reason +msgid "Has Cancel Reason" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm__id +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__id +msgid "ID" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm____last_update +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm____last_update +msgid "Last Modified on" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields.selection,name:base_cancel_confirm.selection__cancel_confirm__has_cancel_reason__no +msgid "None" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields.selection,name:base_cancel_confirm.selection__cancel_confirm__has_cancel_reason__optional +msgid "Optional" +msgstr "" + +#. module: base_cancel_confirm +#: model:ir.model.fields.selection,name:base_cancel_confirm.selection__cancel_confirm__has_cancel_reason__required +msgid "Required" +msgstr "" + +#. module: base_cancel_confirm +#: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard +msgid "or" +msgstr "" From c08d23c9286fc7a2b76439caf46a0ba4bf343f2a Mon Sep 17 00:00:00 2001 From: Bosd Date: Sun, 18 Apr 2021 08:47:50 +0000 Subject: [PATCH 05/27] Translated using Weblate (Dutch) Currently translated at 71.4% (15 of 21 strings) Translation: server-ux-14.0/server-ux-14.0-base_cancel_confirm Translate-URL: https://translation.odoo-community.org/projects/server-ux-14-0/server-ux-14-0-base_cancel_confirm/nl/ --- base_cancel_confirm/i18n/nl.po | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/base_cancel_confirm/i18n/nl.po b/base_cancel_confirm/i18n/nl.po index 88eeb88c24..96dea92ab2 100644 --- a/base_cancel_confirm/i18n/nl.po +++ b/base_cancel_confirm/i18n/nl.po @@ -6,13 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2021-04-18 10:46+0000\n" +"Last-Translator: Bosd \n" "Language-Team: none\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" #. module: base_cancel_confirm #: model:ir.model.fields,help:base_cancel_confirm.field_base_cancel_confirm__cancel_confirm @@ -32,7 +34,7 @@ msgstr "" #. module: base_cancel_confirm #: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard msgid "Cancel" -msgstr "" +msgstr "Annuleer" #. module: base_cancel_confirm #: model:ir.model,name:base_cancel_confirm.model_cancel_confirm @@ -55,72 +57,72 @@ msgstr "" #: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm__cancel_reason #: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__cancel_reason msgid "Cancel Reason" -msgstr "" +msgstr "Annuleringsreden" #. module: base_cancel_confirm #: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard msgid "Confirm" -msgstr "" +msgstr "Bevestig" #. module: base_cancel_confirm #: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__create_uid msgid "Created by" -msgstr "" +msgstr "Aangemaakt door" #. module: base_cancel_confirm #: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__create_date msgid "Created on" -msgstr "" +msgstr "Aangemaakt op" #. module: base_cancel_confirm #: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm__display_name #: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__display_name msgid "Display Name" -msgstr "" +msgstr "Weergavenaam" #. module: base_cancel_confirm #: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__has_cancel_reason msgid "Has Cancel Reason" -msgstr "" +msgstr "Heeft annuleringsreden" #. module: base_cancel_confirm #: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm__id #: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__id msgid "ID" -msgstr "" +msgstr "ID" #. module: base_cancel_confirm #: model:ir.model.fields,field_description:base_cancel_confirm.field_base_cancel_confirm____last_update #: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm____last_update msgid "Last Modified on" -msgstr "" +msgstr "Laatst bijgewerk op" #. module: base_cancel_confirm #: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__write_uid msgid "Last Updated by" -msgstr "" +msgstr "Laatst bijgewerkt door" #. module: base_cancel_confirm #: model:ir.model.fields,field_description:base_cancel_confirm.field_cancel_confirm__write_date msgid "Last Updated on" -msgstr "" +msgstr "Laatst bijgewerkt op" #. module: base_cancel_confirm #: model:ir.model.fields.selection,name:base_cancel_confirm.selection__cancel_confirm__has_cancel_reason__no msgid "None" -msgstr "" +msgstr "Geen" #. module: base_cancel_confirm #: model:ir.model.fields.selection,name:base_cancel_confirm.selection__cancel_confirm__has_cancel_reason__optional msgid "Optional" -msgstr "" +msgstr "Optioneel" #. module: base_cancel_confirm #: model:ir.model.fields.selection,name:base_cancel_confirm.selection__cancel_confirm__has_cancel_reason__required msgid "Required" -msgstr "" +msgstr "Vereist" #. module: base_cancel_confirm #: model_terms:ir.ui.view,arch_db:base_cancel_confirm.view_cancel_confirm_wizard msgid "or" -msgstr "" +msgstr "of" From 5e230e1c9f2dff6160d5d6ef987d9b65ddcd0332 Mon Sep 17 00:00:00 2001 From: Kitti U Date: Sun, 25 Apr 2021 21:26:25 +0700 Subject: [PATCH 06/27] [14.0][FIX] base_cancel_confirm, access window action error --- base_cancel_confirm/model/base_cancel_confirm.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/base_cancel_confirm/model/base_cancel_confirm.py b/base_cancel_confirm/model/base_cancel_confirm.py index 9734e9977b..6804e8b1d1 100644 --- a/base_cancel_confirm/model/base_cancel_confirm.py +++ b/base_cancel_confirm/model/base_cancel_confirm.py @@ -24,9 +24,11 @@ class BaseCancelConfirm(models.AbstractModel): ) def open_cancel_confirm_wizard(self): - action = self.env.ref( - "base_cancel_confirm.action_cancel_confirm_wizard" - ).read()[0] + action = ( + self.env.ref("base_cancel_confirm.action_cancel_confirm_wizard") + .sudo() + .read()[0] + ) action["context"] = { "cancel_res_model": self._name, "cancel_res_ids": self.ids, From 9de92067ce7f8896ee4cdc0f70f2237edc3b5685 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sat, 8 May 2021 23:33:03 +0000 Subject: [PATCH 07/27] base_cancel_confirm 14.0.1.0.1 --- base_cancel_confirm/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base_cancel_confirm/__manifest__.py b/base_cancel_confirm/__manifest__.py index ac2c258d60..1990cc3188 100644 --- a/base_cancel_confirm/__manifest__.py +++ b/base_cancel_confirm/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Cancel Confirm", - "version": "14.0.1.0.0", + "version": "14.0.1.0.1", "author": "Ecosoft,Odoo Community Association (OCA)", "category": "Usability", "license": "AGPL-3", From 169357ec627cea2cad602b84a23ca42e1d62a298 Mon Sep 17 00:00:00 2001 From: newtratip Date: Fri, 14 May 2021 17:53:08 +0700 Subject: [PATCH 08/27] [14.0][FIX] base_cancel_confirm: No duplicate cancel confirm and cancel reason --- base_cancel_confirm/model/base_cancel_confirm.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/base_cancel_confirm/model/base_cancel_confirm.py b/base_cancel_confirm/model/base_cancel_confirm.py index 6804e8b1d1..a128f1a076 100644 --- a/base_cancel_confirm/model/base_cancel_confirm.py +++ b/base_cancel_confirm/model/base_cancel_confirm.py @@ -16,10 +16,12 @@ class BaseCancelConfirm(models.AbstractModel): cancel_confirm = fields.Boolean( string="Cancel Confirmed", + copy=False, help="A flag signify that this document is confirmed for cancellation", ) cancel_reason = fields.Text( string="Cancel Reason", + copy=False, help="An optional cancel reason", ) From 3d88bc700d446f53f4242f8a4e24cb8b2b663316 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sat, 29 May 2021 22:06:56 +0000 Subject: [PATCH 09/27] base_cancel_confirm 14.0.1.0.2 --- base_cancel_confirm/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base_cancel_confirm/__manifest__.py b/base_cancel_confirm/__manifest__.py index 1990cc3188..22c3d65f3b 100644 --- a/base_cancel_confirm/__manifest__.py +++ b/base_cancel_confirm/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Cancel Confirm", - "version": "14.0.1.0.1", + "version": "14.0.1.0.2", "author": "Ecosoft,Odoo Community Association (OCA)", "category": "Usability", "license": "AGPL-3", From 759e2468112ef3a7bbee023a0eb3af01a1250790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Alix?= Date: Mon, 31 Jan 2022 10:26:27 +0100 Subject: [PATCH 10/27] [FIX] Fix access right issues when using actions --- base_cancel_confirm/model/base_cancel_confirm.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/base_cancel_confirm/model/base_cancel_confirm.py b/base_cancel_confirm/model/base_cancel_confirm.py index a128f1a076..460f2abf8e 100644 --- a/base_cancel_confirm/model/base_cancel_confirm.py +++ b/base_cancel_confirm/model/base_cancel_confirm.py @@ -26,11 +26,8 @@ class BaseCancelConfirm(models.AbstractModel): ) def open_cancel_confirm_wizard(self): - action = ( - self.env.ref("base_cancel_confirm.action_cancel_confirm_wizard") - .sudo() - .read()[0] - ) + xmlid = "base_cancel_confirm.action_cancel_confirm_wizard" + action = self.env["ir.actions.act_window"]._for_xml_id(xmlid) action["context"] = { "cancel_res_model": self._name, "cancel_res_ids": self.ids, From 4cb339365a137e004f0f7fd39ac2b2e2725b9cd4 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 2 Feb 2022 06:51:32 +0000 Subject: [PATCH 11/27] base_cancel_confirm 14.0.1.0.3 --- base_cancel_confirm/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base_cancel_confirm/__manifest__.py b/base_cancel_confirm/__manifest__.py index 22c3d65f3b..15f71ac1f3 100644 --- a/base_cancel_confirm/__manifest__.py +++ b/base_cancel_confirm/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Cancel Confirm", - "version": "14.0.1.0.2", + "version": "14.0.1.0.3", "author": "Ecosoft,Odoo Community Association (OCA)", "category": "Usability", "license": "AGPL-3", From 733cd4a7ec71dd7498b38c86897d7e0313112379 Mon Sep 17 00:00:00 2001 From: Kitti U Date: Tue, 17 May 2022 10:20:29 +0700 Subject: [PATCH 12/27] [IMP] base_cancel_confirm, allow disable cancel confirm --- base_cancel_confirm/model/base_cancel_confirm.py | 15 ++++++++++++++- base_cancel_confirm/readme/CONFIGURE.rst | 8 ++++++++ base_cancel_confirm/tests/test_cancel_confirm.py | 4 +++- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 base_cancel_confirm/readme/CONFIGURE.rst diff --git a/base_cancel_confirm/model/base_cancel_confirm.py b/base_cancel_confirm/model/base_cancel_confirm.py index 460f2abf8e..77f9d74912 100644 --- a/base_cancel_confirm/model/base_cancel_confirm.py +++ b/base_cancel_confirm/model/base_cancel_confirm.py @@ -4,7 +4,8 @@ from lxml import etree -from odoo import fields, models +from odoo import _, fields, models, tools +from odoo.exceptions import ValidationError class BaseCancelConfirm(models.AbstractModel): @@ -16,6 +17,7 @@ class BaseCancelConfirm(models.AbstractModel): cancel_confirm = fields.Boolean( string="Cancel Confirmed", + default=lambda self: self._cancel_confirm_disabled(), copy=False, help="A flag signify that this document is confirmed for cancellation", ) @@ -25,6 +27,17 @@ class BaseCancelConfirm(models.AbstractModel): help="An optional cancel reason", ) + def _cancel_confirm_disabled(self): + key = "%s.cancel_confirm_disable" % self._name + res = self.env["ir.config_parameter"].sudo().get_param(key) + if not res: + return True + if res not in ("True", "False"): + raise ValidationError( + _("Configuration Error (%s), should be 'True' or 'False'") % key + ) + return tools.str2bool(res) + def open_cancel_confirm_wizard(self): xmlid = "base_cancel_confirm.action_cancel_confirm_wizard" action = self.env["ir.actions.act_window"]._for_xml_id(xmlid) diff --git a/base_cancel_confirm/readme/CONFIGURE.rst b/base_cancel_confirm/readme/CONFIGURE.rst new file mode 100644 index 0000000000..fb5c448999 --- /dev/null +++ b/base_cancel_confirm/readme/CONFIGURE.rst @@ -0,0 +1,8 @@ +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 (ir.config_parameter) for each extended module. + +For example, + +* sale_cancel_confirm, add `sale.order.cancel_confirm_disable = False` +* purchase_cancel_confirm, add `purchase.order.cancel_confirm_disable = False` diff --git a/base_cancel_confirm/tests/test_cancel_confirm.py b/base_cancel_confirm/tests/test_cancel_confirm.py index 9f29c5d328..183cd98a87 100644 --- a/base_cancel_confirm/tests/test_cancel_confirm.py +++ b/base_cancel_confirm/tests/test_cancel_confirm.py @@ -20,7 +20,9 @@ def setUpClass(cls): cls.tester_model = cls.env["ir.model"].search( [("model", "=", "cancel.confirm.tester")] ) - + cls.env["ir.config_parameter"].create( + {"key": "cancel.confirm.tester.cancel_confirm_disable", "value": "False"} + ) # Access record: cls.env["ir.model.access"].create( { From 0a6b717d4b5d388bf8eac2375237abb4a65c6671 Mon Sep 17 00:00:00 2001 From: TheerayutEncoder Date: Thu, 20 Oct 2022 10:52:47 +0700 Subject: [PATCH 13/27] [MTG] base_cancel_confirm: Migration to 15.0 --- base_cancel_confirm/__manifest__.py | 2 +- .../model/base_cancel_confirm.py | 1 - .../templates/cancel_confirm_template.xml | 5 +--- .../tests/test_cancel_confirm.py | 29 ++++++++++++++++--- base_cancel_confirm/wizard/cancel_confirm.py | 4 +-- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/base_cancel_confirm/__manifest__.py b/base_cancel_confirm/__manifest__.py index 15f71ac1f3..f397ca7326 100644 --- a/base_cancel_confirm/__manifest__.py +++ b/base_cancel_confirm/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Cancel Confirm", - "version": "14.0.1.0.3", + "version": "15.0.1.0.0", "author": "Ecosoft,Odoo Community Association (OCA)", "category": "Usability", "license": "AGPL-3", diff --git a/base_cancel_confirm/model/base_cancel_confirm.py b/base_cancel_confirm/model/base_cancel_confirm.py index 77f9d74912..1ea04f01fe 100644 --- a/base_cancel_confirm/model/base_cancel_confirm.py +++ b/base_cancel_confirm/model/base_cancel_confirm.py @@ -22,7 +22,6 @@ class BaseCancelConfirm(models.AbstractModel): help="A flag signify that this document is confirmed for cancellation", ) cancel_reason = fields.Text( - string="Cancel Reason", copy=False, help="An optional cancel reason", ) diff --git a/base_cancel_confirm/templates/cancel_confirm_template.xml b/base_cancel_confirm/templates/cancel_confirm_template.xml index 7e39a9d065..98e6d1005d 100644 --- a/base_cancel_confirm/templates/cancel_confirm_template.xml +++ b/base_cancel_confirm/templates/cancel_confirm_template.xml @@ -2,10 +2,7 @@