summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrgo-odoo <rgo@odoo.com>2016-07-04 16:44:02 +0200
committerYannick Tivisse <yti@odoo.com>2016-07-05 17:27:44 +0200
commit053982f48d4c824a68ee1e56e897d576530777c7 (patch)
tree642efad97e47d5ab697b53dd55b74c2301dd1e92
parentac94ed70ec1c853461552e911ea6849b15a2ab73 (diff)
[MIG] website_crm_partner_assign: Code migration to new api
-rw-r--r--addons/website_crm_partner_assign/__init__.py3
-rw-r--r--addons/website_crm_partner_assign/controllers/main.py71
-rw-r--r--addons/website_crm_partner_assign/data/crm_lead_demo.xml4
-rw-r--r--addons/website_crm_partner_assign/data/crm_partner_assign_data.xml8
-rw-r--r--addons/website_crm_partner_assign/data/portal_data.xml13
-rw-r--r--addons/website_crm_partner_assign/data/res_partner_demo.xml6
-rw-r--r--addons/website_crm_partner_assign/data/res_partner_grade_demo.xml4
-rw-r--r--addons/website_crm_partner_assign/models/crm_lead.py225
-rw-r--r--addons/website_crm_partner_assign/models/res_partner.py102
-rw-r--r--addons/website_crm_partner_assign/report/crm_lead_report.py70
-rw-r--r--addons/website_crm_partner_assign/report/crm_lead_report_view.xml4
-rw-r--r--addons/website_crm_partner_assign/report/crm_partner_report.py51
-rw-r--r--addons/website_crm_partner_assign/report/crm_partner_report_view.xml8
-rw-r--r--addons/website_crm_partner_assign/security/ir.model.access.csv6
-rw-r--r--addons/website_crm_partner_assign/views/crm_lead_views.xml28
-rw-r--r--addons/website_crm_partner_assign/views/res_partner_views.xml34
-rw-r--r--addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml6
-rw-r--r--addons/website_crm_partner_assign/wizard/crm_forward_to_partner.py205
-rw-r--r--addons/website_crm_partner_assign/wizard/crm_forward_to_partner_view.xml10
19 files changed, 392 insertions, 466 deletions
diff --git a/addons/website_crm_partner_assign/__init__.py b/addons/website_crm_partner_assign/__init__.py
index e25e52d1e7b..859f7ca8e08 100644
--- a/addons/website_crm_partner_assign/__init__.py
+++ b/addons/website_crm_partner_assign/__init__.py
@@ -1,3 +1,6 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
import controllers
import models
import report
diff --git a/addons/website_crm_partner_assign/controllers/main.py b/addons/website_crm_partner_assign/controllers/main.py
index a87eb9d23a6..0a358b5ab67 100644
--- a/addons/website_crm_partner_assign/controllers/main.py
+++ b/addons/website_crm_partner_assign/controllers/main.py
@@ -4,14 +4,14 @@ import werkzeug
from collections import OrderedDict
-from openerp import fields, SUPERUSER_ID
-from openerp.addons.web import http
-from openerp.addons.web.http import request
-from openerp.addons.website.models.website import slug, unslug
-from openerp.addons.website_partner.controllers.main import WebsitePartnerPage
-from openerp.tools.translate import _
+from odoo import fields
+from odoo.addons.web import http
+from odoo.addons.web.http import request
+from odoo.addons.website.models.website import slug, unslug
+from odoo.addons.website_partner.controllers.main import WebsitePartnerPage
+from odoo.tools.translate import _
-from openerp.addons.website_portal.controllers.main import website_account
+from odoo.addons.website_portal.controllers.main import website_account
class WebsiteAccount(website_account):
@@ -168,12 +168,12 @@ class WebsiteCrmPartnerAssign(WebsitePartnerPage):
], type='http', auth="public", website=True)
def partners(self, country=None, grade=None, page=0, **post):
country_all = post.pop('country_all', False)
- partner_obj = request.registry['res.partner']
- country_obj = request.registry['res.country']
+ partner_obj = request.env['res.partner']
+ country_obj = request.env['res.country']
search = post.get('search', '')
base_partner_domain = [('is_company', '=', True), ('grade_id', '!=', False), ('website_published', '=', True)]
- if not request.registry['res.users'].has_group(request.cr, request.uid, 'base.group_website_publisher'):
+ if not request.env['res.users'].has_group('base.group_website_publisher'):
base_partner_domain += [('grade_id.website_published', '=', True)]
if search:
base_partner_domain += ['|', ('name', 'ilike', search), ('website_description', 'ilike', search)]
@@ -183,17 +183,15 @@ class WebsiteCrmPartnerAssign(WebsitePartnerPage):
if not country and not country_all:
country_code = request.session['geoip'].get('country_code')
if country_code:
- country_ids = country_obj.search(request.cr, request.uid, [('code', '=', country_code)], context=request.context)
+ country_ids = country_obj.search([('code', '=', country_code)])
if country_ids:
- country = country_obj.browse(request.cr, request.uid, country_ids[0], context=request.context)
+ country = country_obj.browse(country_ids[0])
if country:
grade_domain += [('country_id', '=', country.id)]
- grades = partner_obj.read_group(
- request.cr, SUPERUSER_ID, grade_domain, ["id", "grade_id"],
- groupby="grade_id", orderby="grade_id DESC", context=request.context)
- grades_partners = partner_obj.search(
- request.cr, SUPERUSER_ID, grade_domain,
- context=request.context, count=True)
+ grades = partner_obj.sudo().read_group(
+ grade_domain, ["id", "grade_id"],
+ groupby="grade_id", orderby="grade_id DESC")
+ grades_partners = partner_obj.sudo().search_count(grade_domain)
# flag active grade
for grade_dict in grades:
grade_dict['active'] = grade and grade_dict['grade_id'][0] == grade.id
@@ -207,12 +205,10 @@ class WebsiteCrmPartnerAssign(WebsitePartnerPage):
country_domain = list(base_partner_domain)
if grade:
country_domain += [('grade_id', '=', grade.id)]
- countries = partner_obj.read_group(
- request.cr, SUPERUSER_ID, country_domain, ["id", "country_id"],
- groupby="country_id", orderby="country_id", context=request.context)
- countries_partners = partner_obj.search(
- request.cr, SUPERUSER_ID, country_domain,
- context=request.context, count=True)
+ countries = partner_obj.sudo().read_group(
+ country_domain, ["id", "country_id"],
+ groupby="country_id", orderby="country_id")
+ countries_partners = partner_obj.sudo().search_count(country_domain)
# flag active country
for country_dict in countries:
country_dict['active'] = country and country_dict['country_id'] and country_dict['country_id'][0] == country.id
@@ -243,19 +239,15 @@ class WebsiteCrmPartnerAssign(WebsitePartnerPage):
if country_all:
url_args['country_all'] = True
- partner_count = partner_obj.search_count(
- request.cr, SUPERUSER_ID, base_partner_domain,
- context=request.context)
+ partner_count = partner_obj.sudo().search_count(base_partner_domain)
pager = request.website.pager(
url=url, total=partner_count, page=page, step=self._references_per_page, scope=7,
url_args=url_args)
# search partners matching current search parameters
- partner_ids = partner_obj.search(
- request.cr, SUPERUSER_ID, base_partner_domain,
- order="grade_id DESC, display_name ASC",
- context=request.context) # todo in trunk: order="grade_id DESC, implemented_count DESC", offset=pager['offset'], limit=self._references_per_page
- partners = partner_obj.browse(request.cr, SUPERUSER_ID, partner_ids, request.context)
+ partner_ids = partner_obj.sudo().search(
+ base_partner_domain, order="grade_id DESC, display_name ASC") # todo in trunk: order="grade_id DESC, implemented_count DESC", offset=pager['offset'], limit=self._references_per_page
+ partners = partner_ids.sudo()
# remove me in trunk
partners = sorted(partners, key=lambda x: (x.grade_id.sequence if x.grade_id else 0, len([i for i in x.implemented_partner_ids if i.website_published])), reverse=True)
partners = partners[pager['offset']:pager['offset'] + self._references_per_page]
@@ -276,24 +268,21 @@ class WebsiteCrmPartnerAssign(WebsitePartnerPage):
return request.render("website_crm_partner_assign.index", values, status=partners and 200 or 404)
- # Do not use semantic controller due to SUPERUSER_ID
+ # Do not use semantic controller due to sudo()
@http.route(['/partners/<partner_id>'], type='http', auth="public", website=True)
def partners_detail(self, partner_id, **post):
_, partner_id = unslug(partner_id)
current_grade, current_country = None, None
grade_id = post.get('grade_id')
country_id = post.get('country_id')
+ print post
if grade_id:
- grade_ids = request.registry['res.partner.grade'].exists(request.cr, request.uid, int(grade_id), context=request.context)
- if grade_ids:
- current_grade = request.registry['res.partner.grade'].browse(request.cr, request.uid, grade_ids[0], context=request.context)
+ current_grade = request.env['res.partner.grade'].browse(int(grade_id)).exists()
if country_id:
- country_ids = request.registry['res.country'].exists(request.cr, request.uid, int(country_id), context=request.context)
- if country_ids:
- current_country = request.registry['res.country'].browse(request.cr, request.uid, country_ids[0], context=request.context)
+ current_country = request.env['res.country'].browse(int(country_id)).exists()
if partner_id:
- partner = request.registry['res.partner'].browse(request.cr, SUPERUSER_ID, partner_id, context=request.context)
- is_website_publisher = request.registry['res.users'].has_group(request.cr, request.uid, 'base.group_website_publisher')
+ partner = request.env['res.partner'].sudo().browse(partner_id)
+ is_website_publisher = request.env['res.users'].has_group('base.group_website_publisher')
if partner.exists() and (partner.website_published or is_website_publisher):
values = {
'main_object': partner,
diff --git a/addons/website_crm_partner_assign/data/crm_lead_demo.xml b/addons/website_crm_partner_assign/data/crm_lead_demo.xml
index 1941168bc2f..a9209a2954e 100644
--- a/addons/website_crm_partner_assign/data/crm_lead_demo.xml
+++ b/addons/website_crm_partner_assign/data/crm_lead_demo.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<openerp>
+<odoo>
<data noupdate="1">
<!-- Demo Leads -->
@@ -30,4 +30,4 @@
<field name="source_id" ref="utm.utm_source_newsletter"/>
</record>
</data>
-</openerp> \ No newline at end of file
+</odoo> \ No newline at end of file
diff --git a/addons/website_crm_partner_assign/data/crm_partner_assign_data.xml b/addons/website_crm_partner_assign/data/crm_partner_assign_data.xml
index 3fded7b0cb9..3cd3f88282e 100644
--- a/addons/website_crm_partner_assign/data/crm_partner_assign_data.xml
+++ b/addons/website_crm_partner_assign/data/crm_partner_assign_data.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" ?>
-<openerp>
- <data>
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
<record model="crm.lead.tag" id="tag_portal_lead_partner_unavailable">
<field name="name">No more partner available</field>
<field name="color">3</field>
@@ -45,5 +44,4 @@ PS: It looks like you do not have an account manager assigned to you, please con
% endif
]]></field>
</record>
- </data>
-</openerp>
+</odoo>
diff --git a/addons/website_crm_partner_assign/data/portal_data.xml b/addons/website_crm_partner_assign/data/portal_data.xml
index 7c756609676..63fccf0f735 100644
--- a/addons/website_crm_partner_assign/data/portal_data.xml
+++ b/addons/website_crm_partner_assign/data/portal_data.xml
@@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
-<openerp>
- <data>
-
+<odoo>
<!-- Partner and address -->
<record id="res_partner_grade_access" model="ir.model.access">
- <field name="name">openerp.portal.res.partner.grade</field>
+ <field name="name">odoo.portal.res.partner.grade</field>
<field name="model_id" ref="website_crm_partner_assign.model_res_partner_grade"/>
<field name="group_id" ref="base.group_portal"/>
<field name="perm_read" eval="1"/>
@@ -15,13 +13,13 @@
<!-- CRM Lead portal -->
<record id="assigned_lead_portal_rule_1" model="ir.rule">
- <field name="name">openerp.portal.crm.lead</field>
+ <field name="name">odoo.portal.crm.lead</field>
<field name="model_id" ref="crm.model_crm_lead"/>
<field name="groups" eval="[(6,0,[ref('base.group_portal')])]"/>
<field name="domain_force">[('partner_assigned_id','child_of',user.commercial_partner_id.id)]</field>
</record>
<record id="lead_portal_access" model="ir.model.access">
- <field name="name">openerp.portal.crm.lead</field>
+ <field name="name">odoo.portal.crm.lead</field>
<field name="model_id" ref="crm.model_crm_lead"/>
<field name="group_id" ref="base.group_portal"/>
<field name="perm_read" eval="1"/>
@@ -29,5 +27,4 @@
<field name="perm_write" eval="1"/>
<field name="perm_unlink" eval="0"/>
</record>
- </data>
-</openerp>
+</odoo>
diff --git a/addons/website_crm_partner_assign/data/res_partner_demo.xml b/addons/website_crm_partner_assign/data/res_partner_demo.xml
index 22432738b5b..bcd499ba4a8 100644
--- a/addons/website_crm_partner_assign/data/res_partner_demo.xml
+++ b/addons/website_crm_partner_assign/data/res_partner_demo.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<openerp>
- <data>
+<odoo>
<record id="res_partner_grade_platinium" model="res.partner.grade">
<field name="name">Platinum</field>
<field name="sequence">4</field>
@@ -105,5 +104,4 @@
<record model="res.partner" id="base.res_partner_12">
<field name="assigned_partner_id" eval="ref('base.res_partner_12')"/>
</record>
- </data>
-</openerp>
+</odoo>
diff --git a/addons/website_crm_partner_assign/data/res_partner_grade_demo.xml b/addons/website_crm_partner_assign/data/res_partner_grade_demo.xml
index ffe4bb6325f..c3515840099 100644
--- a/addons/website_crm_partner_assign/data/res_partner_grade_demo.xml
+++ b/addons/website_crm_partner_assign/data/res_partner_grade_demo.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<openerp>
+<odoo>
<data noupdate="1">
<record id="website_crm_partner_assign.res_partner_grade_platinium" model="res.partner.grade">
<field name="website_published" eval="True" />
@@ -18,4 +18,4 @@
<field name="partner_weight">10</field>
</record>
</data>
-</openerp>
+</odoo>
diff --git a/addons/website_crm_partner_assign/models/crm_lead.py b/addons/website_crm_partner_assign/models/crm_lead.py
index a4d71b5d57d..7357e5912ab 100644
--- a/addons/website_crm_partner_assign/models/crm_lead.py
+++ b/addons/website_crm_partner_assign/models/crm_lead.py
@@ -3,94 +3,93 @@
import random
-from openerp import SUPERUSER_ID
-from openerp.addons.base_geolocalize.models.res_partner import geo_find, geo_query_address
-from openerp.osv import osv
-from openerp.osv import fields
-from openerp.tools.translate import _
+from odoo.addons.base_geolocalize.models.res_partner import geo_find, geo_query_address
+from odoo import api, fields, models, _
-class crm_lead(osv.osv):
+class CrmLead(models.Model):
_inherit = "crm.lead"
- _columns = {
- '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',track_visibility='onchange' , help="Partner this case has been forwarded/assigned to.", select=True),
- 'partner_declined_ids': fields.many2many(
- 'res.partner',
- 'crm_lead_declined_partner',
- 'lead_id',
- 'partner_id',
- string='Partner not interested'),
- 'date_assign': fields.date('Assignation Date', help="Last date this case was forwarded/assigned to a partner"),
- }
-
- def _merge_data(self, cr, uid, ids, fields, context=None):
+ 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', track_visibility='onchange', help="Partner this case has been forwarded/assigned to.", select=True)
+ partner_declined_ids = fields.Many2many(
+ 'res.partner',
+ 'crm_lead_declined_partner',
+ 'lead_id',
+ 'partner_id',
+ string='Partner not interested')
+ date_assign = fields.Date('Assignation Date', help="Last date this case was forwarded/assigned to a partner")
+
+ def _merge_data(self, oldest, fields):
fields += ['partner_latitude', 'partner_longitude', 'partner_assigned_id', 'date_assign']
- return super(crm_lead, self)._merge_data(cr, uid, ids, fields, context=context)
+ return super(CrmLead, self)._merge_data(oldest, fields)
- def onchange_assign_id(self, cr, uid, ids, partner_assigned_id, context=None):
+ @api.onchange("partner_assigned_id")
+ def onchange_assign_id(self):
"""This function updates the "assignation date" automatically, when manually assign a partner in the geo assign tab
"""
-
- if not partner_assigned_id:
- return {'value':{'date_assign': False}}
+ partner_assigned = self.partner_assigned_id
+ if not partner_assigned:
+ self.date_assign = False
else:
- partners = self.pool.get('res.partner').browse(cr, uid, [partner_assigned_id], context=context)
- user_id = partners[0] and partners[0].user_id.id or False
- return {'value':
- {'date_assign': fields.date.context_today(self,cr,uid,context=context),
- 'user_id' : user_id}
- }
-
- def assign_salesman_of_assigned_partner(self, cr, uid, ids, context=None):
+ self.write({
+ 'date_assign': fields.Date.context_today(self),
+ 'user_id': partner_assigned.user_id,
+ })
+
+ @api.multi
+ def assign_salesman_of_assigned_partner(self):
salesmans_leads = {}
- for lead in self.browse(cr, uid, ids, context=context):
- if (lead.stage_id.probability > 0 and lead.stage_id.probability < 100) or lead.stage_id.sequence == 1:
- if lead.partner_assigned_id and lead.partner_assigned_id.user_id and lead.partner_assigned_id.user_id != lead.user_id:
- salesman_id = lead.partner_assigned_id.user_id.id
+ for lead in self:
+ if (lead.stage_id.probability > 0 and lead.stage_id.probability < 100) or lead.stage_id.sequence == 1:
+ partner_assigned_related_user = self.env['res.users'].search([('partner_id', '=', lead.partner_assigned_id.id)], limit=1)
+ if lead.partner_assigned_id and partner_assigned_related_user and partner_assigned_related_user != lead.user_id:
+ salesman_id = partner_assigned_related_user.id
if salesmans_leads.get(salesman_id):
salesmans_leads[salesman_id].append(lead.id)
else:
- salesmans_leads[salesman_id] = [lead.id]
+ salesmans_leads[salesman_id] = lead.ids
for salesman_id, lead_ids in salesmans_leads.items():
- salesteam_id = self.on_change_user(cr, uid, lead_ids, salesman_id, context=None)['value'].get('team_id')
- self.write(cr, uid, lead_ids, {'user_id': salesman_id, 'team_id': salesteam_id}, context=context)
-
- def action_assign_partner(self, cr, uid, ids, context=None):
- return self.assign_partner(cr, uid, ids, partner_id=False, context=context)
-
- def assign_partner(self, cr, uid, ids, partner_id=False, context=None):
- partner_ids = {}
+ leads = self.browse(lead_ids)
+ leads.write({'user_id': salesman_id})
+ for lead in leads:
+ lead._onchange_user_id()
+
+ @api.multi
+ def action_assign_partner(self):
+ return self.assign_partner(partner_id=False)
+
+ @api.multi
+ def assign_partner(self, partner_id=False):
+ partner_dict = {}
res = False
- res_partner = self.pool.get('res.partner')
if not partner_id:
- partner_ids = self.search_geo_partner(cr, uid, ids, context=context)
- for lead in self.browse(cr, uid, ids, context=context):
+ partner_dict = self.search_geo_partner()
+ for lead in self:
if not partner_id:
- partner_id = partner_ids.get(lead.id, False)
+ partner_id = partner_dict.get(lead.id, False)
if not partner_id:
- tag_to_add = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'website_crm_partner_assign', 'tag_portal_lead_partner_unavailable')[1]
- self.write(cr, uid, [lead.id], {'tag_ids': [(4, tag_to_add, False)]}, context=context)
+ tag_to_add = self.env.ref('website_crm_partner_assign.tag_portal_lead_partner_unavailable', False)
+ lead.write({'tag_ids': [(4, tag_to_add.id, False)]})
continue
- self.assign_geo_localize(cr, uid, [lead.id], lead.partner_latitude, lead.partner_longitude, context=context)
- partner = res_partner.browse(cr, uid, partner_id, context=context)
+ lead.assign_geo_localize(lead.partner_latitude, lead.partner_longitude,)
+ partner = self.env['res.partner'].browse(partner_id)
if partner.user_id:
- salesteam_id = partner.team_id and partner.team_id.id or False
- self.allocate_salesman(cr, uid, [lead.id], [partner.user_id.id], team_id=salesteam_id, context=context)
- values = {'date_assign': fields.date.context_today(self,cr,uid,context=context), 'partner_assigned_id': partner_id}
- self.write(cr, uid, [lead.id], values, context=context)
+ lead.allocate_salesman(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)
return res
- def assign_geo_localize(self, cr, uid, ids, latitude=False, longitude=False, context=None):
+ @api.multi
+ def assign_geo_localize(self, latitude=False, longitude=False):
if latitude and longitude:
- self.write(cr, uid, ids, {
+ self.write({
'partner_latitude': latitude,
'partner_longitude': longitude
- }, context=context)
+ })
return True
# Don't pass context to browse()! We need country name in english below
- for lead in self.browse(cr, uid, ids):
+ for lead in self:
if lead.partner_latitude and lead.partner_longitude:
continue
if lead.country_id:
@@ -100,17 +99,18 @@ class crm_lead(osv.osv):
state=lead.state_id.name,
country=lead.country_id.name))
if result:
- self.write(cr, uid, [lead.id], {
+ lead.write({
'partner_latitude': result[0],
'partner_longitude': result[1]
- }, context=context)
+ })
return True
- def search_geo_partner(self, cr, uid, ids, context=None):
- res_partner = self.pool.get('res.partner')
+ @api.multi
+ def search_geo_partner(self):
+ Partner = self.env['res.partner']
res_partner_ids = {}
- self.assign_geo_localize(cr, uid, ids, context=context)
- for lead in self.browse(cr, uid, ids, context=context):
+ self.assign_geo_localize()
+ for lead in self:
partner_ids = []
if not lead.country_id:
continue
@@ -118,47 +118,47 @@ class crm_lead(osv.osv):
longitude = lead.partner_longitude
if latitude and longitude:
# 1. first way: in the same country, small area
- partner_ids = res_partner.search(cr, uid, [
+ partner_ids = Partner.search([
('partner_weight', '>', 0),
('partner_latitude', '>', latitude - 2), ('partner_latitude', '<', latitude + 2),
('partner_longitude', '>', longitude - 1.5), ('partner_longitude', '<', longitude + 1.5),
('country_id', '=', lead.country_id.id),
('id', 'not in', lead.partner_declined_ids.mapped('id')),
- ], context=context)
+ ])
# 2. second way: in the same country, big area
if not partner_ids:
- partner_ids = res_partner.search(cr, uid, [
+ partner_ids = Partner.search([
('partner_weight', '>', 0),
('partner_latitude', '>', latitude - 4), ('partner_latitude', '<', latitude + 4),
- ('partner_longitude', '>', longitude - 3), ('partner_longitude', '<' , longitude + 3),
+ ('partner_longitude', '>', longitude - 3), ('partner_longitude', '<', longitude + 3),
('country_id', '=', lead.country_id.id),
('id', 'not in', lead.partner_declined_ids.mapped('id')),
- ], context=context)
+ ])
# 3. third way: in the same country, extra large area
if not partner_ids:
- partner_ids = res_partner.search(cr, uid, [
- ('partner_weight','>', 0),
- ('partner_latitude','>', latitude - 8), ('partner_latitude','<', latitude + 8),
- ('partner_longitude','>', longitude - 8), ('partner_longitude','<', longitude + 8),
+ partner_ids = Partner.search([
+ ('partner_weight', '>', 0),
+ ('partner_latitude', '>', latitude - 8), ('partner_latitude', '<', latitude + 8),
+ ('partner_longitude', '>', longitude - 8), ('partner_longitude', '<', longitude + 8),
('country_id', '=', lead.country_id.id),
('id', 'not in', lead.partner_declined_ids.mapped('id')),
- ], context=context)
+ ])
# 5. fifth way: anywhere in same country
if not partner_ids:
# still haven't found any, let's take all partners in the country!
- partner_ids = res_partner.search(cr, uid, [
+ partner_ids = Partner.search([
('partner_weight', '>', 0),
('country_id', '=', lead.country_id.id),
('id', 'not in', lead.partner_declined_ids.mapped('id')),
- ], context=context)
+ ])
# 6. sixth way: closest partner whatsoever, just to have at least one result
if not partner_ids:
# warning: point() type takes (longitude, latitude) as parameters in this order!
- cr.execute("""SELECT id, distance
+ self._cr.execute("""SELECT id, distance
FROM (select id, (point(partner_longitude, partner_latitude) <-> point(%s,%s)) AS distance FROM res_partner
WHERE active
AND partner_longitude is not null
@@ -167,17 +167,17 @@ class crm_lead(osv.osv):
AND id not in (select partner_id from crm_lead_declined_partner where lead_id = %s)
) AS d
ORDER BY distance LIMIT 1""", (longitude, latitude, lead.id))
- res = cr.dictfetchone()
+ res = self._cr.dictfetchone()
if res:
partner_ids.append(res['id'])
total_weight = 0
toassign = []
- for partner in res_partner.browse(cr, uid, partner_ids, context=context):
+ for partner in partner_ids:
total_weight += partner.partner_weight
- toassign.append( (partner.id, total_weight) )
+ toassign.append((partner.id, total_weight))
- random.shuffle(toassign) # avoid always giving the leads to the first ones in db natural order!
+ random.shuffle(toassign) # avoid always giving the leads to the first ones in db natural order!
nearest_weight = random.randint(0, total_weight)
for partner_id, weight in toassign:
if nearest_weight <= weight:
@@ -185,61 +185,56 @@ class crm_lead(osv.osv):
break
return res_partner_ids
- def partner_interested(self, cr, uid, ids, comment=False, context=None):
- self.check_access_rights(cr, uid, 'write')
+ @api.multi
+ def partner_interested(self, comment=False):
+ self.check_access_rights('write')
message = _('<p>I am interested by this lead.</p>')
if comment:
message += '<p>%s</p>' % comment
- for active_id in map(int, ids):
- self.message_post(cr, uid, active_id, body=message, subtype="mail.mt_note", context=context)
- lead = self.browse(cr, uid, active_id, context=context)
- self.convert_opportunity(cr, SUPERUSER_ID, [lead.id], lead.partner_id and lead.partner_id.id or None, context=None)
-
- def partner_desinterested(self, cr, uid, ids, comment=False, contacted=False, context=None):
- self.check_access_rights(cr, uid, 'write')
- ids = map(int, ids)
+ for lead in self:
+ lead.message_post(body=message, subtype="mail.mt_note")
+ lead.sudo().convert_opportunity(lead.partner_id.id)
+
+ @api.multi
+ def partner_desinterested(self, comment=False, contacted=False):
+ self.check_access_rights('write')
if contacted:
message = _('<p>I am not interested by this lead. I contacted the lead.</p>')
else:
message = _('<p>I am not interested by this lead. I have not contacted the lead.</p>')
- user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
- partner_ids = self.pool.get('res.partner').search(
- cr, SUPERUSER_ID,
- [('id', 'child_of', user.partner_id.commercial_partner_id.id)],
- context=context)
- self.message_unsubscribe(cr, SUPERUSER_ID, ids, partner_ids, context=None)
+ partner_ids = self.env['res.partner'].search(
+ [('id', 'child_of', self.env.uid.partner_id.commercial_partner_id.id)])
+ self.sudo().message_unsubscribe(partner_ids)
if comment:
message += '<p>%s</p>' % comment
- for active_id in ids:
- self.message_post(cr, uid, active_id, body=message, subtype="mail.mt_note", context=context)
+ self.message_post(body=message, subtype="mail.mt_note")
values = {
'partner_assigned_id': False
}
if partner_ids:
values['partner_declined_ids'] = map(lambda p: (4, p, 0), partner_ids)
- self.write(cr, SUPERUSER_ID, ids, values, context=context)
+ self.write(values)
- def update_lead_portal(self, cr, uid, ids, values, context=None):
- self.check_access_rights(cr, uid, 'write')
- for active_id in map(int, ids):
- lead = self.browse(cr, uid, active_id, context=context)
+ @api.multi
+ def update_lead_portal(self, values):
+ # YTI FIXME : Use the standard workflow defined in crm_activity
+ self.check_access_rights('write')
+ for lead in self:
if values['date_action'] == '':
values['date_action'] = False
if lead.next_activity_id.id != values['activity_id'] or lead.title_action != values['title_action']\
or lead.date_action != values['date_action']:
- activity = self.pool.get('crm.activity').browse(cr, SUPERUSER_ID, [lead.next_activity_id.id], context=context)
+ activity = lead.sudo().next_activity_id
body_html = "<div><b>%(title)s</b>: %(next_activity)s</div>%(description)s" % {
'title': _('Activity Done'),
'next_activity': activity.name,
'description': lead.title_action and '<p><em>%s</em></p>' % lead.title_action or '',
}
- self.message_post(
- cr, uid, active_id,
+ lead.message_post(
body=body_html,
subject=lead.title_action,
- subtype="mail.mt_note",
- context=context)
- self.write(cr, uid, active_id, {
+ subtype="mail.mt_note")
+ lead.write({
'planned_revenue': values['planned_revenue'],
'probability': values['probability'],
'next_activity_id': values['activity_id'],
@@ -247,4 +242,4 @@ class crm_lead(osv.osv):
'date_action': values['date_action'] if values['date_action'] else False,
'priority': values['priority'],
'date_deadline': values['date_deadline'] if values['date_deadline'] else False,
- }, context=context)
+ })
diff --git a/addons/website_crm_partner_assign/models/res_partner.py b/addons/website_crm_partner_assign/models/res_partner.py
index a29bd21914d..99a8a5533f3 100644
--- a/addons/website_crm_partner_assign/models/res_partner.py
+++ b/addons/website_crm_partner_assign/models/res_partner.py
@@ -1,73 +1,53 @@
# -*- coding: utf-8 -*-
-from openerp.osv import osv
-from openerp.addons.website.models.website import slug
+from odoo import api, fields, models
+from odoo.addons.website.models.website import slug
-class res_partner_grade(osv.osv):
+class ResPartnerGrade(models.Model):
_name = 'res.partner.grade'
- _inherit = ['res.partner.grade', 'website.published.mixin']
-
- _defaults = {
- 'website_published': True,
- }
-
- def _website_url(self, cr, uid, ids, field_name, arg, context=None):
- res = super(res_partner_grade, self)._website_url(cr, uid, ids, field_name, arg, context=context)
- for grade in self.browse(cr, uid, ids, context=context):
+ _inherit = ['website.published.mixin']
+
+ website_published = fields.Boolean(default=True)
+ sequence = fields.Integer('Sequence')
+ active = fields.Boolean('Active', default=lambda *args: 1)
+ name = fields.Char('Level Name')
+ partner_weight = fields.Integer('Level Weight', default=1,
+ help="Gives the probability to assign a lead to this partner. (0 means no assignation.)")
+
+ @api.multi
+ def _website_url(self, field_name, arg):
+ res = super(ResPartnerGrade, self)._website_url(field_name, arg)
+ for grade in self:
res[grade.id] = "/partners/grade/%s" % (slug(grade))
return res
-class res_partner_grade(osv.osv):
- _order = 'sequence'
- _name = 'res.partner.grade'
- _columns = {
- 'sequence': fields.integer('Sequence'),
- 'active': fields.boolean('Active'),
- 'name': fields.char('Level Name'),
- 'partner_weight': fields.integer('Level Weight',
- help="Gives the probability to assign a lead to this partner. (0 means no assignation.)"),
- }
- _defaults = {
- 'active': lambda *args: 1,
- 'partner_weight':1
- }
-
-class res_partner_activation(osv.osv):
+class ResPartnerActivation(models.Model):
_name = 'res.partner.activation'
_order = 'sequence'
- _columns = {
- 'sequence' : fields.integer('Sequence'),
- 'name' : fields.char('Name', required=True),
- }
-
+ sequence = fields.Integer('Sequence')
+ name = fields.Char('Name', required=True)
-class res_partner(osv.osv):
+class ResPartner(models.Model):
_inherit = "res.partner"
- _columns = {
- 'partner_weight': fields.integer('Level Weight',
- help="Gives the probability to assign a lead to this partner. (0 means no assignation.)"),
- 'grade_id': fields.many2one('res.partner.grade', 'Level'),
- 'activation' : fields.many2one('res.partner.activation', 'Activation', select=1),
- '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',
- ),
- }
- _defaults = {
- 'partner_weight': lambda *args: 0
- }
-
- def onchange_grade_id(self, cr, uid, ids, grade_id, context=None):
- res = {'value' :{'partner_weight':0}}
- if grade_id:
- partner_grade = self.pool.get('res.partner.grade').browse(cr, uid, grade_id)
- res['value']['partner_weight'] = partner_grade.partner_weight
- return res
+
+ partner_weight = fields.Integer('Level Weight', default=lambda *args: 0,
+ help="Gives the probability to assign a lead to this partner. (0 means no assignation.)")
+ grade_id = fields.Many2one('res.partner.grade', 'Level')
+ activation = fields.Many2one('res.partner.activation', 'Activation', select=1)
+ 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',
+ )
+
+ @api.onchange('grade_id')
+ def _onchange_grade_id(self):
+ grade = self.grade_id
+ self.partner_weight = grade.partner_weight if grade else 0
diff --git a/addons/website_crm_partner_assign/report/crm_lead_report.py b/addons/website_crm_partner_assign/report/crm_lead_report.py
index cccd0524f09..49831ba147f 100644
--- a/addons/website_crm_partner_assign/report/crm_lead_report.py
+++ b/addons/website_crm_partner_assign/report/crm_lead_report.py
@@ -1,52 +1,52 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
-from openerp.osv import fields, osv
-from openerp import tools
-from openerp.addons.crm.models import crm_stage
+from odoo import api, fields, models
+from odoo import tools
+from odoo.addons.crm.models import crm_stage
-class crm_lead_report_assign(osv.osv):
+class CrmLeadReportAssign(models.Model):
""" CRM Lead Report """
_name = "crm.lead.report.assign"
_auto = False
_description = "CRM Lead Report"
- _columns = {
- 'partner_assigned_id':fields.many2one('res.partner', 'Partner', readonly=True),
- 'grade_id':fields.many2one('res.partner.grade', 'Grade', readonly=True),
- 'user_id':fields.many2one('res.users', 'User', readonly=True),
- 'country_id':fields.many2one('res.country', 'Country', readonly=True),
- 'team_id':fields.many2one('crm.team', 'Sales Team', oldname='section_id', readonly=True),
- 'company_id': fields.many2one('res.company', 'Company', readonly=True),
- 'date_assign': fields.date('Assign Date', readonly=True),
- 'create_date': fields.datetime('Create Date', readonly=True),
- 'delay_open': fields.float('Delay to Assign',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to open the case"),
- 'delay_close': fields.float('Delay to Close',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
- 'delay_expected': fields.float('Overpassed Deadline',digits=(16,2),readonly=True, group_operator="avg"),
- 'probability': fields.float('Avg Probability',digits=(16,2),readonly=True, group_operator="avg"),
- 'probability_max': fields.float('Max Probability',digits=(16,2),readonly=True, group_operator="max"),
- 'planned_revenue': fields.float('Planned Revenue',digits=(16,2),readonly=True),
- 'probable_revenue': fields.float('Probable Revenue', digits=(16,2),readonly=True),
- 'tag_ids': fields.many2many('crm.lead.tag', 'crm_lead_tag_rel', 'lead_id', 'tag_id', 'Tags'),
- 'partner_id': fields.many2one('res.partner', 'Customer' , readonly=True),
- 'opening_date': fields.datetime('Opening Date', readonly=True),
- 'date_closed': fields.datetime('Close Date', readonly=True),
- 'nbr': fields.integer('# of Cases', readonly=True), # TDE FIXME master: rename into nbr_cases
- 'company_id': fields.many2one('res.company', 'Company', readonly=True),
- 'priority': fields.selection(crm_stage.AVAILABLE_PRIORITIES, 'Priority'),
- 'type':fields.selection([
- ('lead','Lead'),
- ('opportunity','Opportunity')
- ],'Type', help="Type is used to separate Leads and Opportunities"),
- }
- def init(self, cr):
+ partner_assigned_id = fields.Many2one('res.partner', 'Partner', readonly=True)
+ grade_id = fields.Many2one('res.partner.grade', 'Grade', readonly=True)
+ user_id = fields.Many2one('res.users', 'User', readonly=True)
+ country_id = fields.Many2one('res.country', 'Country', readonly=True)
+ team_id = fields.Many2one('crm.team', 'Sales Team', oldname='section_id', readonly=True)
+ company_id = fields.Many2one('res.company', 'Company', readonly=True)
+ date_assign = fields.Date('Assign Date', readonly=True)
+ create_date = fields.Datetime('Create Date', readonly=True)
+ delay_open = fields.Float('Delay to Assign', digits=(16, 2), readonly=True, group_operator="avg", help="Number of Days to open the case")
+ delay_close = fields.Float('Delay to Close', digits=(16, 2), readonly=True, group_operator="avg", help="Number of Days to close the case")
+ delay_expected = fields.Float('Overpassed Deadline', digits=(16, 2), readonly=True, group_operator="avg")
+ probability = fields.Float('Avg Probability', digits=(16, 2), readonly=True, group_operator="avg")
+ probability_max = fields.Float('Max Probability', digits=(16, 2), readonly=True, group_operator="max")
+ planned_revenue = fields.Float('Planned Revenue', digits=(16, 2), readonly=True)
+ probable_revenue = fields.Float('Probable Revenue', digits=(16, 2), readonly=True)
+ tag_ids = fields.Many2many('crm.lead.tag', 'crm_lead_tag_rel', 'lead_id', 'tag_id', 'Tags')
+ partner_id = fields.Many2one('res.partner', 'Customer', readonly=True)
+ opening_date = fields.Datetime('Opening Date', readonly=True)
+ date_closed = fields.Datetime('Close Date', readonly=True)
+ nbr_cases = fields.Integer('# of Cases', readonly=True, oldname='nbr')
+ company_id = fields.Many2one('res.company', 'Company', readonly=True)
+ priority = fields.Selection(crm_stage.AVAILABLE_PRIORITIES, 'Priority')
+ type = fields.Selection([
+ ('lead', 'Lead'),
+ ('opportunity', 'Opportunity')
+ ], 'Type', help="Type is used to separate Leads and Opportunities")
+
+ @api.model_cr
+ def init(self):
"""
CRM Lead Report
@param cr: the current row, from the database cursor
"""
- tools.drop_view_if_exists(cr, 'crm_lead_report_assign')
- cr.execute("""
+ tools.drop_view_if_exists(self._cr, 'crm_lead_report_assign')
+ self._cr.execute("""
CREATE OR REPLACE VIEW crm_lead_report_assign AS (
SELECT
c.id,
diff --git a/addons/website_crm_partner_assign/report/crm_lead_report_view.xml b/addons/website_crm_partner_assign/report/crm_lead_report_view.xml
index 40535c64f44..7a83c2efe3c 100644
--- a/addons/website_crm_partner_assign/report/crm_lead_report_view.xml
+++ b/addons/website_crm_partner_assign/report/crm_lead_report_view.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<openerp>
+<odoo>
<data>
<!-- Opportunity tree view -->
@@ -74,4 +74,4 @@
parent="base.menu_sale_report" action="action_report_crm_opportunity_assign" sequence="20"/>
</data>
-</openerp>
+</odoo>
diff --git a/addons/website_crm_partner_assign/report/crm_partner_report.py b/addons/website_crm_partner_assign/report/crm_partner_report.py
index 6fab60d643a..dab27506e01 100644
--- a/addons/website_crm_partner_assign/report/crm_partner_report.py
+++ b/addons/website_crm_partner_assign/report/crm_partner_report.py
@@ -1,34 +1,35 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
-from openerp.osv import fields,osv
-from openerp import tools
+from odoo import api, fields, models
+from odoo import tools
-class crm_partner_report_assign(osv.osv):
+class CrmPartnerReportAssign(models.Model):
""" CRM Lead Report """
_name = "crm.partner.report.assign"
_auto = False
_description = "CRM Partner Report"
- _columns = {
- 'partner_id': fields.many2one('res.partner', 'Partner', required=False, readonly=True),
- 'grade_id':fields.many2one('res.partner.grade', 'Grade', readonly=True),
- 'activation' : fields.many2one('res.partner.activation', 'Activation', select=1),
- 'user_id':fields.many2one('res.users', 'User', readonly=True),
- 'date_review' : fields.date('Latest Partner Review'),
- 'date_partnership' : fields.date('Partnership Date'),
- 'country_id':fields.many2one('res.country', 'Country', readonly=True),
- 'team_id':fields.many2one('crm.team', 'Sales Team', oldname='section_id', readonly=True),
- 'opp': fields.integer('# of Opportunity', readonly=True), # TDE FIXME master: rename into nbr_opportunities
- 'turnover': fields.float('Turnover', readonly=True),
- 'date': fields.date('Invoice Account Date', readonly=True),
- }
- def init(self, cr):
+
+ partner_id = fields.Many2one('res.partner', 'Partner', required=False, readonly=True)
+ grade_id = fields.Many2one('res.partner.grade', 'Grade', readonly=True)
+ activation = fields.Many2one('res.partner.activation', 'Activation', select=1)
+ user_id = fields.Many2one('res.users', 'User', readonly=True)
+ date_review = fields.Date('Latest Partner Review')
+ date_partnership = fields.Date('Partnership Date')
+ country_id = fields.Many2one('res.country', 'Country', readonly=True)
+ team_id = fields.Many2one('crm.team', 'Sales Team', oldname='section_id', readonly=True)
+ nbr_opportunities = fields.Integer('# of Opportunity', readonly=True, oldname='opp')
+ turnover = fields.Float('Turnover', readonly=True)
+ date = fields.Date('Invoice Account Date', readonly=True)
+
+ @api.model_cr
+ def init(self):
"""
CRM Lead Report
@param cr: the current row, from the database cursor
"""
- tools.drop_view_if_exists(cr, 'crm_partner_report_assign')
- cr.execute("""
+ tools.drop_view_if_exists(self._cr, 'crm_partner_report_assign')
+ self._cr.execute("""
CREATE OR REPLACE VIEW crm_partner_report_assign AS (
SELECT
coalesce(i.id, p.id - 1000000000) as id,
@@ -40,7 +41,7 @@ class crm_partner_report_assign(osv.osv):
p.date_partnership,
p.user_id,
p.team_id,
- (SELECT count(id) FROM crm_lead WHERE partner_assigned_id=p.id) AS opp,
+ (SELECT count(id) FROM crm_lead WHERE partner_assigned_id=p.id) AS nbr_opportunities,
i.price_total as turnover,
i.date
FROM
@@ -49,12 +50,12 @@ class crm_partner_report_assign(osv.osv):
on (i.partner_id=p.id and i.type in ('out_invoice','out_refund') and i.state in ('open','paid'))
)""")
-class account_invoice_report(osv.osv):
+class AccountInvoiceReport(models.Model):
_inherit = 'account.invoice.report'
- def init(self, cr):
+ @api.model_cr
+ def init(self):
# ensure we re-create the crm_partner_report_assign view whenever
# the underlying account_invoice_report view is changed
- super(account_invoice_report, self).init(cr)
- self.pool['crm.partner.report.assign'].init(cr)
-
+ super(AccountInvoiceReport, self).init()
+ self.env['crm.partner.report.assign'].init()
diff --git a/addons/website_crm_partner_assign/report/crm_partner_report_view.xml b/addons/website_crm_partner_assign/report/crm_partner_report_view.xml
index 83ca4008b38..f6105e0f75b 100644
--- a/addons/website_crm_partner_assign/report/crm_partner_report_view.xml
+++ b/addons/website_crm_partner_assign/report/crm_partner_report_view.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<openerp>
- <data>
+<odoo>
<!-- Opportunity tree view -->
<record id="view_report_crm_partner_assign_filter" model="ir.ui.view">
@@ -35,7 +34,7 @@
<field name="arch" type="xml">
<graph string="Opportunities Assignment Analysis" type="pivot" stacked="True">
<field name="grade_id" type="row"/>
- <field name="opp" type="measure"/>
+ <field name="nbr_opportunities" type="measure"/>
<field name="turnover" type="measure"/>
</graph>
</field>
@@ -54,5 +53,4 @@
<menuitem name="Partnerships" id="menu_report_crm_partner_assign_tree"
parent="base.menu_sale_report" action="action_report_crm_partner_assign" sequence="25"/>
- </data>
-</openerp>
+</odoo>
diff --git a/addons/website_crm_partner_assign/security/ir.model.access.csv b/addons/website_crm_partner_assign/security/ir.model.access.csv
index 651b2aa7ac0..476522c536e 100644
--- a/addons/website_crm_partner_assign/security/ir.model.access.csv
+++ b/addons/website_crm_partner_assign/security/ir.model.access.csv
@@ -1,6 +1,6 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_ crm_lead_report_assign,crm.lead.report.assign,model_crm_lead_report_assign,sales_team.group_sale_salesman,1,1,1,0
-access_ crm_lead_report_assign_all,crm.lead.report.assign.all,model_crm_lead_report_assign,base.group_user,1,0,0,0
+access_crm_lead_report_assign,crm.lead.report.assign,model_crm_lead_report_assign,sales_team.group_sale_salesman,1,1,1,0
+access_crm_lead_report_assign_all,crm.lead.report.assign.all,model_crm_lead_report_assign,base.group_user,1,0,0,0
access_crm_partner_report,crm.partner.report.assign.all,model_crm_partner_report_assign,sales_team.group_sale_salesman,1,0,0,0
access_res_partner_grade,res.partner.grade,model_res_partner_grade,sales_team.group_sale_salesman,1,1,1,0
access_res_partner_grade_employee,res.partner.grade,model_res_partner_grade,base.group_user,1,0,0,0
@@ -8,7 +8,7 @@ access_res_partner_grade_portal,res.partner.grade,model_res_partner_grade,base.g
access_res_partner_grade_public,res.partner.grade,model_res_partner_grade,base.group_public,1,0,0,0
access_res_partner_grade_manager,res.partner.grade.manager,model_res_partner_grade,sales_team.group_sale_manager,1,1,1,1
access_res_partner_activation_user,res.partner.activation.user,model_res_partner_activation,base.group_user,1,0,0,0
-"access_partner_activation_manager","res.partner.activation.manager","model_res_partner_activation","base.group_partner_manager",1,1,1,1
+access_partner_activation_manager,res.partner.activation.manager,model_res_partner_activation,base.group_partner_manager,1,1,1,1
partner_access_crm_lead,crm.lead,crm.model_crm_lead,base.group_portal,1,1,0,0
access_res_partner_grade_invoicing_payment,res.partner.grade,model_res_partner_grade,account.group_account_invoice,1,0,0,0
access_res_partner_grade_portal,res.partner.grade,model_res_partner_grade,base.group_portal,1,0,0,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 025be1e2eed..38c3528a516 100644
--- a/addons/website_crm_partner_assign/views/crm_lead_views.xml
+++ b/addons/website_crm_partner_assign/views/crm_lead_views.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0"?>
-<openerp>
- <data>
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
<record id="view_crm_opportunity_geo_assign_form" model="ir.ui.view">
<field name="name">crm.lead.geo_assign.inherit</field>
<field name="model">crm.lead</field>
@@ -22,7 +21,7 @@
</div>
<button string="Automatic Assignation" name="action_assign_partner" type="object" class="btn-link"/>
- <field name="partner_assigned_id" on_change="onchange_assign_id(partner_assigned_id)" domain="[('grade_id','&lt;&gt;',False)]"/>
+ <field name="partner_assigned_id" domain="[('grade_id','&lt;&gt;',False)]"/>
<button string="Send Email" type="action" class="btn-link"
attrs="{'invisible':[('partner_assigned_id','=',False)]}"
name="%(crm_lead_forward_to_partner_act)d"
@@ -83,7 +82,7 @@
</div>
<button string="Automatic Assignation" name="action_assign_partner" type="object" class="btn-link"/>
- <field name="partner_assigned_id" on_change="onchange_assign_id(partner_assigned_id)" domain="[('grade_id','&lt;&gt;',False)]"/>
+ <field name="partner_assigned_id" domain="[('grade_id','&lt;&gt;',False)]"/>
<button string="Send Email" type="action" class="btn-link"
attrs="{'invisible':[('partner_assigned_id','=',False)]}"
name="%(crm_lead_forward_to_partner_act)d"
@@ -127,14 +126,14 @@
<field name="model_id" ref="model_crm_lead"/>
<field name="state">code</field>
<field name="code">
- if context.get('active_model') == 'crm.lead':
- ids = []
- if context.get('active_domain'):
- ids = self.search(cr, uid, context['active_domain'], context=context)
- elif context.get('active_ids'):
- ids = context['active_ids']
- if ids:
- self.assign_salesman_of_assigned_partner(cr, uid, ids, context=context)
+ if object.env.context.get('active_model') == 'crm.lead':
+ leads = model
+ if object.env.context.get('active_domain'):
+ leads = model.search(object.env.context['active_domain'])
+ elif object.env.context.get('active_ids'):
+ leads = model.browse(object.env.context['active_ids'])
+ if leads:
+ leads.assign_salesman_of_assigned_partner()
</field>
</record>
@@ -147,5 +146,4 @@
<field name="model">crm.lead</field>
</record>
- </data>
-</openerp>
+</odoo>
diff --git a/addons/website_crm_partner_assign/views/res_partner_views.xml b/addons/website_crm_partner_assign/views/res_partner_views.xml
index d7722a3d28c..d8fed863f69 100644
--- a/addons/website_crm_partner_assign/views/res_partner_views.xml
+++ b/addons/website_crm_partner_assign/views/res_partner_views.xml
@@ -1,11 +1,10 @@
-<?xml version="1.0"?>
-<openerp>
- <data>
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
<!--Partner Activation -->
<record model="ir.ui.view" id="res_partner_activation_form">
- <field name="name">openerp_custom.res.partner.activation.form</field>
+ <field name="name">res.partner.activation.form</field>
<field name="model">res.partner.activation</field>
<field name="arch" type="xml">
<form string="Activation">
@@ -17,7 +16,7 @@
</field>
</record>
<record model="ir.ui.view" id="res_partner_activation_tree">
- <field name="name">openerp_custom.res.partner.activation.tree</field>
+ <field name="name">res.partner.activation.tree</field>
<field name="model">res.partner.activation</field>
<field name="arch" type="xml">
<tree string="Activation">
@@ -38,22 +37,6 @@
<!--Partner Level -->
- <record model="ir.ui.view" id="partner_grade_view">
- <field name="name">res.partner.grade.website</field>
- <field name="model">res.partner.grade</field>
- <field name="inherit_id" ref="website_crm_partner_assign.view_partner_grade_form"/>
- <field name="arch" type="xml">
- <xpath expr="//div[@class='oe_title']" position="before">
- <div class="oe_button_box" name="button_box">
- <button class="oe_stat_button" name="website_publish_button"
- type="object" icon="fa-globe">
- <field name="website_published" widget="website_button"/>
- </button>
- </div>
- </xpath>
- </field>
- </record>
-
<record id="view_partner_grade_tree" model="ir.ui.view">
<field name="name">res.partner.grade.tree</field>
<field name="model">res.partner.grade</field>
@@ -70,6 +53,12 @@
<field name="arch" type="xml">
<form string="Partner Level">
<sheet string="Level">
+ <div class="oe_button_box" name="button_box">
+ <button class="oe_stat_button" name="website_publish_button"
+ type="object" icon="fa-globe">
+ <field name="website_published" widget="website_button"/>
+ </button>
+ </div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1>
@@ -151,5 +140,4 @@
</field>
</record>
- </data>
-</openerp>
+</odoo>
diff --git a/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml b/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml
index abe57c8abd1..30bb61b5fb0 100644
--- a/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml
+++ b/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<openerp>
-<data>
+<odoo>
<!-- Layout add nav and footer -->
<template id="footer_custom" inherit_id="website.footer_default" name="Footer Partners Link">
@@ -802,5 +801,4 @@
</t>
</template>
-</data>
-</openerp>
+</odoo>
diff --git a/addons/website_crm_partner_assign/wizard/crm_forward_to_partner.py b/addons/website_crm_partner_assign/wizard/crm_forward_to_partner.py
index 2cdd51aa1d0..a3e17583e6a 100644
--- a/addons/website_crm_partner_assign/wizard/crm_forward_to_partner.py
+++ b/addons/website_crm_partner_assign/wizard/crm_forward_to_partner.py
@@ -1,16 +1,16 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
-from openerp.osv import fields, osv
-from openerp.tools.translate import _
-from openerp.exceptions import UserError
+from odoo import api, fields, models, _
+from odoo.exceptions import UserError
-class crm_lead_forward_to_partner(osv.TransientModel):
+class CrmLeadForwardToPartner(models.TransientModel):
""" Forward info history to partners. """
_name = 'crm.lead.forward.to.partner'
- def _convert_to_assignation_line(self, cr, uid, lead, partner, context=None):
+ @api.model
+ def _convert_to_assignation_line(self, lead, partner):
lead_location = []
partner_location = []
if lead.country_id:
@@ -26,66 +26,54 @@ class crm_lead_forward_to_partner(osv.TransientModel):
'lead_location': ", ".join(lead_location),
'partner_assigned_id': partner and partner.id or False,
'partner_location': ", ".join(partner_location),
- 'lead_link': self.get_lead_portal_url(cr, uid, lead.id, lead.type, context=context),
+ 'lead_link': self.get_lead_portal_url(lead.id, lead.type),
}
- def default_get(self, cr, uid, fields, context=None):
- if context is None:
- context = {}
- lead_obj = self.pool.get('crm.lead')
- email_template_obj = self.pool.get('mail.template')
- try:
- template_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'website_crm_partner_assign', 'email_template_lead_forward_mail')[1]
- except ValueError:
- template_id = False
- res = super(crm_lead_forward_to_partner, self).default_get(cr, uid, fields, context=context)
- active_ids = context.get('active_ids')
- default_composition_mode = context.get('default_composition_mode')
+ @api.model
+ def default_get(self, fields):
+ template = self.env.ref('website_crm_partner_assign.email_template_lead_forward_mail', False)
+
+ res = super(CrmLeadForwardToPartner, self).default_get(fields)
+ active_ids = self.env.context.get('active_ids')
+ default_composition_mode = self.env.context.get('default_composition_mode')
res['assignation_lines'] = []
- if template_id:
- res['body'] = email_template_obj.get_email_template(cr, uid, template_id, 0).body_html
+ if template:
+ res['body'] = template.body_html
if active_ids:
- lead_ids = lead_obj.browse(cr, uid, active_ids, context=context)
+ leads = self.env['crm.lead'].browse(active_ids)
if default_composition_mode == 'mass_mail':
- partner_assigned_ids = lead_obj.search_geo_partner(cr, uid, active_ids, context=context)
+ partner_assigned_dict = leads.search_geo_partner()
else:
- partner_assigned_ids = dict((lead.id, lead.partner_assigned_id and lead.partner_assigned_id.id or False) for lead in lead_ids)
- res['partner_id'] = lead_ids[0].partner_assigned_id.id
- for lead in lead_ids:
- partner_id = partner_assigned_ids.get(lead.id) or False
- partner = False
- if partner_id:
- partner = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context)
- res['assignation_lines'].append((0, 0, self._convert_to_assignation_line(cr, uid, lead, partner)))
+ partner_assigned_dict = {lead.id: lead.partner_assigned_id.id for lead in leads}
+ res['partner_id'] = leads[0].partner_assigned_id.id
+ for lead in leads:
+ partner_id = partner_assigned_dict.get(lead.id) or False
+ partner = self.env['res.partner'].browse(partner_id)
+ res['assignation_lines'].append((0, 0, self._convert_to_assignation_line(lead, partner)))
return res
- def action_forward(self, cr, uid, ids, context=None):
- lead_obj = self.pool.get('crm.lead')
- record = self.browse(cr, uid, ids[0], context=context)
- email_template_obj = self.pool.get('mail.template')
- try:
- template_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'website_crm_partner_assign', 'email_template_lead_forward_mail')[1]
- except ValueError:
+ @api.multi
+ def action_forward(self):
+ self.ensure_one()
+ template = self.env.ref('website_crm_partner_assign.email_template_lead_forward_mail', False)
+ if not template:
raise UserError(_('The Forward Email Template is not in the database'))
- try:
- portal_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base', 'group_portal')[1]
- except ValueError:
- pass
+ portal_group = self.env.ref('base.group_portal')
- local_context = context.copy()
- if not (record.forward_type == 'single'):
+ local_context = self.env.context.copy()
+ if not (self.forward_type == 'single'):
no_email = set()
- for lead in record.assignation_lines:
+ for lead in self.assignation_lines:
if lead.partner_assigned_id and not lead.partner_assigned_id.email:
no_email.add(lead.partner_assigned_id.name)
if no_email:
raise UserError(_('Set an email address for the partner(s): %s') % ", ".join(no_email))
- if record.forward_type == 'single' and not record.partner_id.email:
- raise UserError(_('Set an email address for the partner %s') % record.partner_id.name)
+ if self.forward_type == 'single' and not self.partner_id.email:
+ raise UserError(_('Set an email address for the partner %s') % self.partner_id.name)
partners_leads = {}
- for lead in record.assignation_lines:
- partner = record.forward_type == 'single' and record.partner_id or lead.partner_assigned_id
+ for lead in self.assignation_lines:
+ partner = self.forward_type == 'single' and self.partner_id or lead.partner_assigned_id
lead_details = {
'lead_link': lead.lead_link,
'lead_id': lead.lead_id,
@@ -99,80 +87,77 @@ class crm_lead_forward_to_partner(osv.TransientModel):
for partner_id, partner_leads in partners_leads.items():
in_portal = False
- if portal_id:
- for contact in (partner.child_ids or [partner]):
- if contact.user_ids:
- in_portal = portal_id in [g.id for g in contact.user_ids[0].groups_id]
+ if portal_group:
+ for contact in (partner.child_ids or partner).filtered(lambda contact: contact.user_ids):
+ in_portal = portal_group.id in [g.id for g in contact.user_ids[0].groups_id]
local_context['partner_id'] = partner_leads['partner']
local_context['partner_leads'] = partner_leads['leads']
local_context['partner_in_portal'] = in_portal
- email_template_obj.send_mail(cr, uid, template_id, ids[0], context=local_context)
- lead_ids = [lead['lead_id'].id for lead in partner_leads['leads']]
+ template.with_context(local_context).send_mail(self.id)
+ leads = self.env['crm.lead']
+ for lead_data in partner_leads['leads']:
+ leads |= lead_data['lead_id']
values = {'partner_assigned_id': partner_id, 'user_id': partner_leads['partner'].user_id.id}
- lead_obj.write(cr, uid, lead_ids, values)
-
- self.pool.get('crm.lead').message_subscribe(cr, uid, lead_ids, [partner_id], context=context)
+ leads.write(values)
+ self.env['crm.lead'].message_subscribe([partner_id])
return True
- def get_lead_portal_url(self, cr, uid, lead_id, type, context=None):
+ def get_lead_portal_url(self, lead_id, type):
action = type == 'opportunity' and 'action_portal_opportunities' or 'action_portal_leads'
- try:
- action_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'website_crm_partner_assign', action)[1]
- except ValueError:
- action_id = False
- portal_link = "%s/?db=%s#id=%s&action=%s&view_type=form" % (self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url'), cr.dbname, lead_id, action_id)
+ action_ref = self.env.ref('website_crm_partner_assign.%s' % (action,), False)
+ portal_link = "%s/?db=%s#id=%s&action=%s&view_type=form" % (
+ self.env['ir.config_parameter'].get_param('web.base.url'),
+ self.env.cr.dbname,
+ lead_id,
+ action_ref and action_ref.id or False)
return portal_link
- def get_portal_url(self, cr, uid, ids, context=None):
- portal_link = "%s/?db=%s" % (self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url'), cr.dbname)
+ def get_portal_url(self):
+ portal_link = "%s/?db=%s" % (self.env['ir.config_parameter'].get_param('web.base.url'), self.env.cr.dbname)
return portal_link
- _columns = {
- 'forward_type': fields.selection([('single', 'a single partner: manual selection of partner'), ('assigned', "several partners: automatic assignation, using GPS coordinates and partner's grades"), ], 'Forward selected leads to'),
- 'partner_id': fields.many2one('res.partner', 'Forward Leads To'),
- 'assignation_lines': fields.one2many('crm.lead.assignation', 'forward_id', 'Partner Assignation'),
- 'body': fields.html('Contents', help='Automatically sanitized HTML contents'),
- }
+ forward_type = fields.Selection([
+ ('single', 'a single partner: manual selection of partner'),
+ ('assigned', "several partners: automatic assignation, using GPS coordinates and partner's grades")
+ ], 'Forward selected leads to', default=lambda self: self.env.context.get('forward_type') or 'single')
+ partner_id = fields.Many2one('res.partner', 'Forward Leads To')
+ assignation_lines = fields.One2many('crm.lead.assignation', 'forward_id', 'Partner Assignation')
+ body = fields.Html('Contents', help='Automatically sanitized HTML contents')
- _defaults = {
- 'forward_type': lambda self, cr, uid, c: c.get('forward_type') or 'single',
- }
-
-class crm_lead_assignation (osv.TransientModel):
+class CrmLeadAssignation(models.TransientModel):
_name = 'crm.lead.assignation'
- _columns = {
- 'forward_id': fields.many2one('crm.lead.forward.to.partner', 'Partner Assignation'),
- 'lead_id': fields.many2one('crm.lead', 'Lead'),
- 'lead_location': fields.char('Lead Location', size=128),
- 'partner_assigned_id': fields.many2one('res.partner', 'Assigned Partner'),
- 'partner_location': fields.char('Partner Location', size=128),
- 'lead_link': fields.char('Lead Single Links', size=128),
- }
-
- def on_change_lead_id(self, cr, uid, ids, lead_id, context=None):
- if not context:
- context = {}
- if not lead_id:
- return {'value': {'lead_location': False}}
- lead = self.pool.get('crm.lead').browse(cr, uid, lead_id, context=context)
- lead_location = []
- if lead.country_id:
- lead_location.append(lead.country_id.name)
- if lead.city:
- lead_location.append(lead.city)
- return {'value': {'lead_location': ", ".join(lead_location)}}
-
- def on_change_partner_assigned_id(self, cr, uid, ids, partner_assigned_id, context=None):
- if not context:
- context = {}
- if not partner_assigned_id:
- return {'value': {'lead_location': False}}
- partner = self.pool.get('res.partner').browse(cr, uid, partner_assigned_id, context=context)
- partner_location = []
- if partner.country_id:
- partner_location.append(partner.country_id.name)
- if partner.city:
- partner_location.append(partner.city)
- return {'value': {'partner_location': ", ".join(partner_location)}}
+
+ forward_id = fields.Many2one('crm.lead.forward.to.partner', 'Partner Assignation')
+ lead_id = fields.Many2one('crm.lead', 'Lead')
+ lead_location = fields.Char('Lead Location')
+ partner_assigned_id = fields.Many2one('res.partner', 'Assigned Partner')
+ partner_location = fields.Char('Partner Location')
+ lead_link = fields.Char('Lead Single Links')
+
+ @api.onchange('lead_id')
+ def _onchange_lead_id(self):
+ lead = self.lead_id
+ if not lead:
+ self.lead_location = False
+ else:
+ lead_location = []
+ if lead.country_id:
+ lead_location.append(lead.country_id.name)
+ if lead.city:
+ lead_location.append(lead.city)
+ self.lead_location = ", ".join(lead_location)
+
+ @api.onchange('partner_assigned_id')
+ def _onchange_partner_assigned_id(self):
+ partner = self.partner_assigned_id
+ if not partner:
+ self.lead_location = False
+ else:
+ partner_location = []
+ if partner.country_id:
+ partner_location.append(partner.country_id.name)
+ if partner.city:
+ partner_location.append(partner.city)
+ self.partner_location = ", ".join(partner_location)
diff --git a/addons/website_crm_partner_assign/wizard/crm_forward_to_partner_view.xml b/addons/website_crm_partner_assign/wizard/crm_forward_to_partner_view.xml
index 969bdf942f8..2c95ea01549 100644
--- a/addons/website_crm_partner_assign/wizard/crm_forward_to_partner_view.xml
+++ b/addons/website_crm_partner_assign/wizard/crm_forward_to_partner_view.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<openerp>
- <data>
+<odoo>
<record model="ir.ui.view" id="crm_lead_forward_to_partner_form">
<field name="name">crm_lead_forward_to_partner</field>
<field name="model">crm.lead.forward.to.partner</field>
@@ -18,9 +17,9 @@
</group>
<field name="assignation_lines" attrs="{'invisible': [('forward_type', 'in', ['single',False])]}">
<tree create="false" editable="bottom">
- <field name="lead_id" readonly="1" on_change="on_change_lead_id(lead_id)"/>
+ <field name="lead_id" readonly="1"/>
<field name="lead_location" readonly="1"/>
- <field name="partner_assigned_id" on_change="on_change_partner_assigned_id(partner_assigned_id)"/>
+ <field name="partner_assigned_id"/>
<field name="partner_location" readonly="1"/>
</tree>
</field>
@@ -52,5 +51,4 @@
groups="sales_team.group_sale_manager"
context="{'default_composition_mode' : 'mass_mail'}" view_id="crm_lead_forward_to_partner_form" />
- </data>
-</openerp>
+</odoo>