From fc7bff8afb9c94182fcc7b5ce0fbb03527b686b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 24 Dec 2019 12:57:29 +0000 Subject: [PATCH] [REF] website_crm_partner_assign : use stored editable r+w fields PURPOSE Try to move from onchange / default_get to stored editable computed fields. Behavior should be the same (computed or set by user), with support of create / write / onchange field update without additional code. SPECIFICATIONS Update classic fields updated in some cases by onchange and/or default methods by fields with store=True, readonly=False. It means their value comes either from manual user input, either from trigger based coputation. Remove onchange and default_get when possible, leading to an unique computation method and clearing fields definition. Also clean some fields definition inconsistencies, notably required fields that should instead be correctly computed or default that have no real meaning. SPECIFICATIONS: FIELDS RENAMING In this commit we also rename ``date_assign`` to ``date_partner_assign``. There are already ``date_open`` (crm_lead) and ``assign_date`` (website scoring) fields available. It may be confusing. The field is therefore renamed to better indicate it is linked to partner assignment. LINKS Task ID 2088565 (crm: from onchange to compute) Upgrade PR odoo/upgrade#781 --- .../models/crm_lead.py | 23 +++++++++++-------- .../models/res_partner.py | 12 ++++++---- .../views/crm_lead_views.xml | 2 +- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/addons/website_crm_partner_assign/models/crm_lead.py b/addons/website_crm_partner_assign/models/crm_lead.py index 5e640e0beed..51428c46730 100644 --- a/addons/website_crm_partner_assign/models/crm_lead.py +++ b/addons/website_crm_partner_assign/models/crm_lead.py @@ -9,6 +9,7 @@ from odoo.exceptions import AccessDenied, AccessError class CrmLead(models.Model): _inherit = "crm.lead" + partner_latitude = fields.Float('Geo Latitude', digits=(16, 5)) partner_longitude = fields.Float('Geo Longitude', digits=(16, 5)) partner_assigned_id = fields.Many2one('res.partner', 'Assigned Partner', tracking=True, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", help="Partner this case has been forwarded/assigned to.", index=True) @@ -18,22 +19,25 @@ class CrmLead(models.Model): 'lead_id', 'partner_id', string='Partner not interested') - date_assign = fields.Date('Partner Assignment Date', help="Last date this case was forwarded/assigned to a partner") + date_partner_assign = fields.Date( + 'Partner Assignment Date', compute='_compute_date_partner_assign', + copy=True, readonly=False, store=True, + help="Last date this case was forwarded/assigned to a partner") def _merge_data(self, fields): fields += ['partner_latitude', 'partner_longitude', 'partner_assigned_id', 'date_assign'] return super(CrmLead, self)._merge_data(fields) @api.onchange("partner_assigned_id") - def onchange_assign_id(self): + def _compute_date_partner_assign(self): """This function updates the "assignation date" automatically, when manually assign a partner in the geo assign tab """ - partner_assigned = self.partner_assigned_id - if not partner_assigned: - self.date_assign = False - else: - self.date_assign = fields.Date.context_today(self) - self.user_id = partner_assigned.user_id + for lead in self: + if not lead.partner_assigned_id: + lead.date_partner_assign = False + else: + lead.date_assign = fields.Date.context_today(lead) + # self.user_id = partner_assigned.user_id def assign_salesman_of_assigned_partner(self): salesmans_leads = {} @@ -65,8 +69,7 @@ class CrmLead(models.Model): partner = self.env['res.partner'].browse(partner_id) if partner.user_id: lead.handle_salesmen_assignment(partner.user_id.ids, team_id=partner.team_id.id) - values = {'date_assign': fields.Date.context_today(lead), 'partner_assigned_id': partner_id} - lead.write(values) + lead.write({'partner_assigned_id': partner_id}) return res def assign_geo_localize(self, latitude=False, longitude=False): diff --git a/addons/website_crm_partner_assign/models/res_partner.py b/addons/website_crm_partner_assign/models/res_partner.py index 93c45db11b4..bc4a0202d95 100644 --- a/addons/website_crm_partner_assign/models/res_partner.py +++ b/addons/website_crm_partner_assign/models/res_partner.py @@ -37,7 +37,9 @@ class ResPartnerActivation(models.Model): class ResPartner(models.Model): _inherit = "res.partner" - partner_weight = fields.Integer('Level Weight', default=0, tracking=True, + partner_weight = fields.Integer( + 'Level Weight', compute='_compute_partner_weight', + copy=True, readonly=False, store=True, tracking=True, help="This should be a numerical value greater than 0 which will decide the contention for this partner to take this lead/opportunity.") grade_id = fields.Many2one('res.partner.grade', 'Partner Level', tracking=True) grade_sequence = fields.Integer(related='grade_id.sequence', readonly=True, store=True) @@ -60,7 +62,7 @@ class ResPartner(models.Model): for partner in self: partner.implemented_count = len(partner.implemented_partner_ids.filtered('website_published')) - @api.onchange('grade_id') - def _onchange_grade_id(self): - grade = self.grade_id - self.partner_weight = grade.partner_weight if grade else 0 + @api.depends('grade_id.partner_weight') + def _compute_partner_weight(self): + for partner in self: + partner.partner_weight = partner.grade_id.partner_weight if partner.grade_id else 0 diff --git a/addons/website_crm_partner_assign/views/crm_lead_views.xml b/addons/website_crm_partner_assign/views/crm_lead_views.xml index 229290f92e7..161519522f2 100644 --- a/addons/website_crm_partner_assign/views/crm_lead_views.xml +++ b/addons/website_crm_partner_assign/views/crm_lead_views.xml @@ -39,7 +39,7 @@ - +