86 lines
4.2 KiB
Python
86 lines
4.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models
|
|
from odoo.osv import expression
|
|
|
|
|
|
class ResPartner(models.Model):
|
|
_inherit = "res.partner"
|
|
|
|
@api.model
|
|
def default_get(self, fields_list):
|
|
default_vals = super().default_get(fields_list)
|
|
if self.env.context.get('partner_set_default_grade_activation'):
|
|
# sets the lowest grade and activation if no default values given, mainly useful while
|
|
# creating assigned partner on the fly (to make it visible in same m2o again)
|
|
if 'grade_id' in fields_list and not default_vals.get('grade_id'):
|
|
default_vals['grade_id'] = self.env['res.partner.grade'].search([], order='sequence', limit=1).id
|
|
if 'activation' in fields_list and not default_vals.get('activation'):
|
|
default_vals['activation'] = self.env['res.partner.activation'].search([], order='sequence', limit=1).id
|
|
return default_vals
|
|
|
|
partner_weight = fields.Integer(
|
|
'Level Weight', compute='_compute_partner_weight',
|
|
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)
|
|
activation = fields.Many2one('res.partner.activation', 'Activation', index='btree_not_null', tracking=True)
|
|
date_partnership = fields.Date('Partnership Date')
|
|
date_review = fields.Date('Latest Partner Review')
|
|
date_review_next = fields.Date('Next Partner Review')
|
|
# customer implementation
|
|
assigned_partner_id = fields.Many2one(
|
|
'res.partner', 'Implemented by',
|
|
)
|
|
implemented_partner_ids = fields.One2many(
|
|
'res.partner', 'assigned_partner_id',
|
|
string='Implementation References',
|
|
)
|
|
implemented_partner_count = fields.Integer(compute='_compute_implemented_partner_count', store=True)
|
|
|
|
@api.depends('implemented_partner_ids.is_published', 'implemented_partner_ids.active')
|
|
def _compute_implemented_partner_count(self):
|
|
rg_result = self.env['res.partner']._read_group(
|
|
[('assigned_partner_id', 'in', self.ids),
|
|
('is_published', '=', True)],
|
|
['assigned_partner_id'],
|
|
['__count'],
|
|
)
|
|
rg_data = {assigned_partner.id: count for assigned_partner, count in rg_result}
|
|
for partner in self:
|
|
partner.implemented_partner_count = rg_data.get(partner.id, 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
|
|
|
|
def _compute_opportunity_count(self):
|
|
super()._compute_opportunity_count()
|
|
opportunity_data = self.env['crm.lead'].with_context(active_test=False)._read_group(
|
|
[('partner_assigned_id', 'in', self.ids)],
|
|
['partner_assigned_id'], ['__count']
|
|
)
|
|
assign_counts = {partner_assigned.id: count for partner_assigned, count in opportunity_data}
|
|
for partner in self:
|
|
partner.opportunity_count += assign_counts.get(partner.id, 0)
|
|
|
|
def action_view_opportunity(self):
|
|
self.ensure_one() # especially here as we are doing an id, in, IDS domain
|
|
action = super().action_view_opportunity()
|
|
action_domain_origin = action.get('domain')
|
|
action_context_origin = action.get('context') or {}
|
|
action_domain_assign = [('partner_assigned_id', '=', self.id)]
|
|
if not action_domain_origin:
|
|
action['domain'] = action_domain_assign
|
|
return action
|
|
# perform searches independently as having OR with those leaves seems to
|
|
# be counter productive
|
|
Lead = self.env['crm.lead'].with_context(**action_context_origin)
|
|
ids_origin = Lead.search(action_domain_origin).ids
|
|
ids_new = Lead.search(action_domain_assign).ids
|
|
action['domain'] = [('id', 'in', sorted(list(set(ids_origin) | set(ids_new))))]
|
|
return action
|