diff options
| author | rgo-odoo <rgo@odoo.com> | 2016-07-04 16:44:02 +0200 |
|---|---|---|
| committer | Yannick Tivisse <yti@odoo.com> | 2016-07-05 17:27:44 +0200 |
| commit | 053982f48d4c824a68ee1e56e897d576530777c7 (patch) | |
| tree | 642efad97e47d5ab697b53dd55b74c2301dd1e92 | |
| parent | ac94ed70ec1c853461552e911ea6849b15a2ab73 (diff) | |
[MIG] website_crm_partner_assign: Code migration to new api
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','<>',False)]"/> + <field name="partner_assigned_id" domain="[('grade_id','<>',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','<>',False)]"/> + <field name="partner_assigned_id" domain="[('grade_id','<>',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> |
