[FIX] core: prevent redundant default on related
Setting a default value on a readonly related field without an inverse method is nonsense. We log some warning when it happens. We also fixed other cases where a related field has a default value that overrides the target field's value. closes odoo/odoo#67762 Related: odoo/enterprise#17313 Signed-off-by: Julien Castiaux <Julien00859@users.noreply.github.com>
This commit is contained in:
@@ -223,8 +223,7 @@ class AccountBankStatement(models.Model):
|
||||
currency_id = fields.Many2one('res.currency', compute='_compute_currency', string="Currency")
|
||||
journal_id = fields.Many2one('account.journal', string='Journal', required=True, states={'confirm': [('readonly', True)]}, default=_default_journal, check_company=True)
|
||||
journal_type = fields.Selection(related='journal_id.type', help="Technical field used for usability purposes")
|
||||
company_id = fields.Many2one('res.company', related='journal_id.company_id', string='Company', store=True, readonly=True,
|
||||
default=lambda self: self.env.company)
|
||||
company_id = fields.Many2one('res.company', related='journal_id.company_id', string='Company', store=True, readonly=True)
|
||||
|
||||
total_entry_encoding = fields.Monetary('Transactions Subtotal', compute='_end_balance', store=True, help="Total of transaction lines.")
|
||||
balance_end = fields.Monetary('Computed Balance', compute='_end_balance', store=True, help='Balance as calculated based on Opening Balance and transaction lines')
|
||||
|
||||
@@ -3410,7 +3410,7 @@ class AccountMoveLine(models.Model):
|
||||
ref = fields.Char(related='move_id.ref', store=True, copy=False, index=True, readonly=False)
|
||||
parent_state = fields.Selection(related='move_id.state', store=True, readonly=True)
|
||||
journal_id = fields.Many2one(related='move_id.journal_id', store=True, index=True, copy=False)
|
||||
company_id = fields.Many2one(related='move_id.company_id', store=True, readonly=True, default=lambda self: self.env.company)
|
||||
company_id = fields.Many2one(related='move_id.company_id', store=True, readonly=True)
|
||||
company_currency_id = fields.Many2one(related='company_id.currency_id', string='Company Currency',
|
||||
readonly=True, store=True,
|
||||
help='Utility field to express amount currency')
|
||||
|
||||
@@ -46,7 +46,7 @@ class AccountReconcileModelLine(models.Model):
|
||||
allow_payment_tolerance = fields.Boolean(related='model_id.allow_payment_tolerance')
|
||||
payment_tolerance_param = fields.Float(related='model_id.payment_tolerance_param')
|
||||
rule_type = fields.Selection(related='model_id.rule_type')
|
||||
company_id = fields.Many2one(related='model_id.company_id', store=True, default=lambda self: self.env.company)
|
||||
company_id = fields.Many2one(related='model_id.company_id', store=True)
|
||||
sequence = fields.Integer(required=True, default=10)
|
||||
account_id = fields.Many2one('account.account', string='Account', ondelete='cascade',
|
||||
domain="[('deprecated', '=', False), ('company_id', '=', company_id), ('is_off_balance', '=', False)]",
|
||||
|
||||
@@ -861,7 +861,7 @@ class HrExpenseSheet(models.Model):
|
||||
store=True, readonly=True, copy=False, tracking=True, compute='_compute_payment_state')
|
||||
employee_id = fields.Many2one('hr.employee', string="Employee", required=True, readonly=True, tracking=True, states={'draft': [('readonly', False)]}, default=_default_employee_id, check_company=True, domain= lambda self: self.env['hr.expense']._get_employee_id_domain())
|
||||
address_id = fields.Many2one('res.partner', compute='_compute_from_employee_id', store=True, readonly=False, copy=True, string="Employee Home Address", check_company=True)
|
||||
payment_mode = fields.Selection(related='expense_line_ids.payment_mode', default='own_account', readonly=True, string="Paid By", tracking=True)
|
||||
payment_mode = fields.Selection(related='expense_line_ids.payment_mode', readonly=True, string="Paid By", tracking=True)
|
||||
user_id = fields.Many2one('res.users', 'Manager', compute='_compute_from_employee_id', store=True, readonly=True, copy=False, states={'draft': [('readonly', False)]}, tracking=True, domain=lambda self: [('groups_id', 'in', self.env.ref('hr_expense.group_hr_expense_team_approver').id)])
|
||||
total_amount = fields.Monetary('Total Amount', currency_field='currency_id', compute='_compute_amount', store=True, tracking=True)
|
||||
amount_residual = fields.Monetary(
|
||||
|
||||
@@ -122,7 +122,7 @@ class HolidaysRequest(models.Model):
|
||||
"\nThe status is 'Refused', when time off request is refused by manager." +
|
||||
"\nThe status is 'Approved', when time off request is approved by manager.")
|
||||
report_note = fields.Text('HR Comments', copy=False, groups="hr_holidays.group_hr_holidays_manager")
|
||||
user_id = fields.Many2one('res.users', string='User', related='employee_id.user_id', related_sudo=True, compute_sudo=True, store=True, default=lambda self: self.env.uid, readonly=True)
|
||||
user_id = fields.Many2one('res.users', string='User', related='employee_id.user_id', related_sudo=True, compute_sudo=True, store=True, readonly=True)
|
||||
manager_id = fields.Many2one('hr.employee', compute='_compute_from_employee_id', store=True, readonly=False)
|
||||
# leave type configuration
|
||||
holiday_status_id = fields.Many2one(
|
||||
|
||||
@@ -177,7 +177,7 @@ class PurchaseRequisitionLine(models.Model):
|
||||
price_unit = fields.Float(string='Unit Price', digits='Product Price')
|
||||
qty_ordered = fields.Float(compute='_compute_ordered_qty', string='Ordered Quantities')
|
||||
requisition_id = fields.Many2one('purchase.requisition', required=True, string='Purchase Agreement', ondelete='cascade')
|
||||
company_id = fields.Many2one('res.company', related='requisition_id.company_id', string='Company', store=True, readonly=True, default= lambda self: self.env.company)
|
||||
company_id = fields.Many2one('res.company', related='requisition_id.company_id', string='Company', store=True, readonly=True)
|
||||
account_analytic_id = fields.Many2one('account.analytic.account', string='Analytic Account')
|
||||
analytic_tag_ids = fields.Many2many('account.analytic.tag', string='Analytic Tags')
|
||||
schedule_date = fields.Date(string='Scheduled Date')
|
||||
|
||||
@@ -301,7 +301,7 @@ class SaleOrderLine(models.Model):
|
||||
" They are not copied when duplicating a sales order.")
|
||||
|
||||
state = fields.Selection(
|
||||
related='order_id.state', string='Order Status', copy=False, store=True, default='draft')
|
||||
related='order_id.state', string='Order Status', copy=False, store=True)
|
||||
|
||||
customer_lead = fields.Float(
|
||||
'Lead Time', required=True, default=0.0,
|
||||
|
||||
@@ -68,7 +68,7 @@ class StockMoveLine(models.Model):
|
||||
state = fields.Selection(related='move_id.state', store=True, related_sudo=False)
|
||||
is_initial_demand_editable = fields.Boolean(related='move_id.is_initial_demand_editable')
|
||||
is_inventory = fields.Boolean(related='move_id.is_inventory')
|
||||
is_locked = fields.Boolean(related='move_id.is_locked', default=True, readonly=True)
|
||||
is_locked = fields.Boolean(related='move_id.is_locked', readonly=True)
|
||||
consume_line_ids = fields.Many2many('stock.move.line', 'stock_move_line_consume_rel', 'consume_line_id', 'produce_line_id', help="Technical link to see who consumed what. ")
|
||||
produce_line_ids = fields.Many2many('stock.move.line', 'stock_move_line_consume_rel', 'produce_line_id', 'consume_line_id', help="Technical link to see which line was produced with this. ")
|
||||
reference = fields.Char(related='move_id.reference', store=True, related_sudo=False, readonly=False)
|
||||
|
||||
@@ -547,6 +547,11 @@ class Field(MetaField('DummyField', (object,), {})):
|
||||
# allow searching on self only if the related field is searchable
|
||||
self.search = self._search_related
|
||||
|
||||
# A readonly related field without an inverse method should not have a
|
||||
# default value, as it does not make sense.
|
||||
if self.default and self.readonly and not self.inverse:
|
||||
_logger.warning("Redundant default on %s", self)
|
||||
|
||||
# copy attributes from field to self (string, help, etc.)
|
||||
for attr, prop in self.related_attrs:
|
||||
if not getattr(self, attr):
|
||||
|
||||
Reference in New Issue
Block a user