details:   https://code.tryton.org/tryton/commit/b01882991ab9
branch:    default
user:      Cédric Krier <[email protected]>
date:      Mon Sep 21 15:24:43 2026 +0200
description:
        Use editable instead of of readonly for account template override
diffstat:

 modules/account/account.py                                             |  16 
++--
 modules/account/tax.py                                                 |  32 
++++-----
 modules/account_asset/account.py                                       |   6 +-
 modules/account_deposit/account.py                                     |   6 +-
 modules/account_eu/account.py                                          |  12 
++-
 modules/account_export_winbooks/account.py                             |   8 +-
 modules/account_fr_chorus/tests/scenario_account_fr_chorus_invoice.rst |   2 +-
 modules/edocument_unece/account.py                                     |  12 
++-
 modules/sale_advance_payment/account.py                                |   6 +-
 modules/sale_gift_card/account.py                                      |   6 +-
 10 files changed, 54 insertions(+), 52 deletions(-)

diffs (370 lines):

diff -r f8597177e8ea -r b01882991ab9 modules/account/account.py
--- a/modules/account/account.py        Mon Sep 21 10:39:12 2026 +0200
+++ b/modules/account/account.py        Mon Sep 21 15:24:43 2026 +0200
@@ -125,8 +125,8 @@
             field = getattr(Mixin, fname)
             if not isinstance(field, fields.Field):
                 continue
-            field.states['readonly'] = (
-                Bool(Eval('template', -1)) & ~Eval('template_override', False))
+            field.states['ediable'] = (
+                ~Eval('template', None) | Eval('template_override', False))
     return Mixin
 
 
@@ -216,8 +216,9 @@
     parent = fields.Many2One(
         'account.account.type', 'Parent', ondelete='RESTRICT',
         states={
-            'readonly': (Bool(Eval('template', -1))
-                & ~Eval('template_override', False)),
+            'editable': (
+                ~Eval('template', None)
+                | Eval('template_override', False)),
             },
         domain=[
             ('company', '=', Eval('company', -1)),
@@ -629,7 +630,7 @@
                     or isinstance(field, fields.Function)):
                 continue
             field.states['editable'] = (
-                Eval('template', None) & ~Eval('template_override', False))
+                ~Eval('template', None) | Eval('template_override', False))
     return Mixin
 
 
@@ -827,7 +828,7 @@
         ModelSQL, ModelView):
     __name__ = 'account.account'
     _states = {
-        'editable': Eval('template', None) & ~Eval('template_override', False),
+        'editable': ~Eval('template', None) | Eval('template_override', False),
         }
     company = fields.Many2One('company.company', 'Company', required=True,
             ondelete="RESTRICT")
@@ -954,7 +955,8 @@
         for date in [cls.start_date, cls.end_date]:
             date.states = {
                 'editable': (
-                    Eval('template', -1) & ~Eval('template_override', False)),
+                    ~Eval('template', None)
+                    | Eval('template_override', False)),
                 }
         cls._order.insert(0, ('code', 'ASC'))
         cls._order.insert(1, ('name', 'ASC'))
diff -r f8597177e8ea -r b01882991ab9 modules/account/tax.py
--- a/modules/account/tax.py    Mon Sep 21 10:39:12 2026 +0200
+++ b/modules/account/tax.py    Mon Sep 21 15:24:43 2026 +0200
@@ -125,8 +125,7 @@
         ContextCompanyMixin, ActivePeriodMixin, tree(), ModelSQL, ModelView):
     __name__ = 'account.tax.code'
     _states = {
-        'readonly': (Bool(Eval('template', -1))
-            & ~Eval('template_override', False)),
+        'editable': ~Eval('template', None) | Eval('template_override', False),
         }
     name = fields.Char('Name', required=True, states=_states)
     code = fields.Char('Code', states=_states)
@@ -166,8 +165,9 @@
             Index(t, (Coalesce(t.code, ''), Index.Similarity())))
         for date in [cls.start_date, cls.end_date]:
             date.states = {
-                'readonly': (Bool(Eval('template', -1))
-                    & ~Eval('template_override', False)),
+                'editable': (
+                    ~Eval('template', None)
+                    | Eval('template_override', False)),
                 }
         cls._order.insert(0, ('code', 'ASC'))
 
@@ -358,8 +358,7 @@
 class TaxCodeLine(ModelSQL, ModelView):
     __name__ = 'account.tax.code.line'
     _states = {
-        'readonly': (Bool(Eval('template', -1))
-            & ~Eval('template_override', False)),
+        'editable': ~Eval('template', None) | Eval('template_override', False),
         }
 
     code = fields.Many2One('account.tax.code', "Code", required=True)
@@ -745,8 +744,7 @@
            none: tax = none"""
     __name__ = 'account.tax'
     _states = {
-        'readonly': (Bool(Eval('template', -1))
-            & ~Eval('template_override', False)),
+        'editable': ~Eval('template', None) | Eval('template_override', False),
         }
     name = fields.Char('Name', required=True, states=_states)
     description = fields.Char('Description', required=True, translate=True,
@@ -754,7 +752,7 @@
     group = fields.Many2One('account.tax.group', 'Group',
         states={
             'invisible': Bool(Eval('parent')),
-            'readonly': _states['readonly'],
+            'editable': _states['editable'],
             })
     start_date = fields.Date("Start Date", states=_states)
     end_date = fields.Date("End Date", states=_states)
@@ -763,14 +761,14 @@
         states={
             'required': Eval('type') == 'fixed',
             'invisible': Eval('type') != 'fixed',
-            'readonly': _states['readonly'],
+            'editable': _states['editable'],
             }, help='In company\'s currency.')
     rate = fields.Numeric(
         "Rate", digits=(None, 10),
         states={
             'required': Eval('type') == 'percentage',
             'invisible': Eval('type') != 'percentage',
-            'readonly': _states['readonly'],
+            'editable': _states['editable'],
             })
     type = fields.Selection([
         ('percentage', 'Percentage'),
@@ -780,7 +778,7 @@
     update_unit_price = fields.Boolean('Update Unit Price',
         states={
             'invisible': Bool(Eval('parent')),
-            'readonly': _states['readonly'],
+            'editable': _states['editable'],
             },
         help=('If checked then the unit price for further tax computation will'
             ' be modified by this tax.'))
@@ -802,7 +800,7 @@
             ('closed', '!=', True),
             ],
         states={
-            'readonly': _states['readonly'],
+            'editable': _states['editable'],
             'required': Eval('type') != 'none',
             })
     credit_note_account = fields.Many2One('account.account',
@@ -813,7 +811,7 @@
             ('closed', '!=', True),
             ],
         states={
-            'readonly': _states['readonly'],
+            'editable': _states['editable'],
             'required': Eval('type') != 'none',
             })
     legal_notice = fields.Text("Legal Notice", translate=True,
@@ -1500,8 +1498,7 @@
 class TaxRule(ModelSQL, ModelView):
     __name__ = 'account.tax.rule'
     _states = {
-        'readonly': (Bool(Eval('template', -1))
-            & ~Eval('template_override', False)),
+        'editable': ~Eval('template', None) | Eval('template_override', False),
         }
     name = fields.Char('Name', required=True, states=_states)
     kind = fields.Selection(KINDS, 'Kind', required=True, states=_states)
@@ -1695,8 +1692,7 @@
 class TaxRuleLine(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
     __name__ = 'account.tax.rule.line'
     _states = {
-        'readonly': (Bool(Eval('template', -1))
-            & ~Eval('template_override', False)),
+        'editable': ~Eval('template', None) | Eval('template_override', False),
         }
     rule = fields.Many2One(
         'account.tax.rule', "Rule",
diff -r f8597177e8ea -r b01882991ab9 modules/account_asset/account.py
--- a/modules/account_asset/account.py  Mon Sep 21 10:39:12 2026 +0200
+++ b/modules/account_asset/account.py  Mon Sep 21 15:24:43 2026 +0200
@@ -5,7 +5,7 @@
 from trytond.model.exceptions import AccessError
 from trytond.modules.company.model import CompanyValueMixin
 from trytond.pool import Pool, PoolMeta
-from trytond.pyson import Bool, Eval, Id, If
+from trytond.pyson import Eval, Id, If
 
 asset_bymonthday = fields.Selection([
         ('1', "First"),
@@ -146,8 +146,8 @@
             field = getattr(Mixin, fname)
             if not isinstance(field, fields.Field):
                 continue
-            field.states['readonly'] = (
-                Bool(Eval('template', -1)) & ~Eval('template_override', False))
+            field.states['editable'] = (
+                ~Eval('template', None) | Eval('template_override', False))
     return Mixin
 
 
diff -r f8597177e8ea -r b01882991ab9 modules/account_deposit/account.py
--- a/modules/account_deposit/account.py        Mon Sep 21 10:39:12 2026 +0200
+++ b/modules/account_deposit/account.py        Mon Sep 21 15:24:43 2026 +0200
@@ -2,7 +2,7 @@
 # this repository contains the full copyright notices and license terms.
 from trytond.model import fields
 from trytond.pool import PoolMeta
-from trytond.pyson import Bool, Eval, If
+from trytond.pyson import Eval, If
 
 
 def AccountTypeMixin(template=False):
@@ -24,8 +24,8 @@
             field = getattr(Mixin, fname)
             if not isinstance(field, fields.Field):
                 continue
-            field.states['readonly'] = (
-                Bool(Eval('template', -1)) & ~Eval('template_override', False))
+            field.states['editable'] = (
+                ~Eval('template', None) | Eval('template_override', False))
     return Mixin
 
 
diff -r f8597177e8ea -r b01882991ab9 modules/account_eu/account.py
--- a/modules/account_eu/account.py     Mon Sep 21 10:39:12 2026 +0200
+++ b/modules/account_eu/account.py     Mon Sep 21 15:24:43 2026 +0200
@@ -7,7 +7,7 @@
 from trytond.modules.account.exceptions import FiscalYearNotFoundError
 from trytond.modules.currency.fields import Monetary
 from trytond.pool import Pool, PoolMeta
-from trytond.pyson import Bool, Eval
+from trytond.pyson import Eval
 from trytond.transaction import Transaction
 
 VATEX_CODES = [
@@ -200,14 +200,16 @@
 
     ec_sales_list_code = fields.Char("EC Sales List Code",
         states={
-            'readonly': (Bool(Eval('template', -1))
-                & ~Eval('template_override', False)),
+            'editable': (
+                ~Eval('template', None)
+                | Eval('template_override', False)),
             })
     vatex_code = fields.Selection(
         [(None, "")] + VATEX_CODES, "Tax Exemption Code", sort=False,
         states={
-            'readonly': (Bool(Eval('template', -1))
-                & ~Eval('template_override', False)),
+            'editable': (
+                ~Eval('template', None)
+                | Eval('template_override', False)),
             },
         help="The reason why the amount is exempted from VAT.")
 
diff -r f8597177e8ea -r b01882991ab9 modules/account_export_winbooks/account.py
--- a/modules/account_export_winbooks/account.py        Mon Sep 21 10:39:12 
2026 +0200
+++ b/modules/account_export_winbooks/account.py        Mon Sep 21 15:24:43 
2026 +0200
@@ -13,7 +13,7 @@
 
 from trytond.model import Exclude, fields
 from trytond.pool import Pool, PoolMeta
-from trytond.pyson import Bool, Eval
+from trytond.pyson import Eval
 
 _ACT_FIELDNAMES = [
     'DOCTYPE', 'DBKCODE', 'DBKTYPE', 'DOCNUMBER', 'DOCORDER', 'OPCODE',
@@ -168,9 +168,9 @@
     winbooks_code = fields.Char(
         "WinBooks Code", size=10,
         states={
-            'readonly': (
-                Bool(Eval('template', -1)
-                    & ~Eval('template_override', False))),
+            'editable': (
+                ~Eval('template', None)
+                | Eval('template_override', False)),
             })
 
 
diff -r f8597177e8ea -r b01882991ab9 
modules/account_fr_chorus/tests/scenario_account_fr_chorus_invoice.rst
--- a/modules/account_fr_chorus/tests/scenario_account_fr_chorus_invoice.rst    
Mon Sep 21 10:39:12 2026 +0200
+++ b/modules/account_fr_chorus/tests/scenario_account_fr_chorus_invoice.rst    
Mon Sep 21 15:24:43 2026 +0200
@@ -108,7 +108,7 @@
     >>> Invoice.write([invoice], {
     ...         'number': str(uuid.uuid4())[:20],
     ...         'invoice_date': today,
-    ...         }, config._context)
+    ...         }, {**config._context, '_check_access': False})
     >>> invoice.click('post')
     >>> invoice.state
     'posted'
diff -r f8597177e8ea -r b01882991ab9 modules/edocument_unece/account.py
--- a/modules/edocument_unece/account.py        Mon Sep 21 10:39:12 2026 +0200
+++ b/modules/edocument_unece/account.py        Mon Sep 21 15:24:43 2026 +0200
@@ -2,7 +2,7 @@
 # this repository contains the full copyright notices and license terms.
 from trytond.model import fields
 from trytond.pool import Pool, PoolMeta
-from trytond.pyson import Bool, Eval
+from trytond.pyson import Eval
 
 
 class Tax(metaclass=PoolMeta):
@@ -66,8 +66,9 @@
             ('VAT', "Value added tax"),
             ], "UNECE Code",
         states={
-            'readonly': (Bool(Eval('template', -1))
-                & ~Eval('template_override', False)),
+            'editable': (
+                ~Eval('template', None)
+                | Eval('template_override', False)),
             },
         help="Standard code of "
         "the United Nations Economic Commission for Europe.")
@@ -99,8 +100,9 @@
             ('Z', "Zero rated goods"),
             ], "UNECE Category Code",
         states={
-            'readonly': (Bool(Eval('template', -1))
-                & ~Eval('template_override', False)),
+            'editable': (
+                ~Eval('template', None)
+                | Eval('template_override', False)),
             },
         help="Standard code of "
         "the United Nations Economic Commission for Europe.")
diff -r f8597177e8ea -r b01882991ab9 modules/sale_advance_payment/account.py
--- a/modules/sale_advance_payment/account.py   Mon Sep 21 10:39:12 2026 +0200
+++ b/modules/sale_advance_payment/account.py   Mon Sep 21 15:24:43 2026 +0200
@@ -3,7 +3,7 @@
 
 from trytond.model import fields
 from trytond.pool import Pool, PoolMeta
-from trytond.pyson import Bool, Eval, If
+from trytond.pyson import Eval, If
 
 
 def AccountTypeMixin(template=False):
@@ -25,8 +25,8 @@
             field = getattr(Mixin, fname)
             if not isinstance(field, fields.Field):
                 continue
-            field.states['readonly'] = (
-                Bool(Eval('template', -1)) & ~Eval('template_override', False))
+            field.states['editable'] = (
+                ~Eval('template', None) | Eval('template_override', False))
     return Mixin
 
 
diff -r f8597177e8ea -r b01882991ab9 modules/sale_gift_card/account.py
--- a/modules/sale_gift_card/account.py Mon Sep 21 10:39:12 2026 +0200
+++ b/modules/sale_gift_card/account.py Mon Sep 21 15:24:43 2026 +0200
@@ -3,7 +3,7 @@
 from trytond.model import ModelSQL, fields
 from trytond.modules.company.model import CompanyValueMixin
 from trytond.pool import Pool, PoolMeta
-from trytond.pyson import Bool, Eval, If
+from trytond.pyson import Eval, If
 
 
 class Configuration(metaclass=PoolMeta):
@@ -69,8 +69,8 @@
             field = getattr(Mixin, fname)
             if not isinstance(field, fields.Field):
                 continue
-            field.states['readonly'] = (
-                Bool(Eval('template', -1)) & ~Eval('template_override', False))
+            field.states['editable'] = (
+                ~Eval('template', None) | Eval('template_override', False))
     return Mixin
 
 

Reply via email to