details:   https://code.tryton.org/tryton/commit/a54c00182549
branch:    default
user:      Cédric Krier <[email protected]>
date:      Tue Sep 15 15:19:40 2026 +0200
description:
        Include administrators in button states based on groups

        Since 6ebedcf8826e, administrators have no more groups.

        Closes #15097
diffstat:

 modules/account_invoice/invoice.py             |  18 +++++++++++-----
 modules/production/production.py               |   4 ++-
 modules/purchase_blanket_agreement/purchase.py |   7 ++++-
 modules/sale_blanket_agreement/sale.py         |   7 ++++-
 modules/stock/move.py                          |   4 ++-
 modules/stock/shipment.py                      |  28 ++++++++++++++++++-------
 6 files changed, 48 insertions(+), 20 deletions(-)

diffs (197 lines):

diff -r 508d2755ddc5 -r a54c00182549 modules/account_invoice/invoice.py
--- a/modules/account_invoice/invoice.py        Tue Sep 08 09:58:42 2026 +0200
+++ b/modules/account_invoice/invoice.py        Tue Sep 15 15:19:40 2026 +0200
@@ -115,14 +115,16 @@
             'readonly': (
                 Eval('has_report_cache', False)
                 & ~Id('account', 'group_account_admin').in_(
-                    Eval('context', {}).get('groups', []))),
+                    Eval('context', {}).get('groups', []))
+                & ~Eval('context', {}).get('administrator', False)),
             })
     description = fields.Char("Description", size=None,
         states={
             'readonly': (
                 (Eval('state') != 'draft')
                 & ~Id('account', 'group_account_admin').in_(
-                    Eval('context', {}).get('groups', []))),
+                    Eval('context', {}).get('groups', []))
+                & ~Eval('context', {}).get('administrator', False)),
             })
     validated_by = employee_field(
         "Validated By",
@@ -305,7 +307,8 @@
             'readonly': (
                 (Eval('state') != 'draft')
                 & ~Id('account', 'group_account_admin').in_(
-                    Eval('context', {}).get('groups', []))),
+                    Eval('context', {}).get('groups', []))
+                & ~Eval('context', {}).get('administrator', False)),
             })
     origins = fields.Function(fields.Char('Origins'), 'get_origins')
     origin_invoices = fields.Function(fields.Many2Many(
@@ -2581,7 +2584,8 @@
         states={
             'readonly': (_states['readonly']
                 & ~Id('account', 'group_account_admin').in_(
-                    Eval('context', {}).get('groups', []))),
+                    Eval('context', {}).get('groups', []))
+                & ~Eval('context', {}).get('administrator', False)),
                 })
     summary = fields.Function(
         fields.Char('Summary'), 'on_change_with_summary',
@@ -3247,7 +3251,8 @@
         states={
             'readonly': (_states['readonly']
                 & ~Id('account', 'group_account_admin').in_(
-                    Eval('context', {}).get('groups', []))),
+                    Eval('context', {}).get('groups', []))
+                & ~Eval('context', {}).get('administrator', False)),
             })
     sequence_number = fields.Function(fields.Integer('Sequence Number'),
             'get_sequence_number')
@@ -3292,7 +3297,8 @@
         states={
             'readonly': (_states['readonly']
                 & ~Id('account', 'group_account_admin').in_(
-                    Eval('context', {}).get('groups', []))),
+                    Eval('context', {}).get('groups', []))
+                & ~Eval('context', {}).get('administrator', False)),
             })
 
     del _states
diff -r 508d2755ddc5 -r a54c00182549 modules/production/production.py
--- a/modules/production/production.py  Tue Sep 08 09:58:42 2026 +0200
+++ b/modules/production/production.py  Tue Sep 15 15:19:40 2026 +0200
@@ -207,7 +207,9 @@
                         | (Eval('state').in_(['running', 'done'])
                             & ~Id('stock',
                                 'group_stock_cancellation').in_(
-                                Eval('context', {}).get('groups', [])))),
+                                Eval('context', {}).get('groups', []))
+                            & ~Eval('context', {}).get(
+                                'administrator', False))),
                     'depends': ['state'],
                     },
                 'draft': {
diff -r 508d2755ddc5 -r a54c00182549 
modules/purchase_blanket_agreement/purchase.py
--- a/modules/purchase_blanket_agreement/purchase.py    Tue Sep 08 09:58:42 
2026 +0200
+++ b/modules/purchase_blanket_agreement/purchase.py    Tue Sep 15 15:19:40 
2026 +0200
@@ -223,8 +223,11 @@
                 'run': {
                     'invisible': (
                         (Eval('state') != 'draft')
-                        & ~(Id('purchase', 'group_purchase_admin').in_(
-                                Eval('context', {}).get('groups', []))
+                        & ~(
+                            (Id('purchase', 'group_purchase_admin').in_(
+                                    Eval('context', {}).get('groups', []))
+                                | Eval('context', {}).get(
+                                    'administrator', False))
                             & (Eval('state') == 'closed'))),
                     'readonly': (~Eval('lines')
                         | (Eval('from_date', Date()) > Date())),
diff -r 508d2755ddc5 -r a54c00182549 modules/sale_blanket_agreement/sale.py
--- a/modules/sale_blanket_agreement/sale.py    Tue Sep 08 09:58:42 2026 +0200
+++ b/modules/sale_blanket_agreement/sale.py    Tue Sep 15 15:19:40 2026 +0200
@@ -224,8 +224,11 @@
                 'run': {
                     'invisible': (
                         (Eval('state') != 'draft')
-                        & ~(Id('sale', 'group_sale_admin').in_(
-                            Eval('context', {}).get('groups', []))
+                        & ~(
+                            (Id('sale', 'group_sale_admin').in_(
+                                    Eval('context', {}).get('groups', []))
+                                | Eval('context', {}).get(
+                                    'administrator', False))
                             & (Eval('state') == 'closed'))),
                     'readonly': (~Eval('lines')
                         | (Eval('from_date', Date()) > Date())),
diff -r 508d2755ddc5 -r a54c00182549 modules/stock/move.py
--- a/modules/stock/move.py     Tue Sep 08 09:58:42 2026 +0200
+++ b/modules/stock/move.py     Tue Sep 15 15:19:40 2026 +0200
@@ -497,7 +497,9 @@
                         | ((Eval('state') == 'done')
                             & ~Id('stock',
                                 'group_stock_cancellation').in_(
-                                Eval('context', {}).get('groups', [])))),
+                                Eval('context', {}).get('groups', []))
+                            & ~Eval('context', {}).get(
+                                'administrator', False))),
                     'readonly': Eval('shipment') | Eval('_parent_shipment'),
                     'depends': ['state', 'shipment'],
                     },
diff -r 508d2755ddc5 -r a54c00182549 modules/stock/shipment.py
--- a/modules/stock/shipment.py Tue Sep 08 09:58:42 2026 +0200
+++ b/modules/stock/shipment.py Tue Sep 15 15:19:40 2026 +0200
@@ -515,7 +515,9 @@
                         | ((Eval('state') == 'done')
                             & ~Id('stock',
                                 'group_stock_cancellation').in_(
-                                Eval('context', {}).get('groups', [])))),
+                                Eval('context', {}).get('groups', []))
+                            & ~Eval('context', {}).get(
+                                'administrator', False))),
                     'depends': ['state'],
                     },
                 'draft': {
@@ -927,7 +929,9 @@
                         | ((Eval('state') == 'done')
                             & ~Id('stock',
                                 'group_stock_cancellation').in_(
-                                Eval('context', {}).get('groups', [])))),
+                                Eval('context', {}).get('groups', []))
+                            & ~Eval('context', {}).get(
+                                'administrator', False))),
                     'depends': ['state'],
                     },
                 'draft': {
@@ -1331,7 +1335,9 @@
                         | ((Eval('state') == 'done')
                             & ~Id('stock',
                                 'group_stock_cancellation').in_(
-                                Eval('context', {}).get('groups', [])))),
+                                Eval('context', {}).get('groups', []))
+                            & ~Eval('context', {}).get(
+                                'administrator', False))),
                     'depends': ['state'],
                     },
                 'draft': {
@@ -2009,7 +2015,9 @@
                         | ((Eval('state') == 'done')
                             & ~Id('stock',
                                 'group_stock_cancellation').in_(
-                                Eval('context', {}).get('groups', [])))),
+                                Eval('context', {}).get('groups', []))
+                            & ~Eval('context', {}).get(
+                                'administrator', False))),
                     'depends': ['state'],
                     },
                 'draft': {
@@ -2523,7 +2531,9 @@
                         | (Eval('state').in_(['shipped', 'done'])
                             & ~Id('stock',
                                 'group_stock_cancellation').in_(
-                                Eval('context', {}).get('groups', [])))),
+                                Eval('context', {}).get('groups', []))
+                            & ~Eval('context', {}).get(
+                                'administrator', False))),
                     'depends': ['state'],
                     },
                 'draft': {
@@ -3044,9 +3054,11 @@
             Button("Ignore", 'ignore', 'tryton-forward'),
             Button("Force", 'force', 'tryton-forward',
                 states={
-                    'invisible': ~Id('stock',
-                        'group_stock_force_assignment').in_(
-                        Eval('context', {}).get('groups', [])),
+                    'invisible': (
+                        ~Id('stock',
+                            'group_stock_force_assignment').in_(
+                            Eval('context', {}).get('groups', []))
+                        & ~Eval('context', {}).get('administrator', False)),
                 }),
             ])
     cancel = StateTransition()

Reply via email to