I am facing an issue with recomputing the compute_recent_customer method in my custom module for Odoo 15. The method is decorated with @api.depends and depends on the recent_order_days field, as well as other related fields. However, despite trying various approaches, the method does not get re-computed when the value of recent_order_days is changed.
I have attempted different solutions, including adding recent_order_days as a dependency in the @api.depends decorator, explicitly updating the dependent fields, and ensuring the correct usage of the @api.depends decorator. Unfortunately, none of these attempts have resolved the issue.
from odoo import models, fields, api
from datetime import datetime, timedelta
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
recent_order_days = fields.Integer(string='Recent Order Days')
@api.model
def get_values(self):
res = super(ResConfigSettings, self).get_values()
recent_order_days = self.env['ir.config_parameter'].sudo().get_param('crm_res_partner.recent_order_days')
res.update(recent_order_days=int(recent_order_days))
return res
def set_values(self):
super(ResConfigSettings, self).set_values()
self.env['ir.config_parameter'].sudo().set_param('crm_res_partner.recent_order_days', self.recent_order_days)
self.env.cr.execute("UPDATE res_partner SET recent_order_days = %s""",
[self.recent_order_days])
class ResPartner(models.Model):
_inherit = 'res.partner'
recent_order_days = fields.Integer(string='Recent Order Days')
is_recent_pos_customer = fields.Boolean(
compute='_compute_recent_customer',
string='Recent POS Customer',store=True)
is_recent_sale_customer = fields.Boolean(
compute='_compute_recent_customer',
string='Recent Sales Customer',store=True)
@api.depends('recent_order_days','sale_order_ids.date_order', 'pos_order_ids.date_order', 'sale_order_ids.state', 'pos_order_ids.state')
def _compute_recent_customer(self):
days = partner.recent_order_days
date_threshold = fields.Datetime.now() - timedelta(days=int(days))
for partner in self:
pos_orders = partner.pos_order_ids.filtered(
lambda o: o.state in ['done'] and
o.date_order > date_threshold)
sales_orders = partner.sale_order_ids.filtered(
lambda o: o.state in ['done'] and
o.date_order > date_threshold)
partner.is_recent_pos_customer = bool(pos_orders)
partner.is_recent_sale_customer = bool(sales_orders)