Accessing the phonecall and the lead do not require the same permissions so should not be computed in the same method. The effect of the multi was already lost as the phonecall_count was already computed in another loop. Add the phonecall_count button in a second view to make the computation only if the user has the requried access rights. Fixes #2458
108 lines
5.0 KiB
Python
108 lines
5.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
##############################################################################
|
|
#
|
|
# OpenERP, Open Source Management Solution
|
|
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU Affero General Public License as
|
|
# published by the Free Software Foundation, either version 3 of the
|
|
# License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Affero General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
##############################################################################
|
|
|
|
from openerp.osv import fields,osv
|
|
|
|
class res_partner(osv.osv):
|
|
""" Inherits partner and adds CRM information in the partner form """
|
|
_inherit = 'res.partner'
|
|
|
|
def _opportunity_meeting_phonecall_count(self, cr, uid, ids, field_name, arg, context=None):
|
|
res = dict(map(lambda x: (x,{'opportunity_count': 0, 'meeting_count': 0}), ids))
|
|
# the user may not have access rights for opportunities or meetings
|
|
try:
|
|
for partner in self.browse(cr, uid, ids, context):
|
|
if partner.is_company:
|
|
operator = 'child_of'
|
|
else:
|
|
operator = '='
|
|
opp_ids = self.pool['crm.lead'].search(cr, uid, [('partner_id', operator, partner.id), ('type', '=', 'opportunity'), ('probability', '<', '100')], context=context)
|
|
res[partner.id] = {
|
|
'opportunity_count': len(opp_ids),
|
|
'meeting_count': len(partner.meeting_ids),
|
|
}
|
|
except:
|
|
pass
|
|
return res
|
|
|
|
def _phonecall_count(self, cr, uid, ids, field_name, arg, context=None):
|
|
res = {}
|
|
for partner in self.browse(cr, uid, ids, context):
|
|
res[partner.id] = len(partner.phonecall_ids)
|
|
return res
|
|
|
|
_columns = {
|
|
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
|
'opportunity_ids': fields.one2many('crm.lead', 'partner_id',\
|
|
'Leads and Opportunities', domain=[('probability', 'not in', ['0', '100'])]),
|
|
'meeting_ids': fields.many2many('calendar.event', 'calendar_event_res_partner_rel','res_partner_id', 'calendar_event_id',
|
|
'Meetings'),
|
|
'phonecall_ids': fields.one2many('crm.phonecall', 'partner_id',\
|
|
'Phonecalls'),
|
|
'opportunity_count': fields.function(_opportunity_meeting_phonecall_count, string="Opportunity", type='integer', multi='opp_meet'),
|
|
'meeting_count': fields.function(_opportunity_meeting_phonecall_count, string="# Meetings", type='integer', multi='opp_meet'),
|
|
'phonecall_count': fields.function(_phonecall_count, string="Phonecalls", type="integer"),
|
|
}
|
|
|
|
def redirect_partner_form(self, cr, uid, partner_id, context=None):
|
|
search_view = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base', 'view_res_partner_filter')
|
|
value = {
|
|
'domain': "[]",
|
|
'view_type': 'form',
|
|
'view_mode': 'form,tree',
|
|
'res_model': 'res.partner',
|
|
'res_id': int(partner_id),
|
|
'view_id': False,
|
|
'context': context,
|
|
'type': 'ir.actions.act_window',
|
|
'search_view_id': search_view and search_view[1] or False
|
|
}
|
|
return value
|
|
|
|
def make_opportunity(self, cr, uid, ids, opportunity_summary, planned_revenue=0.0, probability=0.0, partner_id=None, context=None):
|
|
categ_obj = self.pool.get('crm.case.categ')
|
|
categ_ids = categ_obj.search(cr, uid, [('object_id.model','=','crm.lead')])
|
|
lead_obj = self.pool.get('crm.lead')
|
|
opportunity_ids = {}
|
|
for partner in self.browse(cr, uid, ids, context=context):
|
|
if not partner_id:
|
|
partner_id = partner.id
|
|
opportunity_id = lead_obj.create(cr, uid, {
|
|
'name' : opportunity_summary,
|
|
'planned_revenue' : planned_revenue,
|
|
'probability' : probability,
|
|
'partner_id' : partner_id,
|
|
'categ_ids' : categ_ids and categ_ids[0:1] or [],
|
|
'type': 'opportunity'
|
|
}, context=context)
|
|
opportunity_ids[partner_id] = opportunity_id
|
|
return opportunity_ids
|
|
|
|
def schedule_meeting(self, cr, uid, ids, context=None):
|
|
partner_ids = list(ids)
|
|
partner_ids.append(self.pool.get('res.users').browse(cr, uid, uid).partner_id.id)
|
|
res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid, 'calendar', 'action_calendar_event', context)
|
|
res['context'] = {
|
|
'search_default_partner_ids': list(ids),
|
|
'default_partner_ids': partner_ids,
|
|
}
|
|
return res
|