diff --git a/account_brand/models/account_move.py b/account_brand/models/account_move.py index 46e8c96d2..6ca9a6eae 100644 --- a/account_brand/models/account_move.py +++ b/account_brand/models/account_move.py @@ -9,14 +9,7 @@ class AccountMove(models.Model): _name = "account.move" _inherit = ["account.move", "res.brand.mixin"] - brand_id = fields.Many2one( - states={ - "open": [("readonly", True)], - "in_payment": [("readonly", True)], - "paid": [("readonly", True)], - "cancel": [("readonly", True)], - } - ) + brand_id = fields.Many2one() def _is_brand_required(self): self.ensure_one() diff --git a/account_brand/tests/test_brand_mixin.py b/account_brand/tests/test_brand_mixin.py index 9c8443573..50bbca2df 100644 --- a/account_brand/tests/test_brand_mixin.py +++ b/account_brand/tests/test_brand_mixin.py @@ -1,6 +1,8 @@ # Copyright 2019 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import json + from lxml import etree from odoo.exceptions import ValidationError @@ -103,6 +105,20 @@ def test_get_view(self): doc = etree.XML(view["arch"]) self.assertTrue(doc.xpath("//field[@name='brand_use_level']")) + def test_get_view_keeps_view_readonly(self): + view = self.env["account.move"].get_view( + view_id=self.env.ref("account.view_move_form").id, + view_type="form", + ) + doc = etree.XML(view["arch"]) + brand_node = doc.xpath("//field[@name='brand_id']")[0] + modifiers = json.loads(brand_node.get("modifiers")) + self.assertEqual(modifiers["readonly"], [["state", "!=", "draft"]]) + self.assertEqual( + modifiers["required"], + [["brand_use_level", "=", BRAND_USE_LEVEL_REQUIRED_LEVEL]], + ) + def test_reverse_move(self): move = self.env["account.move"].create( { diff --git a/brand/models/res_brand_mixin.py b/brand/models/res_brand_mixin.py index 4c4c0bcc1..508245c3f 100644 --- a/brand/models/res_brand_mixin.py +++ b/brand/models/res_brand_mixin.py @@ -1,5 +1,7 @@ # Copyright 2019 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import json + from lxml import etree from odoo import _, api, fields, models @@ -57,6 +59,7 @@ def setup_modifiers(self, node, field=None): attributes = ["invisible", "readonly", "required"] if field is not None: ir_ui_view.transfer_field_to_modifiers(field, modifiers, attributes) + modifiers.update(json.loads(node.get("modifiers") or "{}")) ir_ui_view.transfer_node_to_modifiers(node, modifiers) ir_ui_view.transfer_modifiers_to_node(modifiers, node) diff --git a/sale_brand/models/sale_order.py b/sale_brand/models/sale_order.py index f8be2fe49..1fb5f3158 100644 --- a/sale_brand/models/sale_order.py +++ b/sale_brand/models/sale_order.py @@ -8,14 +8,7 @@ class SaleOrder(models.Model): _name = "sale.order" _inherit = ["sale.order", "res.brand.mixin"] - brand_id = fields.Many2one( - states={ - "sent": [("readonly", True)], - "sale": [("readonly", True)], - "done": [("readonly", True)], - "cancel": [("readonly", True)], - } - ) + brand_id = fields.Many2one() def _prepare_invoice(self): invoice_vals = {} diff --git a/sale_brand/tests/test_sale_order.py b/sale_brand/tests/test_sale_order.py index af09ab538..01701925d 100644 --- a/sale_brand/tests/test_sale_order.py +++ b/sale_brand/tests/test_sale_order.py @@ -1,6 +1,10 @@ # Copyright 2019 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import json + +from lxml import etree + from odoo.tests.common import TransactionCase @@ -48,3 +52,13 @@ def test_brand_onchange_team(self): sale.brand_id = brand.id sale._onchange_team_id() self.assertEqual(sale.brand_id, brand) + + def test_get_view_keeps_view_readonly(self): + view = self.env["sale.order"].get_view( + view_id=self.env.ref("sale.view_order_form").id, + view_type="form", + ) + doc = etree.XML(view["arch"]) + brand_node = doc.xpath("//field[@name='brand_id']")[0] + modifiers = json.loads(brand_node.get("modifiers")) + self.assertEqual(modifiers["readonly"], [["state", "!=", "draft"]])