[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
This commit is contained in:
Thibault Delavallée
2020-03-23 11:42:12 +00:00
parent d13dba106c
commit fc7bff8afb
3 changed files with 21 additions and 16 deletions
@@ -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):
@@ -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
@@ -39,7 +39,7 @@
<field name="arch" type="xml">
<field name="user_id" position="before">
<field name="partner_assigned_id" optional="show"/>
<field name="date_assign" invisible="1"/>
<field name="date_partner_assign" invisible="1"/>
</field>
</field>
</record>