Add test that fields in __access__ are required

Closes #14261
This commit is contained in:
Nicolas Évrard
2025-09-29 13:16:49 +02:00
parent c9d323f544
commit 9839c0902d
9 changed files with 15 additions and 9 deletions
+2 -1
View File
@@ -2329,7 +2329,8 @@ class GeneralLedgerLine(DescriptionOriginMixin, ModelSQL, ModelView):
move = fields.Many2One('account.move', 'Move')
date = fields.Date('Date')
account = fields.Many2One('account.general_ledger.account', 'Account')
account = fields.Many2One(
'account.general_ledger.account', 'Account', required=True)
party = fields.Many2One('party.party', 'Party',
states={
'invisible': ~Eval('party_required', False),
@@ -40,7 +40,8 @@ class MoveLine(metaclass=PoolMeta):
class MoveLineGroup(MoveLineMixin, ModelSQL, ModelView):
__name__ = 'account.move.line.group'
move = fields.Many2One('account.move', "Move", readonly=True)
move = fields.Many2One(
'account.move', "Move", readonly=True, required=True)
account = fields.Many2One(
'account.account', "Account", readonly=True,
context={
+2 -1
View File
@@ -1086,7 +1086,8 @@ del _states
class LineGroup(ModelSQL, ModelView):
__name__ = 'account.statement.line.group'
_rec_name = 'number'
statement = fields.Many2One('account.statement', 'Statement')
statement = fields.Many2One(
'account.statement', 'Statement', required=True)
journal = fields.Function(fields.Many2One('account.statement.journal',
'Journal'), 'get_journal', searcher='search_journal')
number = fields.Char('Number')
+1 -1
View File
@@ -254,7 +254,7 @@ class CurrencyRate(ModelSQL, ModelView):
],
help="The floating exchange rate used to convert the currency.")
currency = fields.Many2One('currency.currency', 'Currency',
ondelete='CASCADE',
required=True, ondelete='CASCADE',
help="The currency on which the rate applies.")
@classmethod
+1 -1
View File
@@ -819,7 +819,7 @@ class Identifier(sequence_ordered(), DeactivableMixin, ModelSQL, ModelView):
@classmethod
def __setup__(cls):
super().__setup__()
cls.__access__.update(['party', 'address'])
cls.__access__.add('party')
@classmethod
def __register__(cls, module_name):
+1 -1
View File
@@ -237,7 +237,7 @@ class Image(ImageMixin, sequence_ordered(), ModelSQL, ModelView, MatchMixin):
@classmethod
def __setup__(cls):
super().__setup__()
cls.__access__.update(['product', 'template'])
cls.__access__.add('template')
def _store_cache(self, size, image):
cache = super()._store_cache(size, image)
+1 -1
View File
@@ -245,7 +245,7 @@ class Component(ComponentMixin, ModelSQL, ModelView):
@classmethod
def __setup__(cls):
super().__setup__()
cls.__access__.update(['parent_template', 'parent_product'])
cls.__access__.add('parent_template')
@fields.depends(
'parent_product', '_parent_parent_product.template')
+2 -2
View File
@@ -186,7 +186,7 @@ class ActionKeyword(ModelSQL, ModelView):
('graph_open', 'Open Graph'),
], string='Keyword', required=True)
model = fields.Reference('Model', selection='models_get')
action = fields.Many2One('ir.action', 'Action',
action = fields.Many2One('ir.action', 'Action', required=True,
ondelete='CASCADE')
groups = fields.Function(
fields.Many2Many('res.group', None, None, "Groups"),
@@ -973,7 +973,7 @@ class ActionActWindowView(
('model', '=', Eval('model', None)),
])
act_window = fields.Many2One('ir.action.act_window', 'Action',
ondelete='CASCADE')
required=True, ondelete='CASCADE')
model = fields.Function(fields.Char("Model"), 'on_change_with_model')
@classmethod
+3
View File
@@ -416,6 +416,9 @@ class ModuleTestCase(_DBTestCase):
msg="Wrong __access__ '%s' for %s" % (
field_name, mname))
field = Model._fields[field_name]
self.assertTrue(field.required,
msg=("Field '%s' of '%s' must be required in order to "
"be used in __access__") % (field_name, mname))
Target = field.get_target()
self.assertTrue(
Target,