[REM] website_crm_score: moved to enterprise

This commit is contained in:
Antony Lesuisse
2015-08-28 16:49:46 +02:00
parent a11bab1226
commit cd53cea32b
28 changed files with 0 additions and 2587 deletions
-5
View File
@@ -1042,11 +1042,6 @@ file_filter = addons/website_crm_partner_assign/i18n/<lang>.po
source_file = addons/website_crm_partner_assign/i18n/website_crm_partner_assign.pot
source_lang = en
[odoo-9.website_crm_score]
file_filter = addons/website_crm_score/i18n/<lang>.po
source_file = addons/website_crm_score/i18n/website_crm_score.pot
source_lang = en
[odoo-9.website_customer]
file_filter = addons/website_customer/i18n/<lang>.po
source_file = addons/website_customer/i18n/website_customer.pot
-3
View File
@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
import models
import controllers
-29
View File
@@ -1,29 +0,0 @@
{
'name': "Lead Scoring",
'category': "CRM",
'version': "1.0",
'depends': ['base', 'sales_team', 'marketing', 'website_crm'],
'author': "Odoo S.A.",
'description': """\
Lead Scoring
===================
This module allows you to...
- Track specific page view on your website.
- Assign score on lead: sort your lead automatically and consider the more important at first.
- Assign lead to salesteams: define your own filters and sort automatically your leads by saleteam.
- Assign lead to salesmen: define filter by saleman and dispatch automatically your leads to the right saleman.
""",
'data': [
'views/website_crm_score.xml',
'views/reporting.xml',
'views/sales.xml',
'views/marketing.xml',
'security/ir.model.access.csv',
],
'demo': [
'demo/website_crm_score_demo.xml',
],
'installable': True,
'application': False,
}
@@ -1,2 +0,0 @@
# -*- coding: utf-8 -*-
import main
@@ -1,131 +0,0 @@
# -*- coding: utf-8 -*-
import simplejson
from openerp import http, SUPERUSER_ID, fields
from openerp.http import request
from openerp.tools import html_escape
from openerp.addons.website.controllers.main import Website
from openerp.addons.website_form.controllers.main import WebsiteForm
class PageController(Website):
@http.route('/page/<page:page>', auth="public", website=True)
def page(self, page, **opt):
response = super(PageController, self).page(page, **opt)
# duplication of ir_http.py
if getattr(response, 'status_code', 0) == 200:
try:
view = request.website.get_template(page)
except:
pass # view not found
else:
if view.track: # avoid tracking redirected page
cr, uid, context = request.cr, request.uid, request.context
lead_id = request.env["crm.lead"].decode(request)
url = request.httprequest.url
vals = {'lead_id': lead_id, 'user_id': request.session.get('uid'), 'url': url}
if not lead_id or request.registry['website.crm.pageview'].create_pageview(cr, uid, vals, context=context):
# create_pageview failed
response.delete_cookie('lead_id')
request.session.setdefault('pages_viewed', {})[url] = fields.Datetime.now()
request.session.modified = True
return response
class ContactController(WebsiteForm):
@http.route('/website_form/<string:model_name>', type='http', auth="public", methods=['POST'], website=True)
def website_form(self, model_name, **kwargs):
response = super(ContactController, self).website_form(model_name, **kwargs)
if model_name != 'crm.lead':
return response
# the cookie is written here because the response is not available in the create_lead function
response_data = simplejson.loads(response.data) # controller is json now
if 'id' in response_data: # a new lead has been created
lead_model = request.registry['crm.lead']
# sign the lead_id
sign = lead_model.encode(response_data['id'])
response.set_cookie('lead_id', sign, domain=lead_model.get_score_domain_cookies())
return response
def create_real_lead(self, request, model, values, custom, meta=None):
""" Make this function overridable to create a lead with another function than insert_record from website_form """
return super(ContactController, self).insert_record(request, model, values, custom, meta)
def insert_record(self, request, model, values, custom, meta=None):
if model.model != 'crm.lead':
return super(ContactController, self).insert_record(request, model, values, custom, meta)
cr, context = request.cr, request.context
lead_model = request.registry["crm.lead"]
lead_id = lead_model.decode(request)
# domain: leads that are still open:
# NOT [ on_change AND (proba = 0 OR proba = 100) ]
# the condition on the lead_id is prepended
domain = [
('id', '=', lead_id),
'|',
('stage_id.on_change', '=', False),
'&',
('stage_id.probability', '!=', 0),
('stage_id.probability', '!=', 100)
]
lead_instance = lead_model.search(cr, SUPERUSER_ID, domain, context=context)
if lead_instance:
# a lead_id cookie exists and it has not been altered and the lead is not closed
lead = lead_model.browse(cr, SUPERUSER_ID, lead_id, context=context)
# NOTE: the following should be changed when dynamic forms exist
changed_values = {}
for fieldname, fieldvalue in values.items():
if fieldname in lead._all_columns and fieldvalue:
if lead[fieldname] and lead[fieldname] != fieldvalue:
changed_values[fieldname] = fieldvalue
else:
lead[fieldname] = fieldvalue
# Post a message to indicate the updated field (if any)
if changed_values:
body = 'Other value given for field '
for fieldname in changed_values.keys():
body += '<br/><b>%s</b>: <b>%s</b>' % (fieldname, html_escape(changed_values[fieldname]))
request.registry['crm.lead'].message_post(cr, SUPERUSER_ID, [lead_id], body=body, subject="Field value changed", context=context)
return lead_id
else:
# either no lead_id cookie OR the lead_id doesn't exist in db OR the current one is closed -> a lead is created
lang = context.get('lang', False)
lang_id = request.registry["res.lang"].search(cr, SUPERUSER_ID, [('code', '=', lang)], context=context)
lang_id = lang_id and lang_id[0] or False
values['lang_id'] = lang_id
body = None
if 'pages_viewed' in request.session:
score_pageview_ids = []
url_list = []
pages_viewed = request.session['pages_viewed']
for url, date in pages_viewed.iteritems():
vals = {'user_id': request.session.get('uid'), 'url': url, 'view_date': date}
score_pageview_ids.append((0, 0, vals))
url_list.append(url)
del request.session['pages_viewed']
values['score_pageview_ids'] = score_pageview_ids
urls = []
for url in url_list:
url_encoded = html_escape(url)
urls.append('<a href="%s" target="_blank"><b>%s</b></a>' % (url_encoded, url_encoded))
body = '<br/>'.join(urls)
new_lead_id = self.create_real_lead(request, model, values, custom, meta)
# if pages were seen, a message is posted
if body:
request.registry['crm.lead'].message_post(cr, SUPERUSER_ID, [new_lead_id], body=body, subject="Pages visited", context=context)
return new_lead_id
@@ -1,279 +0,0 @@
<?xml version="1.0"?>
<openerp>
<data>
<record model="crm.team" id="sales_team.team_sales_department">
<field name="score_team_domain">[['country_id', '=', 'France']]</field>
</record>
<record model="crm.team" id="website.salesteam_website_sales">
<field name="score_team_domain">[['country_id', '=', 'Belgium']]</field>
</record>
<!-- Creating salesmen -->
<record id="website_crm_score_partner_0" model="res.partner">
<field name="name">Toni Buchanan</field>
<field name="email">Toni.Buchanan@yourcompany.com</field>
<field name="supplier" eval="False"/>
<field name="customer" eval="False"/>
<field name="notify_email">none</field>
<field name="city">Vivegnis</field>
<field name="zip">4683</field>
<field name="country_id" ref="base.be"/>
<field name="street">Rue Cesar de Paepe, 43</field>
</record>
<record id="website_crm_score_user_0" model="res.users" context="{'no_reset_password': True}">
<field name="partner_id" ref="website_crm_score_partner_0"/>
<field name="login">tbuchanan</field>
<field name="password">tbuchanan</field>
<field name="groups_id" eval="[(5,)]"/>
</record>
<record id="website_crm_score_partner_1" model="res.partner">
<field name="name">Frances Pierce</field>
<field name="email">Frances.Pierce@yourcompany.com</field>
<field name="supplier" eval="False"/>
<field name="customer" eval="False"/>
<field name="notify_email">none</field>
<field name="city">Oakland</field>
<field name="zip">94612</field>
<field name="country_id" ref="base.be"/>
<field name="street">4850 Clifford Street</field>
</record>
<record id="website_crm_score_user_1" model="res.users" context="{'no_reset_password': True}">
<field name="partner_id" ref="website_crm_score_partner_1"/>
<field name="login">fpierce</field>
<field name="password">fpierce</field>
<field name="groups_id" eval="[(5,)]"/>
</record>
<record id="website_crm_score_partner_2" model="res.partner">
<field name="name">Camille Watkins</field>
<field name="email">Camille.Watkins@yourcompany.com</field>
<field name="supplier" eval="False"/>
<field name="customer" eval="False"/>
<field name="notify_email">none</field>
<field name="city">Houston</field>
<field name="zip">77036</field>
<field name="country_id" ref="base.be"/>
<field name="street">181 Swick Hill Street</field>
</record>
<record id="website_crm_score_user_2" model="res.users" context="{'no_reset_password': True}">
<field name="partner_id" ref="website_crm_score_partner_2"/>
<field name="login">cwatkins</field>
<field name="password">cwatkins</field>
<field name="groups_id" eval="[(5,)]"/>
</record>
<record id="website_crm_score_partner_3" model="res.partner">
<field name="name">Judy Garza</field>
<field name="email">Judy.Garza@yourcompany.example.com</field>
<field name="supplier" eval="False"/>
<field name="customer" eval="False"/>
<field name="notify_email">none</field>
<field name="city">Daytona Beach</field>
<field name="zip">32114</field>
<field name="country_id" ref="base.be"/>
<field name="street">763 Melm Street</field>
</record>
<record id="website_crm_score_user_3" model="res.users" context="{'no_reset_password': True}">
<field name="partner_id" ref="website_crm_score_partner_3"/>
<field name="login">jgarza</field>
<field name="password">jgarza</field>
<field name="groups_id" eval="[(5,)]"/>
</record>
<!-- Assigning salesmen to salesteams -->
<!-- Team 0 -->
<record id="website_crm_score_team_user_0" model="team.user">
<field name="user_id" ref="website_crm_score_user_0"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="maximum_user_leads">2</field>
<field name="team_user_domain">['|', ['country_id', '=', 'Belgium'], ['country_id', '=', 'France']]</field>
</record>
<record id="website_crm_score_team_user_1" model="team.user">
<field name="user_id" ref="website_crm_score_user_2"/>
<field name="team_id" ref="sales_team.team_sales_department"/>
<field name="maximum_user_leads">1</field>
<field name="team_user_domain">[['country_id', '!=', 'Belgium']]</field>
</record>
<!-- Team 1 -->
<record id="website_crm_score_team_user_3" model="team.user">
<field name="user_id" ref="website_crm_score_user_1"/>
<field name="team_id" ref="website.salesteam_website_sales"/>
<field name="maximum_user_leads">1</field>
</record>
<record id="website_crm_score_team_user_4" model="team.user">
<field name="user_id" ref="website_crm_score_user_3"/>
<field name="team_id" ref="website.salesteam_website_sales"/>
<field name="maximum_user_leads">2</field>
<field name="team_user_domain">['&amp;', ['lang_id', '=', 'English'], ['country_id', '=', 'Belgium']]</field>
</record>
<!-- Team 3 -->
<record id="website_crm_score_team_user_6" model="team.user">
<field name="user_id" ref="website_crm_score_user_3"/>
<field name="team_id" ref="sales_team.crm_team_1"/>
<field name="maximum_user_leads">1</field>
</record>
<!-- Team 4 -->
<record id="website_crm_score_team_user_7" model="team.user">
<field name="user_id" ref="website_crm_score_user_2"/>
<field name="team_id" ref="sales_team.crm_team_1"/>
<field name="maximum_user_leads">3</field>
<field name="team_user_domain">[['country_id', '=', 'France']]</field>
</record>
<!-- Leads -->
<record id="crm.crm_case_1" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_2" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_3" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_4" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_5" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_6" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_7" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_8" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_9" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_10" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_11" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_12" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_13" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_14" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_15" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_16" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_17" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_18" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_19" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_20" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_21" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_22" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_23" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_24" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_25" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<record id="crm.crm_case_26" model="crm.lead">
<field name="team_id" />
<field name="user_id" />
</record>
<!-- Scores -->
<record id="website_crm_score_score_0" model="website.crm.score">
<field name="name">Belgium Score</field>
<field name="value">8</field>
<field name="domain">[['country_id', '=', 'Belgium']]</field>
</record>
<record id="website_crm_score_score_1" model="website.crm.score">
<field name="name">English Score</field>
<field name="value">4</field>
<field name="domain">[['lang_id', '=', 'English']]</field>
</record>
<record id="website_crm_score_score_2" model="website.crm.score">
<field name="name">France Score</field>
<field name="value">2</field>
<field name="domain">[['country_id', '=', 'France']]</field>
</record>
<record id="website_crm_score_score_3" model="website.crm.score">
<field name="name">Anti-China Score</field>
<field name="value">1</field>
<field name="domain">[['country_id', '!=', 'China']]</field>
</record>
<record id="website_crm_score_score_4" model="website.crm.score">
<field name="name">Homepage Score</field>
<field name="value">2</field>
<field name="domain">[['score_pageview_ids.url', 'ilike', '%/page/homepage']]</field>
</record>
<record id="website_crm_score_score_5" model="website.crm.score">
<field name="name">Aboutus Score</field>
<field name="value">8</field>
<field name="domain">[['score_pageview_ids.url', 'ilike', '%/page/website.aboutus']]</field>
</record>
<record id="website_crm_score_score_6" model="website.crm.score">
<field name="name">Email</field>
<field name="value">8</field>
<field name="domain">[['email_from', '!=', False]]</field>
</record>
<record id="website_crm_score_score_7" model="website.crm.score">
<field name="name">US Score</field>
<field name="value">4</field>
<field name="domain">[['country_id', '=', 'United States']]</field>
</record>
</data>
</openerp>
@@ -1,436 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_crm_score
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-25 09:00+0000\n"
"PO-Revision-Date: 2015-08-25 09:00+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_lead_pageviews_count
msgid "# Page Views"
msgstr ""
#. module: website_crm_score
#. openerp-web
#: code:addons/website_crm_score/static/src/xml/track_page.xml:9
#, python-format
msgid "4. Track Page"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_running
msgid "Active"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,help:website_crm_score.field_ir_ui_view_track
msgid "Allow to specify for one page of the website to be trackable or not"
msgstr ""
#. module: website_crm_score
#: model:ir.actions.server,name:website_crm_score.action_score_now
msgid "Apply marked scores"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_lead_assign_date
msgid "Assign Date"
msgstr ""
#. module: website_crm_score
#: model:ir.ui.view,arch_db:website_crm_score.sales_team_form_view_assign
msgid "Assignation"
msgstr ""
#. module: website_crm_score
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_lead_dry_run_form
#: model:ir.ui.view,arch_db:website_crm_score.view_lead_dry_run_tree
msgid "Assignation Dry Run"
msgstr ""
#. module: website_crm_score
#: model:ir.actions.act_window,name:website_crm_score.lead_dry_run_action
#: model:ir.ui.menu,name:website_crm_score.leads_dry_run
msgid "Assignation dry run"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_leads_count
msgid "Assigned Leads"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,help:website_crm_score.field_team_user_leads_count
msgid "Assigned Leads this last month"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_assigned_leads
msgid "Assigned leads"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_capacity
msgid "Capacity"
msgstr ""
#. module: website_crm_score
#: model:ir.actions.act_window,help:website_crm_score.team_user_action
msgid "Click to create a salesmen."
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_create_uid
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_create_uid
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_create_uid
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_create_uid
msgid "Created by"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_create_date
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_create_date
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_create_date
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_create_date
msgid "Created on"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,help:website_crm_score.field_crm_lead_assign_date
msgid "Date when the lead has been assigned via the auto-assignation mechanism"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_display_name
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_display_name
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_display_name
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_display_name
msgid "Display Name"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_score_team_domain
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_team_user_domain
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_domain
msgid "Domain"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_event_based
msgid "Event-based rule"
msgstr ""
#. module: website_crm_score
#: model:ir.model,name:website_crm_score.model_ir_http
msgid "HTTP routing"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_id
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_id
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_id
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_id
msgid "ID"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_lead_lang_id
msgid "Language"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,help:website_crm_score.field_crm_lead_lang_id
msgid "Language from the website when lead has been created"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run___last_update
#: model:ir.model.fields,field_description:website_crm_score.field_team_user___last_update
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview___last_update
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score___last_update
msgid "Last Modified on"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_write_uid
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_write_uid
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_write_uid
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_write_uid
msgid "Last Updated by"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_write_date
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_write_date
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_write_date
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_write_date
msgid "Last Updated on"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_lead_id
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_lead_id
msgid "Lead"
msgstr ""
#. module: website_crm_score
#: model:ir.actions.server,name:website_crm_score.action_lead_dry_run
msgid "Lead Dry Run"
msgstr ""
#. module: website_crm_score
#: model:ir.model,name:website_crm_score.model_crm_lead
msgid "Lead/Opportunity"
msgstr ""
#. module: website_crm_score
#: model:ir.actions.act_window,name:website_crm_score.score_leads
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_score_form
msgid "Leads"
msgstr ""
#. module: website_crm_score
#: model:ir.ui.menu,name:website_crm_score.team_user
msgid "Leads Assignation"
msgstr ""
#. module: website_crm_score
#: model:ir.ui.menu,name:website_crm_score.leads_menu
msgid "Leads Management"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_maximum_user_leads
msgid "Leads Per Month"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_leads_count
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_leads_count
msgid "Leads count"
msgstr ""
#. module: website_crm_score
#: model:ir.actions.act_window,help:website_crm_score.team_user_action
msgid "Link users to salesteam, set a per 30 days lead capacity for each of them and set filters to auto assign your leads."
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,help:website_crm_score.field_crm_lead_score_pageview_ids
msgid "List of (tracked) pages seen by the owner of this lead"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_min_for_assign
msgid "Minimum score"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,help:website_crm_score.field_crm_team_min_for_assign
msgid "Minimum score to be automatically assign (>=)"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_name
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_name
msgid "Name"
msgstr ""
#. module: website_crm_score
#: model:ir.actions.act_window,name:website_crm_score.crm_score_views_action_table
#: model:ir.ui.view,arch_db:website_crm_score.crm_case_graph_view_leads_sales
#: model:ir.ui.view,arch_db:website_crm_score.crm_case_table_view_leads_sales
#: model:ir.ui.view,arch_db:website_crm_score.sales_team_form_view_assign
msgid "Opportunities"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_lead_score_pageview_ids
#: model:ir.ui.view,arch_db:website_crm_score.crm_score_pageview_form
#: model:ir.ui.view,arch_db:website_crm_score.crm_score_pageview_graph
#: model:ir.ui.view,arch_db:website_crm_score.website_crm_pageview_tree
msgid "Page Views"
msgstr ""
#. module: website_crm_score
#: model:ir.ui.view,arch_db:website_crm_score.lead_score_form
msgid "Page views"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_percentage_leads
msgid "Percentage leads"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_ratio
msgid "Ratio"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_running
msgid "Running"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_team_id
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_team_id
msgid "SaleTeam"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_leads_dry_run_user_id
#: model:ir.model.fields,field_description:website_crm_score.field_team_user_user_id
msgid "Saleman"
msgstr ""
#. module: website_crm_score
#: model:ir.actions.act_window,name:website_crm_score.team_user_action
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_team_user_form
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_team_user_tree
msgid "Sales Men"
msgstr ""
#. module: website_crm_score
#: model:ir.model,name:website_crm_score.model_crm_team
msgid "Sales Team"
msgstr ""
#. module: website_crm_score
#: model:ir.actions.act_window,name:website_crm_score.team_action
msgid "Sales Teams"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_team_user_ids
msgid "Salesman"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_lead_score
#: model:ir.model.fields,field_description:website_crm_score.field_crm_lead_score_ids
msgid "Score"
msgstr ""
#. module: website_crm_score
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_score_form
msgid "Score Now"
msgstr ""
#. module: website_crm_score
#: model:ir.actions.act_window,name:website_crm_score.score_action
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_score_form
#: model:ir.ui.view,arch_db:website_crm_score.view_crm_score_tree
msgid "Scores"
msgstr ""
#. module: website_crm_score
#: model:ir.ui.view,arch_db:website_crm_score.lead_score_form
#: model:ir.ui.view,arch_db:website_crm_score.score_opp_form_view
msgid "Scoring"
msgstr ""
#. module: website_crm_score
#: model:ir.ui.menu,name:website_crm_score.pageview_menu
msgid "Scoring Page Views"
msgstr ""
#. module: website_crm_score
#: model:ir.ui.menu,name:website_crm_score.scores_menu
msgid "Scoring Rules"
msgstr ""
#. module: website_crm_score
#: model:ir.ui.view,arch_db:website_crm_score.crm_score_pageview_filter
msgid "Search PageViews"
msgstr ""
#. module: website_crm_score
#: model:ir.ui.menu,name:website_crm_score.team
msgid "Teams Assignation"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_ir_ui_view_track
msgid "Track"
msgstr ""
#. module: website_crm_score
#: model:ir.actions.act_window,name:website_crm_score.crm_score_views_action_graph
#: model:ir.model.fields,field_description:website_crm_score.field_crm_team_unassigned_leads
#: model:ir.ui.view,arch_db:website_crm_score.sales_team_form_view_assign
msgid "Unassigned leads"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_url
msgid "Url"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_user_id
msgid "User"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_score_value
msgid "Value"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,field_description:website_crm_score.field_website_crm_pageview_view_date
msgid "Viewing Date"
msgstr ""
#. module: website_crm_score
#: model:ir.actions.act_window,name:website_crm_score.website_crm_score_pageviews
msgid "Website Pages"
msgstr ""
#. module: website_crm_score
#: model:ir.model.fields,help:website_crm_score.field_website_crm_score_event_based
msgid "When checked, the rule will be re-evaluated every time, even for leads that have already been checked previously. This option incurs a large performance penalty, so it should be checked only for rules that depend on dynamic events"
msgstr ""
#. module: website_crm_score
#: model:ir.model,name:website_crm_score.model_crm_leads_dry_run
msgid "crm.leads.dry.run"
msgstr ""
#. module: website_crm_score
#: model:ir.model,name:website_crm_score.model_ir_ui_view
msgid "ir.ui.view"
msgstr ""
#. module: website_crm_score
#: model:ir.model,name:website_crm_score.model_team_user
msgid "team.user"
msgstr ""
#. module: website_crm_score
#. openerp-web
#: code:addons/website_crm_score/static/src/xml/track_page.xml:9
#, python-format
msgid "to better score your leads:"
msgstr ""
#. module: website_crm_score
#: model:ir.model,name:website_crm_score.model_website_crm_pageview
msgid "website.crm.pageview"
msgstr ""
#. module: website_crm_score
#: model:ir.model,name:website_crm_score.model_website_crm_score
msgid "website.crm.score"
msgstr ""
@@ -1,7 +0,0 @@
# -*- coding: utf-8 -*-
import website_crm_score
import crm_lead
import ir
import sales_team
import pageview
import leads_dry_run
@@ -1,90 +0,0 @@
# -*- coding: utf-8 -*-
from openerp.http import request
from openerp import api, fields, models, SUPERUSER_ID
import md5
class Lead(models.Model):
_inherit = 'crm.lead'
@api.one
def _count_pageviews(self):
self.pageviews_count = len(self.score_pageview_ids)
@api.depends('score_ids', 'score_ids.value')
def _compute_score(self):
self._cr.execute("""
SELECT
lead_id, COALESCE(sum(s.value), 0) as sum
FROM
crm_lead_score_rel rel
LEFT JOIN
website_crm_score s ON (s.id = rel.score_id)
WHERE lead_id = any(%s)
GROUP BY lead_id
""", (self.ids,))
scores = dict(self._cr.fetchall())
for lead in self:
lead.score = scores.get(lead.id, 0)
score = fields.Float(compute='_compute_score', store=True)
score_ids = fields.Many2many('website.crm.score', 'crm_lead_score_rel', 'lead_id', 'score_id', string='Score')
score_pageview_ids = fields.One2many('website.crm.pageview', 'lead_id', string='Page Views', help="List of (tracked) pages seen by the owner of this lead")
assign_date = fields.Datetime(string='Assign Date', help="Date when the lead has been assigned via the auto-assignation mechanism")
pageviews_count = fields.Integer('# Page Views', compute='_count_pageviews')
lang_id = fields.Many2one('res.lang', string='Language', help="Language from the website when lead has been created")
def encode(self, lead_id):
md5_lead_id = md5.new("%s%s" % (lead_id, self.get_key())).hexdigest()
return "%s-%s" % (str(lead_id), md5_lead_id)
def decode(self, request):
# opens the cookie, verifies the signature of the lead_id
# returns lead_id if the verification passes and None otherwise
cookie_content = request.httprequest.cookies.get('lead_id')
if cookie_content:
lead_id, md5_lead_id = cookie_content.split('-', 1)
expected_encryped_lead_id = md5.new("%s%s" % (lead_id, self.get_key())).hexdigest()
if md5_lead_id == expected_encryped_lead_id:
return int(lead_id)
else:
return None
def get_key(self):
return self.pool['ir.config_parameter'].get_param(request.cr, SUPERUSER_ID, 'database.secret')
def get_score_domain_cookies(self):
return request.httprequest.host
@api.model
def _merge_pageviews(self, opportunity_id, opportunities):
crmpv = self.env['website.crm.pageview']
lead_ids = [opp.id for opp in opportunities if opp.id != opportunity_id]
pv_ids = crmpv.sudo().search([('lead_id', 'in', lead_ids)])
pv_ids.write({'lead_id': opportunity_id})
@api.model
def _merge_scores(self, opportunity_id, opportunities):
# We needs to delete score from opportunity_id, to be sure that all rules will be re-evaluated.
self.sudo().browse(opportunity_id).write({'score_ids': [(6, 0, [])]})
@api.model
def merge_dependences(self, highest, opportunities):
self._merge_pageviews(highest, opportunities)
self._merge_scores(highest, opportunities)
# Call default merge function
super(Lead, self).merge_dependences(highest, opportunities)
# Overwritte ORM to add or remove the assign date
@api.model
def create(self, vals):
if vals.get('user_id'):
vals['assign_date'] = fields.datetime.now()
return super(Lead, self).create(vals)
@api.multi
def write(self, vals):
if 'user_id' in vals:
vals['assign_date'] = vals.get('user_id') and fields.datetime.now() or False
return super(Lead, self).write(vals)
-30
View File
@@ -1,30 +0,0 @@
# -*- coding: utf-8 -*-
from openerp import fields, models
from openerp.http import request
from openerp.osv import osv
class ir_http(models.AbstractModel):
_inherit = 'ir.http'
def _dispatch(self):
response = super(ir_http, self)._dispatch()
if getattr(response, 'status_code', 0) == 200:
if request.endpoint and request.endpoint.routing and request.endpoint.routing.get('track'):
lead_id = request.env["crm.lead"].decode(request)
url = request.httprequest.url
vals = {'lead_id': lead_id, 'user_id': request.session.get('uid'), 'url': url}
if not lead_id or request.env['website.crm.pageview'].create_pageview(vals):
# create_pageview was fail
response.delete_cookie('lead_id')
request.session.setdefault('pages_viewed', {})[url] = fields.Datetime.now()
request.session.modified = True
return response
class view(osv.osv):
_inherit = "ir.ui.view"
track = fields.Boolean(string='Track', default=False, help="Allow to specify for one page of the website to be trackable or not")
@@ -1,32 +0,0 @@
# -*- coding: utf-8 -*-
from openerp import fields, models, api
class crm_leads_dry_run(models.TransientModel):
_name = "crm.leads.dry.run"
lead_id = fields.Many2one('crm.lead', string='Lead', required=True)
team_id = fields.Many2one('crm.team', string='SaleTeam', required=True, oldname='section_id')
user_id = fields.Many2one('res.users', string='Saleman')
@api.model
def assign_leads(self, ids=[]):
# Allow to assign the result from a previous dry run.
# Once the user agrees with the result shown by a dry run
# It differs from launching the assignement process again,
# because salemen would be selected at random again
all_dry_run = self.search([('user_id', '!=', False)])
for dry_run in all_dry_run:
lead_record = dry_run.lead_id
values = {
'team_id': dry_run.team_id.id,
'user_id': dry_run.user_id.id,
'assign_date': fields.Datetime.now()
}
lead_record.write(values)
lead_record.convert_opportunity(partner_id=None)
# Avoid to re-assign the same leads for nothing
self._cr.execute("""
TRUNCATE TABLE crm_leads_dry_run;
""")
@@ -1,50 +0,0 @@
# -*- coding: utf-8 -*-
from openerp import fields, models, SUPERUSER_ID, tools, api
from psycopg2 import IntegrityError
from openerp.tools import html_escape
class pageview(models.Model):
_name = "website.crm.pageview"
view_date = fields.Datetime(string='Viewing Date')
lead_id = fields.Many2one('crm.lead', string='Lead')
user_id = fields.Many2one('res.users', string='User', oldname='partner_id')
url = fields.Char(string='Url')
@api.model
def create_pageview(self, vals, test=False):
# returns True if the operation in the db was successful, False otherwise
lead_id = vals.get('lead_id', 0)
user_id = vals.get('user_id')
url = vals.get('url', '')
view_date = fields.Datetime.now()
with self.pool.cursor() as pv_cr:
if test:
pv_cr = self._cr
pv_cr.execute('''
UPDATE website_crm_pageview SET view_date=%s WHERE lead_id=%s AND url=%s RETURNING id;
''', (view_date, lead_id, url))
fetch = pv_cr.fetchone()
if fetch:
return True
else:
# update failed
try:
with tools.mute_logger('openerp.sql_db'):
pv_cr.execute('''
INSERT INTO website_crm_pageview (lead_id, user_id, url, view_date)
SELECT %s,%s,%s,%s
RETURNING id;
''', (lead_id, user_id, url, view_date))
fetch = pv_cr.fetchone()
if fetch:
# a new pageview has been created, a message is posted
url = html_escape(url)
body = '<a href="%s" target="_blank"><b>%s</b></a>' % (url, url)
ctx = dict(self._context, mail_notify_noemail=True)
self.pool['crm.lead'].message_post(self._cr, SUPERUSER_ID, [lead_id], body=body, subject="Page visited", context=ctx)
return True
except IntegrityError:
return False
@@ -1,266 +0,0 @@
# -*- coding: utf-8 -*-
from openerp import fields, api, models
from openerp.osv import osv
from openerp.tools.safe_eval import safe_eval
from random import randint, shuffle
import datetime
import logging
import math
_logger = logging.getLogger(__name__)
evaluation_context = {
'datetime': datetime,
'context_today': datetime.datetime.now,
}
try:
from flanker.addresslib import address
def checkmail(mail):
return bool(address.validate_address(mail))
except ImportError:
_logger.warning('flanker not found, email validation disabled.')
def checkmail(mail):
return True
class team_user(models.Model):
_name = 'team.user'
@api.one
def _count_leads(self):
if self.id:
limit_date = datetime.datetime.now() - datetime.timedelta(days=30)
domain = [('user_id', '=', self.user_id.id),
('team_id', '=', self.team_id.id),
('assign_date', '>', fields.Datetime.to_string(limit_date))
]
self.leads_count = self.env['crm.lead'].search_count(domain)
else:
self.leads_count = 0
@api.one
def _get_percentage(self):
try:
self.percentage_leads = round(100 * self.leads_count / float(self.maximum_user_leads), 2)
except ZeroDivisionError:
self.percentage_leads = 0.0
@api.one
@api.constrains('team_user_domain')
def _assert_valid_domain(self):
try:
domain = safe_eval(self.team_user_domain or '[]', evaluation_context)
self.env['crm.lead'].search(domain)
except Exception:
raise Warning('The domain is incorrectly formatted')
team_id = fields.Many2one('crm.team', string='SaleTeam', required=True, oldname='section_id')
user_id = fields.Many2one('res.users', string='Saleman', required=True)
name = fields.Char(related='user_id.partner_id.display_name')
running = fields.Boolean(string='Running', default=True)
team_user_domain = fields.Char('Domain')
maximum_user_leads = fields.Integer('Leads Per Month')
leads_count = fields.Integer('Assigned Leads', compute='_count_leads', help='Assigned Leads this last month')
percentage_leads = fields.Float(compute='_get_percentage', string='Percentage leads')
@api.one
def toggle_active(self):
if isinstance(self.id, int): # if already saved
self.running = not self.running
class crm_team(osv.osv):
_inherit = "crm.team"
@api.model
def _get_default_team_id(self, user_id=None):
team_id = super(crm_team, self)._get_default_team_id(user_id=user_id)
if user_id is None:
user_id = self.env.user.id
if not team_id:
team_id = self.search([('team_user_ids.user_id', '=', user_id)], limit=1).id
return team_id
@api.one
def _count_leads(self):
if self.id:
self.leads_count = self.env['crm.lead'].search_count([('team_id', '=', self.id)])
else:
self.leads_count = 0
@api.one
def _assigned_leads(self):
limit_date = datetime.datetime.now() - datetime.timedelta(days=30)
domain = [('assign_date', '>=', fields.Datetime.to_string(limit_date)),
('team_id', '=', self.id),
('user_id', '!=', False)
]
self.assigned_leads = self.env['crm.lead'].search_count(domain)
@api.one
def _unassigned_leads(self):
self.unassigned_leads = self.env['crm.lead'].search_count(
[('team_id', '=', self.id), ('user_id', '=', False), ('assign_date', '=', False)]
)
@api.one
def _capacity(self):
self.capacity = sum(s.maximum_user_leads for s in self.team_user_ids)
@api.one
@api.constrains('score_team_domain')
def _assert_valid_domain(self):
try:
domain = safe_eval(self.score_team_domain or '[]', evaluation_context)
self.env['crm.lead'].search(domain)
except Exception:
raise Warning('The domain is incorrectly formatted')
ratio = fields.Float(string='Ratio')
score_team_domain = fields.Char('Domain')
leads_count = fields.Integer(compute='_count_leads')
assigned_leads = fields.Integer(compute='_assigned_leads')
unassigned_leads = fields.Integer(compute='_unassigned_leads')
capacity = fields.Integer(compute='_capacity')
team_user_ids = fields.One2many('team.user', 'team_id', string='Salesman')
min_for_assign = fields.Integer("Minimum score", help="Minimum score to be automatically assign (>=)", default=0, required=True)
@api.model
def direct_assign_leads(self, ids=[]):
ctx = dict(self._context, mail_notify_noemail=True)
self.with_context(ctx)._assign_leads()
@api.model
def dry_assign_leads(self, ids=[]):
self._assign_leads(dry=True)
@api.model
# Note: The dry mode assign only 50 leads per salesteam for speed issues
def assign_leads_to_salesteams(self, all_salesteams, dry=False):
shuffle(all_salesteams)
haslead = True
while haslead:
haslead = False
for salesteam in all_salesteams:
domain = safe_eval(salesteam['score_team_domain'], evaluation_context)
domain.extend([('team_id', '=', False), ('user_id', '=', False)])
domain.extend(['|', ('stage_id.on_change', '=', False), '&', ('stage_id.probability', '!=', 0), ('stage_id.probability', '!=', 100)])
leads = self.env["crm.lead"].search(domain, limit=50)
haslead = haslead or (len(leads) == 50 and not dry)
if not leads.exists():
continue
if dry:
for lead in leads:
values = {'lead_id': lead.id, 'team_id': salesteam['id']}
self.env['crm.leads.dry.run'].create(values)
else:
leads.write({'team_id': salesteam['id']})
# Erase fake/false email
spams = map(lambda x: x.id, filter(lambda x: x.email_from and not checkmail(x.email_from), leads))
if spams:
self.env["crm.lead"].browse(spams).write({'email_from': False})
# Merge duplicated lead
leads_done = set()
for lead in leads:
if lead.id not in leads_done:
leads_duplicated = lead.get_duplicated_leads(False)
if len(leads_duplicated) > 1:
self.env["crm.lead"].browse(leads_duplicated).merge_opportunity(False, False)
leads_done.update(leads_duplicated)
self._cr.commit()
self._cr.commit()
@api.model
def assign_leads_to_salesmen(self, all_team_users, dry=False):
users = []
for su in all_team_users:
if (su.maximum_user_leads - su.leads_count) <= 0:
continue
domain = safe_eval(su.team_user_domain or '[]', evaluation_context)
domain.extend([
('user_id', '=', False),
('assign_date', '=', False),
('score', '>=', su.team_id.min_for_assign)
])
# assignation rythm: 2 days of leads if a lot of leads should be assigned
limit = int(math.ceil(su.maximum_user_leads / 15.0))
if dry:
dry_leads = self.env["crm.leads.dry.run"].search([('team_id', '=', su.team_id.id)])
domain.append(['id', 'in', dry_leads.mapped('lead_id.id')])
else:
domain.append(('team_id', '=', su.team_id.id))
leads = self.env["crm.lead"].search(domain, order='score desc', limit=limit * len(su.team_id.team_user_ids))
users.append({
"su": su,
"nbr": min(su.maximum_user_leads - su.leads_count, limit),
"leads": leads
})
assigned = set()
while users:
i = 0
# statistically select the user that should receive the next lead
idx = randint(0, reduce(lambda nbr, x: nbr + x['nbr'], users, 0) - 1)
while idx > users[i]['nbr']:
idx -= users[i]['nbr']
i += 1
user = users[i]
# Get the first unassigned leads available for this user
while user['leads'] and user['leads'][0] in assigned:
user['leads'] = user['leads'][1:]
if not user['leads']:
del users[i]
continue
# lead convert for this user
lead = user['leads'][0]
assigned.add(lead)
if dry:
values = {'lead_id': lead.id, 'team_id': user['su'].team_id.id, 'user_id': user['su'].user_id.id}
self.env['crm.leads.dry.run'].create(values)
else:
# Assign date will be setted by write function
data = {'user_id': user['su'].user_id.id}
lead.write(data)
lead.convert_opportunity(lead.partner_id and lead.partner_id.id or None)
self._cr.commit()
user['nbr'] -= 1
if not user['nbr']:
del users[i]
@api.model
def _assign_leads(self, dry=False):
# Emptying the table
self._cr.execute("""
TRUNCATE TABLE crm_leads_dry_run;
""")
all_salesteams = self.search_read(fields=['score_team_domain'], domain=[('score_team_domain', '!=', False)])
all_team_users = self.env['team.user'].search([('running', '=', True)])
self.env['website.crm.score'].assign_scores_to_leads()
self.assign_leads_to_salesteams(all_salesteams, dry=dry)
# Compute score after assign to salesteam, because if a merge has been done, the score for leads is removed.
self.env['website.crm.score'].assign_scores_to_leads()
self.assign_leads_to_salesmen(all_team_users, dry=dry)
@@ -1,91 +0,0 @@
# -*- coding: utf-8 -*-
from openerp import fields, models, api
from openerp.tools.safe_eval import safe_eval
from openerp.osv.expression import expression
import datetime
import logging
_logger = logging.getLogger(__name__)
evaluation_context = {
'datetime': datetime,
'context_today': datetime.datetime.now,
}
class website_crm_score(models.Model):
_name = 'website.crm.score'
@api.one
def _count_leads(self):
if self.id:
self._cr.execute("""
SELECT COUNT(1)
FROM crm_lead_score_rel
WHERE score_id = %s
""", (self.id,))
self.leads_count = self._cr.fetchone()[0]
else:
self.leads_count = 0
@api.one
@api.constrains('domain')
def _assert_valid_domain(self):
try:
domain = safe_eval(self.domain or '[]', evaluation_context)
self.env['crm.lead'].search(domain)
except Exception as e:
_logger.warning('Exception: %s' % (e,))
raise Warning('The domain is incorrectly formatted')
name = fields.Char('Name', required=True)
value = fields.Float('Value', required=True)
domain = fields.Char('Domain', required=True)
event_based = fields.Boolean(
'Event-based rule',
help='When checked, the rule will be re-evaluated every time, even for leads '
'that have already been checked previously. This option incurs a large '
'performance penalty, so it should be checked only for rules that depend '
'on dynamic events',
default=False
)
running = fields.Boolean('Active', default=True)
leads_count = fields.Integer(compute='_count_leads')
# the default [] is needed for the function to be usable by the cron
@api.model
def assign_scores_to_leads(self, ids=[]):
domain = [('running', '=', True)]
if ids:
domain.append(('id', 'in', ids))
scores = self.search_read(domain=domain, fields=['domain'])
for score in scores:
domain = safe_eval(score['domain'], evaluation_context)
# Don't replace the domain with a 'not in' like below... that doesn't make the same thing !!!
# domain.extend(['|', ('stage_id.on_change', '=', False), ('stage_id.probability', 'not in', [0,100])])
domain.extend(['|', ('stage_id.on_change', '=', False), '&', ('stage_id.probability', '!=', 0), ('stage_id.probability', '!=', 100)])
e = expression(self._cr, self._uid, domain, self.pool['crm.lead'], self._context)
where_clause, where_params = e.to_sql()
where_clause += """ AND (id NOT IN (SELECT lead_id FROM crm_lead_score_rel WHERE score_id = %s)) """
where_params.append(score['id'])
if not self.event_based:
# Only check leads that are newer than the last matching lead.
# Could be based on a "last run date" for a more precise optimization
where_clause += """ AND (id > (SELECT COALESCE(max(lead_id), 0)
FROM crm_lead_score_rel WHERE score_id = %s)) """
where_params.append(score['id'])
self._cr.execute("""INSERT INTO crm_lead_score_rel
SELECT crm_lead.id as lead_id, %s as score_id
FROM crm_lead
WHERE %s RETURNING lead_id""" % (score['id'], where_clause), where_params)
# Force recompute of fields that depends on score_ids
lead_ids = [resp[0] for resp in self._cr.fetchall()]
leads = self.env["crm.lead"].browse(lead_ids)
leads.modified(['score_ids'])
leads.recompute()
@@ -1,7 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_website_crm_score,access_website_crm_score,model_website_crm_score,,1,0,0,0
access_website_crm_score_manager,access_website_crm_score_manager,model_website_crm_score,base.group_website_designer,1,1,1,1
access_team_user,access_team_user,model_team_user,,1,0,0,0
access_team_user_manager,access_team_user_manager,model_team_user,marketing.group_lead_automation_manager,1,1,1,1
access_website_crm_pageview,access_website_crm_pageview,model_website_crm_pageview,,1,0,0,0
access_website_crm_pageview_manager,access_website_crm_pageview_manager,model_website_crm_pageview,marketing.group_lead_automation_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_website_crm_score access_website_crm_score model_website_crm_score 1 0 0 0
3 access_website_crm_score_manager access_website_crm_score_manager model_website_crm_score base.group_website_designer 1 1 1 1
4 access_team_user access_team_user model_team_user 1 0 0 0
5 access_team_user_manager access_team_user_manager model_team_user marketing.group_lead_automation_manager 1 1 1 1
6 access_website_crm_pageview access_website_crm_pageview model_website_crm_pageview 1 0 0 0
7 access_website_crm_pageview_manager access_website_crm_pageview_manager model_website_crm_pageview marketing.group_lead_automation_manager 1 1 1 1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

@@ -1,100 +0,0 @@
odoo.define('website_crm_score.filters', function (require) {
"use strict";
var kanban_widgets = require('web_kanban.widgets');
var Filters = kanban_widgets.AbstractField.extend({
/**
bnf grammar of a filter:
<filter> ::= <expr>
<expr> ::= <tuple> | '!' <expr> | <bin_op> <expr> <expr>
<bin_op> ::= '&' | '|'
<tuple> ::= '(' <field_name> ',' <operator> ',' <field_value> ')'
<operator> ::= '=' | '!=' | '<=' | '<' | '>' | '>=' | '=?' |
'=like' | '=ilike' | 'like' | 'not like' |
'ilike' | 'not ilike' | 'in' | 'not in' | 'child_of'
some operators are negative
*/
NEG_OP: ['!=', 'not like', 'not ilike', 'not in'],
MAX_LEN: 5,
start: function() {
var val = this.field.raw_value;
var self = this;
if (val) {
// This widget is temporary
// To keep only while the widget domain filter doesn't exist !
// Ugly hack to have (more) python domains which can be evaluated in JS
val = val.replace('(', '[').replace(')', ']').replace('False', 'false').replace('True', 'true')
try {
val = eval(val);
}
catch(err) {
// don't block UI if domain is not evaluable in JS
console.debug(err.message);
val = [['error','=', err.message]];
}
if (val.length <= this.MAX_LEN) {
var i = 0;
while (i < val.length) {
var res = this.interpret(val, i);
i = res[0];
var $span = res[1];
self.$el.append($span);
}
}
else {
var $span = '<span class="badge" style="background-color:#fce9e9;">Domain too big<span>';
self.$el.append($span);
}
}
},
interpret: function(val, i) {
var a = val[i];
if(typeof a !== 'string'){
// a is a tuple (field, op, value)
var tag = a[0]; // field name
var tip = a[2]; // field value
if (this.NEG_OP.indexOf(a[1]) !== -1){
// op in NEG_OP
tip = 'not ' + tip;
}
var span = '<span class="badge" title="' + tip + '">'+ tag +'</span>';
return [i+1, span];
}
else if (a === '!'){
var res = this.interpret(val, i+1);
var span = '<span class="badge">!</span>' + res[1];
return [res[0], span];
}
else {
// binary operator
var res = this.binary_operator(val, i);
return res;
}
return [i+1, ''];
},
binary_operator: function(val, i) {
var resA = this.interpret(val, i+1);
var resB = this.interpret(val, resA[0]);
var label = '';
var op = '';
if (val[i] === '|') {
label = 'label-success';
op = ' or ';
}
else if (val[i] === '&') {
label = 'label-primary';
op = ' and ';
}
var span = resA[1] + resB[1];
return [resB[0], span];
}
});
kanban_widgets.registry.add('filters', Filters);
});
@@ -1,66 +0,0 @@
odoo.define('website_crm_score.set_score', function (require) {
"use strict";
var ajax = require('web.ajax');
var Model = require('web.Model');
var seo = require('website.seo');
var base = require('web_editor.base');
var core = require('web.core');
var qweb = core.qweb;
ajax.loadXML('/website_crm_score/static/src/xml/track_page.xml', qweb);
seo.Configurator.include({
track: null,
start: function() {
this._super.apply(this, arguments);
var self = this;
var obj = seo.Configurator.prototype.getMainObject();
// only display checkbox for website page
if (obj && obj.model === 'ir.ui.view') {
this.is_tracked().then(function(data){
var add = $('<input type="checkbox" required="required"/>');
if (data[0]['track']) {
add.attr('checked','checked');
self.track = true;
}
else {
self.track = false;
}
self.$el.find('h3[class="track-page"]').append(add);
});
}
},
is_tracked: function(val) {
var obj = seo.Configurator.prototype.getMainObject();
if (!obj) {
return $.Deferred().reject();
} else {
return new Model(obj.model).call('read', [[obj.id], ['track'], base.get_context()]);
}
},
update: function () {
var self = this;
var mysuper = this._super;
var checkbox_value = this.$el.find('input[type="checkbox"]').is(':checked');
if (checkbox_value != self.track) {
this.trackPage(checkbox_value).then(function() {
mysuper.call(self);
});
}
else {
mysuper.call(self);
}
},
trackPage: function(val) {
var obj = seo.Configurator.prototype.getMainObject();
if (!obj) {
return $.Deferred().reject();
} else {
return new Model(obj.model).call('write', [[obj.id], { track: val }, base.get_context()]);
}
},
});
});
@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<templates id="template" xml:space="preserve">
<t t-extend="website.seo_configuration">
<t t-jquery="div.modal-body" t-operation="append">
<t t-if="widget.getMainObject() &amp;&amp; widget.getMainObject().model === 'ir.ui.view'">
<section class="set_score">
<h3 class="track-page">4. Track Page <small>to better score your leads: </small>
<!-- checkbox is added in js in set_score.js -->
</h3>
</section>
</t>
</t>
</t>
</templates>
@@ -1,2 +0,0 @@
# -*- coding: utf-8 -*-
from . import test_assign, test_dry_run, test_pageview
-153
View File
@@ -1,153 +0,0 @@
# -*- coding: utf-8 -*-
from openerp.tests import common
from mock import Mock
class TestScoring(common.TransactionCase):
def setUp(self):
super(TestScoring, self).setUp()
cr, uid = self.cr, self.uid
cr.commit = Mock(return_value=None)
# empty tables before testing to only use test records
cr.execute("""
UPDATE res_partner SET team_id=NULL;
""")
cr.execute("""
TRUNCATE TABLE team_user;
""")
cr.execute("""
DELETE FROM crm_team;
""")
cr.execute("""
DELETE FROM crm_lead;
""")
cr.execute("""
DELETE FROM website_crm_score;
""")
cr.execute("""
DELETE FROM website_crm_pageview;
""")
# Usefull models
self.crm_lead = self.registry('crm.lead')
self.crm_leads_dry_run = self.registry('crm.leads.dry.run')
self.pageview = self.registry('website.crm.pageview')
self.website_crm_score = self.registry('website.crm.score')
self.team = self.registry('crm.team')
self.res_users = self.registry('res.users')
self.team_user = self.registry('team.user')
self.country = self.registry('res.country')
self.crm_stage = self.registry('crm.stage')
self.belgium = self.country.search(cr, uid, [('name', '=', 'Belgium')])[0]
self.france = self.country.search(cr, uid, [('name', '=', 'France')])[0]
self.stage = self.crm_stage.create(cr, uid, {
'name': 'testing',
'probability': '50',
'on_change': False,
})
# Lead Data
self.lead0 = self.crm_lead.create(cr, uid, {
'name': 'lead0',
'country_id': self.belgium,
'email_from': 'lead0@test.com',
'user_id': None,
'team_id': False,
'stage_id': self.stage,
})
self.lead1 = self.crm_lead.create(cr, uid, {
'name': 'lead1',
'country_id': self.france,
'email_from': 'lead1@test.com',
'user_id': None,
'team_id': False,
'stage_id': self.stage,
})
self.lead2 = self.crm_lead.create(cr, uid, {
'name': 'lead2',
'email_from': 'lead2@test.com',
'user_id': None,
'team_id': False,
'stage_id': self.stage,
})
# PageView
self.pageview0 = self.pageview.create(cr, uid, {
'lead_id': self.lead0,
'url': 'url0',
})
self.pageview0 = self.pageview.create(cr, uid, {
'lead_id': self.lead1,
'url': 'url1',
})
# Salesteam
self.team0 = self.team.create(cr, uid, {
'name': 'team0',
'code': 'S0',
'score_team_domain': [('country_id', '=', 'Belgium')],
})
self.team1 = self.team.create(cr, uid, {
'name': 'team1',
'code': 'S1',
'score_team_domain': [('country_id', '=', 'France')],
})
# Salesmen
self.salesmen0 = self.res_users.create(cr, uid, {
'name': 'salesmen0',
'login': 'salesmen0',
'alias_name': 'salesmen0',
'email': 'salesmen0@example.com',
# 'groups_id': [(6, 0, [self.group_employee_id])]
}, {'no_reset_password': True})
self.salesmen1 = self.res_users.create(cr, uid, {
'name': 'salesmen1',
'login': 'salesmen1',
'alias_name': 'salesmen1',
'email': 'salesmen1@example.com',
# 'groups_id': [(6, 0, [self.group_employee_id])]
}, {'no_reset_password': True})
# team_user
self.team_user0 = self.team_user.create(cr, uid, {
'user_id': self.salesmen0,
'team_id': self.team0,
'maximum_user_leads': 1,
'team_user_domain': [('country_id', '=', 'Belgium')],
})
self.team_user1 = self.team_user.create(cr, uid, {
'user_id': self.salesmen1,
'team_id': self.team0,
'maximum_user_leads': 0,
'team_user_domain': [('country_id', '=', 'France')],
})
self.team_user2 = self.team_user.create(cr, uid, {
'user_id': self.salesmen1,
'team_id': self.team1,
'maximum_user_leads': 1,
})
# Score
self.score0 = self.website_crm_score.create(cr, uid, {
'name': 'score0',
'value': 1000,
'domain': "[('score_pageview_ids.url', '=', 'url0')]",
})
self.score1 = self.website_crm_score.create(cr, uid, {
'name': 'score1',
'value': 900,
'domain': "[('score_pageview_ids.url', '=', 'url1')]",
})
def tearDown(self):
super(TestScoring, self).tearDown()
@@ -1,35 +0,0 @@
# -*- coding: utf-8 -*-
from openerp.addons.website_crm_score.tests.common import TestScoring
from openerp.tools import mute_logger
class test_assign(TestScoring):
@mute_logger('openerp.addons.base.ir.ir_model', 'openerp.models')
def test_00_assign(self):
cr, uid = self.cr, self.uid
# scoring
self.website_crm_score.assign_scores_to_leads(cr, uid)
l0 = self.crm_lead.read(cr, uid, self.lead0, ['score'], None)
l1 = self.crm_lead.read(cr, uid, self.lead1, ['score'], None)
l2 = self.crm_lead.read(cr, uid, self.lead2, ['score'], None)
self.assertEqual(l0['score'], 1000, 'scoring failed')
self.assertEqual(l1['score'], 900, 'scoring failed')
self.assertEqual(l2['score'], 0, 'scoring failed')
# assignation
self.team.direct_assign_leads(cr, uid, None)
l0 = self.crm_lead.read(cr, uid, self.lead0, ['team_id', 'user_id'], None)
l1 = self.crm_lead.read(cr, uid, self.lead1, ['team_id', 'user_id'], None)
l2 = self.crm_lead.read(cr, uid, self.lead2, ['team_id', 'user_id'], None)
self.assertEqual(l0['team_id'][0], self.team0, 'assignation failed')
self.assertEqual(l1['team_id'][0], self.team1, 'assignation failed')
self.assertEqual(l2['team_id'], False, 'assignation failed')
self.assertEqual(l0['user_id'][0], self.salesmen0, 'assignation failed')
self.assertEqual(l1['user_id'][0], self.salesmen1, 'assignation failed')
self.assertEqual(l2['user_id'], False, 'assignation failed')
@@ -1,66 +0,0 @@
# -*- coding: utf-8 -*-
from openerp.addons.website_crm_score.tests.common import TestScoring
from openerp.tools import mute_logger
class test_dry_run(TestScoring):
@mute_logger('openerp.addons.base.ir.ir_model', 'openerp.models')
def test_00_dry_run(self):
cr, uid = self.cr, self.uid
# scoring
self.website_crm_score.assign_scores_to_leads(cr, uid)
l0 = self.crm_lead.read(cr, uid, self.lead0, ['score'], None)
l1 = self.crm_lead.read(cr, uid, self.lead1, ['score'], None)
l2 = self.crm_lead.read(cr, uid, self.lead2, ['score'], None)
self.assertEqual(l0['score'], 1000, 'scoring failed')
self.assertEqual(l1['score'], 900, 'scoring failed')
self.assertEqual(l2['score'], 0, 'scoring failed')
# dry run
self.team.dry_assign_leads(cr, uid, None)
fields = ['team_id', 'user_id', 'lead_id']
dr0_sect = self.crm_leads_dry_run.search_read(cr, uid, [('lead_id', '=', self.lead0), ('user_id', '=', False)], fields)[0]
dr0_user = self.crm_leads_dry_run.search_read(cr, uid, [('lead_id', '=', self.lead0), ('user_id', '!=', False)], fields)[0]
dr1_sect = self.crm_leads_dry_run.search_read(cr, uid, [('lead_id', '=', self.lead1), ('user_id', '=', False)], fields)[0]
dr1_user = self.crm_leads_dry_run.search_read(cr, uid, [('lead_id', '=', self.lead1), ('user_id', '!=', False)], fields)[0]
dr2 = self.crm_leads_dry_run.search_read(cr, uid, [('lead_id', '=', self.lead2)], fields)
self.assertEqual(dr0_sect['team_id'][0], self.team0, 'dry run failed')
self.assertEqual(dr0_user['team_id'][0], self.team0, 'dry run failed')
self.assertEqual(dr0_user['user_id'][0], self.salesmen0, 'dry run failed')
self.assertEqual(dr1_sect['team_id'][0], self.team1, 'dry run failed')
self.assertEqual(dr1_user['team_id'][0], self.team1, 'dry run failed')
self.assertEqual(dr1_user['user_id'][0], self.salesmen1, 'dry run failed')
self.assertEqual(dr2, [], 'dry run failed')
ldr = self.crm_leads_dry_run.search_count(cr, uid, [], None)
self.assertEqual(ldr, 4, 'wrong number of dry run created')
# assignement after dry run
self.crm_leads_dry_run.assign_leads(cr, uid, None)
l0 = self.crm_lead.read(cr, uid, self.lead0, ['team_id', 'user_id'], None)
l1 = self.crm_lead.read(cr, uid, self.lead1, ['team_id', 'user_id'], None)
l2 = self.crm_lead.read(cr, uid, self.lead2, ['team_id', 'user_id'], None)
self.assertEqual(l0['team_id'][0], self.team0, 'assignation failed')
self.assertEqual(l1['team_id'][0], self.team1, 'assignation failed')
self.assertEqual(l2['team_id'], False, 'assignation failed')
self.assertEqual(l0['user_id'][0], self.salesmen0, 'assignation failed')
self.assertEqual(l1['user_id'][0], self.salesmen1, 'assignation failed')
self.assertEqual(l2['user_id'], False, 'assignation failed')
ldr = self.crm_leads_dry_run.search_count(cr, uid, [], None)
self.assertEqual(ldr, 0, 'dry run not removed correctly')
@@ -1,26 +0,0 @@
# -*- coding: utf-8 -*-
from openerp.addons.website_crm_score.tests.common import TestScoring
from psycopg2 import IntegrityError
from openerp.tools import mute_logger
class test_assign(TestScoring):
@mute_logger('openerp.addons.base.ir.ir_model', 'openerp.models')
def test_00_pageview(self):
cr, uid = self.cr, self.uid
right_lead = self.pageview.create_pageview(cr, uid, {'lead_id': self.lead0, 'url': 'url2'}, test=True)
self.assertTrue(right_lead, 'create_pageview should have succeded')
pg0 = self.pageview.search_read(cr, uid, [('lead_id', '=', self.lead0), ('url', '=', 'url2')], ['view_date'])
self.assertNotEqual(pg0, [], 'pageview was not created')
update_lead = self.pageview.create_pageview(cr, uid, {'lead_id': self.lead0, 'url': 'url2'}, test=True)
self.assertTrue(update_lead, 'create_pageview should have updated the lead')
self.assertFalse(
self.pageview.create_pageview(cr, uid, {'lead_id': -1, 'url': 'url2'}, test=True),
'create_pageview should not works with unexisting lead id'
)
@@ -1,307 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<!-- Scheduler for Lead Scoring and Assignation -->
<record forcecreate="True" id="ir_cron_lead_assign" model="ir.cron">
<field name="name">Lead Assignation</field>
<field eval="False" name="active" />
<field name="user_id" ref="base.user_root" />
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field eval="False" name="doall" />
<field eval="'crm.team'" name="model" />
<field eval="'direct_assign_leads'" name="function" />
</record>
<!-- Scheduler for Lead Scoring -->
<record forcecreate="True" id="ir_cron_lead_scoring" model="ir.cron">
<field name="name">Lead Scoring </field>
<field eval="False" name="active" />
<field name="user_id" ref="base.user_root" />
<field name="interval_number">1</field>
<field name="interval_type">hours</field>
<field name="numbercall">-1</field>
<field eval="False" name="doall" />
<field eval="'website.crm.score'" name="model" />
<field eval="'assign_scores_to_leads'" name="function" />
</record>
<record id="action_score_now" model="ir.actions.server">
<field name="name">Apply marked scores</field>
<field name="model_id" ref="model_website_crm_score"/>
<field name="state">code</field>
<field name="code">
self.assign_scores_to_leads(cr, uid, context['active_ids'], context)
</field>
</record>
<record id="ir_action_score_now" model="ir.values">
<field eval="'client_action_multi'" name="key2"/>
<field eval="'website.crm.score'" name="model"/>
<field name="name">Apply marked scores</field>
<field eval="'ir.actions.server,%d'%action_score_now" name="value"/>
</record>
<!-- Score Menu Item -->
<menuitem id="leads_menu" name="Leads Management" parent="base.menu_base_partner" groups="marketing.group_lead_automation_manager" sequence="98"/>
<!-- Action to display the leads that have a particular score -->
<record model="ir.actions.act_window" id="score_leads">
<field name="name">Leads</field>
<field name="res_model">crm.lead</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('score_ids', 'in', active_id)]</field>
</record>
<!-- Score Form View -->
<record model="ir.ui.view" id="view_crm_score_form">
<field name="name">Website Crm Score Form</field>
<field name="model">website.crm.score</field>
<field name="arch" type="xml">
<form string="Scores">
<sheet>
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" type="action"
name="%(score_leads)d" icon="fa-tags"
>
<field string="Leads" name="leads_count" widget="statinfo"/>
</button>
</div>
<div class="oe_title">
<h1>
<field name="name"/>
</h1>
</div>
<group>
<field name="value"/>
<field name="domain"/>
<field name="event_based"/>
<field name="running"/>
</group>
<button name="assign_scores_to_leads" type="object" string=" Score Now" class="oe_link"/>
</sheet>
</form>
</field>
</record>
<!-- Score Tree View -->
<record model="ir.ui.view" id="view_crm_score_tree">
<field name="name">Website Crm Score Tree</field>
<field name="model">website.crm.score</field>
<field name="arch" type="xml">
<tree string="Scores">
<field name="name"/>
<field name="value"/>
<field name="leads_count"/>
<field name="domain"/>
<field name="running"/>
</tree>
</field>
</record>
<!-- Score Action - tree - form -->
<record model="ir.actions.act_window" id="score_action">
<field name="name">Scores</field>
<field name="res_model">website.crm.score</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Score Menu Item -->
<menuitem id="scores_menu" name="Scoring Rules" parent="leads_menu" action="score_action" />
<!--
TEAM USER
-->
<!-- Team User From View -->
<record model="ir.ui.view" id="view_crm_team_user_form">
<field name="name">Team User Form</field>
<field name="model">team.user</field>
<field name="arch" type="xml">
<form string="Sales Men">
<sheet>
<h1>
<field name="user_id"/>
</h1>
<group>
<field name="team_id" readonly="context.get('ro_team', False)"/>
<label for="maximum_user_leads" String="Maximum Leads / 30 days" />
<div>
<field name="maximum_user_leads" class="oe_inline"/>
</div>
<!--<field name="team_user_domain" widget="char_domain" options="{'model': 'crm.lead'}"/>-->
<field name="team_user_domain" />
</group>
</sheet>
</form>
</field>
</record>
<!-- team User Tree View -->
<record model="ir.ui.view" id="view_crm_team_user_tree">
<field name="name">Team User Tree</field>
<field name="model">team.user</field>
<field name="arch" type="xml">
<tree string="Sales Men">
<field name="team_id"/>
<field name="user_id"/>
<field name="maximum_user_leads"/>
<field name="leads_count"/>
</tree>
</field>
</record>
<!-- Team User Kanban View -->
<record model="ir.ui.view" id="team_user_kanban">
<field name="name">team.user.kanban</field>
<field name="model">team.user</field>
<field name="arch" type="xml">
<kanban quick_create="false" create="true">
<field name="user_id"/>
<field name="running"/>
<templates>
<t t-name="kanban-box">
<table>
<tr>
<td>
<ul>
<li>
<a type="open">
<img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" class="oe_kanban_image"/>
</a>
</li>
<li>
<div style='text-align: center; padding: 4px;'>
<t t-if="record.running.raw_value === true">
<button name="toggle_active" type="object" style="
color: #eeeeee;
background-image: -webkit-gradient(linear, left top, left bottom, from(#3faf3f), to(#1a721a));">
<span class="fa fa-check"/>
</button>
</t>
<t t-if="record.running.raw_value === false">
<button name="toggle_active" type="object" style="
color: #eeeeee;
background-image: -webkit-gradient(linear, left top, left bottom, from(#df3f3f), to(#a21a1a));">
<span class="fa fa-times"/>
</button>
</t>
</div>
</li>
</ul>
</td>
<td>
<div class="oe_kanban_details">
<table>
<tr>
<td style='width: 240px'>
<ul>
<li><a type="open">
<b><field name="name"/></b>
</a></li>
<li><a type="open">
<field name="team_id"/>
</a></li>
</ul>
</td>
<td>
<field name="maximum_user_leads" invisible="1"/>
<field name="leads_count" widget="gauge"
style="width:108px; height: 81px; cursor: pointer;"
options="{'max_field': 'maximum_user_leads'}"/>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</t>
</templates>
</kanban>
</field>
</record>
<!-- Team User Action - form - tree -->
<record model="ir.actions.act_window" id="team_user_action">
<field name="name">Sales Men</field>
<field name="res_model">team.user</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to create a salesmen.
</p>
<p>
Link users to salesteam, set a per 30 days lead capacity for each of them and set filters to auto assign your leads.
</p>
</field>
</record>
<!-- Team User Menu Item -->
<menuitem id="team_user" name="Leads Assignation" parent="leads_menu" action="team_user_action" />
<!-- TEAM -->
<!-- Team Action - form - tree -->
<record model="ir.actions.act_window" id="team_action">
<field name="name">Sales Teams</field>
<field name="res_model">crm.team</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Team User Menu Item -->
<menuitem id="team" name="Teams Assignation" parent="leads_menu" action="team_action" />
<!-- LEAD DRY RUN -->
<!-- Lead dry run From View -->
<record model="ir.ui.view" id="view_crm_lead_dry_run_form">
<field name="name">Assignation Dry Run Form</field>
<field name="model">crm.leads.dry.run</field>
<field name="arch" type="xml">
<form string="Assignation Dry Run">
<sheet>
<h1>
<field name="lead_id"/>
</h1>
<group>
<field name="team_id"/>
<field name="user_id"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- Lead dry run Tree View -->
<record model="ir.ui.view" id="view_lead_dry_run_tree">
<field name="name">Assignation Dry Run tree</field>
<field name="model">crm.leads.dry.run</field>
<field name="arch" type="xml">
<tree string="Assignation Dry Run">
<field name="lead_id"/>
<field name="team_id"/>
<field name="user_id"/>
</tree>
</field>
</record>
<!-- Lead dry run Action - form - tree -->
<record model="ir.actions.act_window" id="lead_dry_run_action">
<field name="name">Assignation dry run</field>
<field name="res_model">crm.leads.dry.run</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Team User Menu Item -->
<menuitem id="leads_dry_run" name="Assignation dry run" parent="leads_menu" action="lead_dry_run_action" groups="base.group_no_one"/>
</data>
</openerp>
@@ -1,79 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<!--
PAGEVIEW
-->
<!-- PageView Search Filter on lead_id -->
<record id="crm_score_pageview_filter" model="ir.ui.view">
<field name="name">Website crm score pageviews</field>
<field name="model">website.crm.pageview</field>
<field name="arch" type="xml">
<search string="Search PageViews">
<field name="lead_id"/>
</search>
</field>
</record>
<!-- PageView Form View -->
<record model="ir.ui.view" id="crm_score_pageview_form">
<field name="name">website.crm.pageview.form</field>
<field name="model">website.crm.pageview</field>
<field name="arch" type="xml">
<form string="Page Views">
<sheet>
<h1>
<field name="url"/>
</h1>
<group>
<field name="lead_id"/>
<field name="user_id"/>
<field name="view_date"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- PageView Graph View -->
<record model="ir.ui.view" id="crm_score_pageview_graph">
<field name="name">website.crm.pageview.graph</field>
<field name="model">website.crm.pageview</field>
<field name="arch" type="xml">
<graph string="Page Views" type="bar">
<field name="url"/>
</graph>
</field>
</record>
<!-- PageView Tree View -->
<record model="ir.ui.view" id="website_crm_pageview_tree">
<field name="name">Website Pages Tree</field>
<field name="model">website.crm.pageview</field>
<field name="arch" type="xml">
<tree string="Page Views">
<field name="lead_id"/>
<field name="user_id"/>
<field name="url"/>
<field name="view_date"/>
</tree>
</field>
</record>
<!-- PageView Action - tree - form - graph -->
<record model="ir.actions.act_window" id="website_crm_score_pageviews">
<field name="name">Website Pages</field>
<field name="res_model">website.crm.pageview</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,graph</field>
<field name="search_view_id" ref="crm_score_pageview_filter"/>
</record>
<!-- PageView Menu Item -->
<menuitem id="pageview_menu" name="Scoring Page Views" parent="base.menu_sale_report" action="website_crm_score_pageviews" sequence="99"/>
</data>
</openerp>
-259
View File
@@ -1,259 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<!--
LEADS
-->
<!-- Crm Lead Search Filter - Language added -->
<record model="ir.ui.view" id="view_crm_case_leads_filter_inherit">
<field name="name">crm.lead.search.inherit</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.view_crm_case_leads_filter" />
<field name="arch" type="xml">
<field name="country_id" position="after">
<field name="lang_id"/>
<field name="score_ids"/>
</field>
</field>
</record>
<!-- Crm Lead Tree View - Score and Salesman added -->
<record model="ir.ui.view" id="lead_tree_view">
<field name="name">crm.lead.tree.inherit</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_case_tree_view_leads" />
<field name="arch" type="xml">
<field name="phone" position="after">
<field name="score" />
</field>
<field name="team_id" position="after">
<field name="user_id" />
</field>
</field>
</record>
<!-- Crm Lead Form View - PageViews, Score and Language added -->
<record model="ir.ui.view" id="lead_score_form">
<field name="name">crm.lead.form.inherit</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_case_form_view_leads" />
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button class="oe_stat_button" type="action"
name="%(website_crm_score_pageviews)d" icon="fa-tags"
context="{'search_default_lead_id': active_id, 'default_lead_id': active_id}">
<field string="Page views" name="pageviews_count" widget="statinfo"/>
</button>
</div>
<field name="priority" position="after">
<field name="score" />
</field>
<xpath expr="//group[@name='misc']" position="after">
<group string="Scoring">
<field name="score_ids"
widget="many2many_tags"
domain="[('object_id.model','=','crm.lead')]"
context="{'object_name': 'crm.lead'}"
readonly="1"
/>
<field name="lang_id" readonly="1"/>
</group>
</xpath>
</field>
</record>
<record model="ir.ui.view" id="score_opp_tree_view">
<field name="name">crm.lead.tree.opp.score.inherit</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_case_tree_view_oppor" />
<field name="arch" type="xml">
<field name="team_id" position="after">
<field name="score" />
</field>
</field>
</record>
<record model="ir.ui.view" id="score_opp_form_view">
<field name="name">crm.lead.form.opp.score.inherit</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_case_form_view_oppor" />
<field name="arch" type="xml">
<field name="priority" position="after">
<field name="score" />
</field>
<xpath expr="//group[@name='Misc']" position="after">
<group string="Scoring">
<field name="score_ids"
widget="many2many_tags"
domain="[('object_id.model','=','crm.lead')]"
context="{'object_name': 'crm.lead'}"
readonly="1"
/>
<field name="lang_id" readonly="1"/>
</group>
</xpath>
</field>
</record>
<!-- SALESTEAM -->
<!-- Graph view of leads via SalesTeam -->
<record model="ir.ui.view" id="crm_case_graph_view_leads_sales">
<field name="name">Unassigned leads</field>
<field name="model">crm.lead</field>
<field name="arch" type="xml">
<graph string="Opportunities" type="line">
<field name="create_date" type="row"/>
</graph>
</field>
</record>
<record model="ir.actions.act_window" id="crm_score_views_action_graph">
<field name="name">Unassigned leads</field>
<field name="res_model">crm.lead</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree,form</field>
<field name="view_id" ref="crm_case_graph_view_leads_sales"/>
</record>
<record model="ir.ui.view" id="crm_case_table_view_leads_sales">
<field name="name">Opportunities</field>
<field name="model">crm.lead</field>
<field name="arch" type="xml">
<graph string="Opportunities" type="pivot">
<field name="stage_id" type="col"/>
<field name="user_id" type="row"/>
</graph>
</field>
</record>
<record model="ir.actions.act_window" id="crm_score_views_action_table">
<field name="name">Opportunities</field>
<field name="res_model">crm.lead</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree,form</field>
<field name="view_id" ref="crm_case_table_view_leads_sales"/>
</record>
<!-- SalesTeam Form View - Lead information and page Assignation added -->
<record model="ir.ui.view" id="sales_team_form_view_assign">
<field name="name">crm.team.form.inherit</field>
<field name="model">crm.team</field>
<field name="inherit_id" ref="sales_team.crm_team_view_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" type="action"
name="%(crm_score_views_action_graph)d" icon="fa-tags"
context="{'search_default_team_id': active_id, 'search_default_unassigned': 1 }"
>
<field string="Unassigned leads" name="unassigned_leads" widget="statinfo"/>
</button>
<button class="oe_stat_button" type="action"
name="%(crm_score_views_action_table)d" icon="fa-tags"
context="{'search_default_team_id': active_id}"
>
<field string="Opportunities" name="leads_count" widget="statinfo"/>
</button>
</div>
</xpath>
<xpath expr="//group[@name='right']" position="inside">
<field name="score_team_domain" options="{'model': 'crm.lead'}"/>
<label for="assigned_leads"/>
<div>
<field name="assigned_leads" class="oe_inline"/> /
<field name="capacity" class="oe_inline"/>
</div>
<field name="min_for_assign" class="oe_inline"/>
</xpath>
<xpath expr="//page[@name='members']" position="replace">
<page string="Assignation">
<field name="team_user_ids" widget="one2many" mode="kanban" context="{'default_team_id':active_id, 'ro_team':True}">
<kanban>
<field name="user_id"/>
<field name="running"/>
<templates>
<t t-name="kanban-box">
<table>
<tr>
<td>
<ul>
<li>
<a type="open">
<img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" class="oe_kanban_image"/>
</a>
</li>
<li>
<div style='text-align: center; padding: 4px;'>
<t t-if="record.running.raw_value === true">
<button name="toggle_active" type="object" style="
color: #eeeeee;
background-image: -webkit-gradient(linear, left top, left bottom, from(#3faf3f), to(#1a721a));">
<span class="fa fa-check"/>
</button>
</t>
<t t-if="record.running.raw_value === false">
<button name="toggle_active" type="object" style="
color: #eeeeee;
background-image: -webkit-gradient(linear, left top, left bottom, from(#df3f3f), to(#a21a1a));">
<span class="fa fa-times"/>
</button>
</t>
</div>
</li>
</ul>
</td>
<td>
<div class="oe_kanban_details">
<table>
<tr>
<td style='width: 240px'>
<ul>
<li><a type="open">
<b><field name="name"/></b>
</a></li>
<li><field name="team_user_domain" widget='filters'/></li>
</ul>
</td>
<td>
<field name="maximum_user_leads" invisible="1"/>
<field name="leads_count" widget="gauge"
style="width:108px; height: 81px; cursor: pointer;"
options="{'max_field': 'maximum_user_leads'}"/>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</t>
</templates>
</kanban>
</field>
</page>
</xpath>
</field>
</record>
<record id="action_lead_dry_run" model="ir.actions.server">
<field name="name">Lead Dry Run</field>
<field name="model_id" ref="model_team_user"/>
<field name="state">code</field>
<field name="code">
self.pool['crm.leads.dry.run'].assign_leads(cr, uid, None, context=context)
</field>
</record>
<record id="ir_lead_dry_run" model="ir.values">
<field eval="'client_action_multi'" name="key2"/>
<field eval="'team.user'" name="model"/>
<field name="name">Launch Lead Dry Run</field>
<field eval="'ir.actions.server,%d'%action_lead_dry_run" name="value"/>
</record>
</data>
</openerp>
@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<template id="assets_editor" name="website_crm_score assets" inherit_id="website.assets_editor">
<xpath expr="." position="inside">
<script type="text/javascript" src="/website_crm_score/static/src/js/set_score.js"></script>
</xpath>
</template>
<template id="assets_backend" name="website_crm_score assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/website_crm_score/static/src/js/display_filters.js"></script>
</xpath>
</template>
</data>
</openerp>