From cd53cea32b6e5b9f3b1a15bd803bccc81b17243b Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Fri, 28 Aug 2015 16:49:46 +0200 Subject: [PATCH] [REM] website_crm_score: moved to enterprise --- .tx/config | 5 - addons/website_crm_score/__init__.py | 3 - addons/website_crm_score/__openerp__.py | 29 -- .../website_crm_score/controllers/__init__.py | 2 - addons/website_crm_score/controllers/main.py | 131 ------ .../demo/website_crm_score_demo.xml | 279 ----------- .../i18n/website_crm_score.pot | 436 ------------------ addons/website_crm_score/models/__init__.py | 7 - addons/website_crm_score/models/crm_lead.py | 90 ---- addons/website_crm_score/models/ir.py | 30 -- .../website_crm_score/models/leads_dry_run.py | 32 -- addons/website_crm_score/models/pageview.py | 50 -- addons/website_crm_score/models/sales_team.py | 266 ----------- .../models/website_crm_score.py | 91 ---- .../security/ir.model.access.csv | 7 - .../static/description/icon.png | Bin 23008 -> 0 bytes .../static/src/js/display_filters.js | 100 ---- .../static/src/js/set_score.js | 66 --- .../static/src/xml/track_page.xml | 18 - addons/website_crm_score/tests/__init__.py | 2 - addons/website_crm_score/tests/common.py | 153 ------ addons/website_crm_score/tests/test_assign.py | 35 -- .../website_crm_score/tests/test_dry_run.py | 66 --- .../website_crm_score/tests/test_pageview.py | 26 -- addons/website_crm_score/views/marketing.xml | 307 ------------ addons/website_crm_score/views/reporting.xml | 79 ---- addons/website_crm_score/views/sales.xml | 259 ----------- .../views/website_crm_score.xml | 18 - 28 files changed, 2587 deletions(-) delete mode 100644 addons/website_crm_score/__init__.py delete mode 100644 addons/website_crm_score/__openerp__.py delete mode 100644 addons/website_crm_score/controllers/__init__.py delete mode 100644 addons/website_crm_score/controllers/main.py delete mode 100644 addons/website_crm_score/demo/website_crm_score_demo.xml delete mode 100644 addons/website_crm_score/i18n/website_crm_score.pot delete mode 100644 addons/website_crm_score/models/__init__.py delete mode 100644 addons/website_crm_score/models/crm_lead.py delete mode 100644 addons/website_crm_score/models/ir.py delete mode 100644 addons/website_crm_score/models/leads_dry_run.py delete mode 100644 addons/website_crm_score/models/pageview.py delete mode 100644 addons/website_crm_score/models/sales_team.py delete mode 100644 addons/website_crm_score/models/website_crm_score.py delete mode 100644 addons/website_crm_score/security/ir.model.access.csv delete mode 100644 addons/website_crm_score/static/description/icon.png delete mode 100644 addons/website_crm_score/static/src/js/display_filters.js delete mode 100644 addons/website_crm_score/static/src/js/set_score.js delete mode 100644 addons/website_crm_score/static/src/xml/track_page.xml delete mode 100644 addons/website_crm_score/tests/__init__.py delete mode 100644 addons/website_crm_score/tests/common.py delete mode 100644 addons/website_crm_score/tests/test_assign.py delete mode 100644 addons/website_crm_score/tests/test_dry_run.py delete mode 100644 addons/website_crm_score/tests/test_pageview.py delete mode 100644 addons/website_crm_score/views/marketing.xml delete mode 100644 addons/website_crm_score/views/reporting.xml delete mode 100644 addons/website_crm_score/views/sales.xml delete mode 100644 addons/website_crm_score/views/website_crm_score.xml diff --git a/.tx/config b/.tx/config index 6007fc5b600..fc97ad0ea3f 100644 --- a/.tx/config +++ b/.tx/config @@ -1042,11 +1042,6 @@ file_filter = addons/website_crm_partner_assign/i18n/.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/.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/.po source_file = addons/website_customer/i18n/website_customer.pot diff --git a/addons/website_crm_score/__init__.py b/addons/website_crm_score/__init__.py deleted file mode 100644 index 14ce547a094..00000000000 --- a/addons/website_crm_score/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -import models -import controllers diff --git a/addons/website_crm_score/__openerp__.py b/addons/website_crm_score/__openerp__.py deleted file mode 100644 index 1bd8fe4e7d7..00000000000 --- a/addons/website_crm_score/__openerp__.py +++ /dev/null @@ -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, -} diff --git a/addons/website_crm_score/controllers/__init__.py b/addons/website_crm_score/controllers/__init__.py deleted file mode 100644 index a84d81a791b..00000000000 --- a/addons/website_crm_score/controllers/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- -import main diff --git a/addons/website_crm_score/controllers/main.py b/addons/website_crm_score/controllers/main.py deleted file mode 100644 index fe983c98d37..00000000000 --- a/addons/website_crm_score/controllers/main.py +++ /dev/null @@ -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/', 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/', 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 += '
%s: %s' % (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('%s' % (url_encoded, url_encoded)) - body = '
'.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 diff --git a/addons/website_crm_score/demo/website_crm_score_demo.xml b/addons/website_crm_score/demo/website_crm_score_demo.xml deleted file mode 100644 index 86e76fb2edd..00000000000 --- a/addons/website_crm_score/demo/website_crm_score_demo.xml +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - [['country_id', '=', 'France']] - - - [['country_id', '=', 'Belgium']] - - - - - Toni Buchanan - Toni.Buchanan@yourcompany.com - - - none - Vivegnis - 4683 - - Rue Cesar de Paepe, 43 - - - - tbuchanan - tbuchanan - - - - - Frances Pierce - Frances.Pierce@yourcompany.com - - - none - Oakland - 94612 - - 4850 Clifford Street - - - - fpierce - fpierce - - - - - Camille Watkins - Camille.Watkins@yourcompany.com - - - none - Houston - 77036 - - 181 Swick Hill Street - - - - cwatkins - cwatkins - - - - - Judy Garza - Judy.Garza@yourcompany.example.com - - - none - Daytona Beach - 32114 - - 763 Melm Street - - - - jgarza - jgarza - - - - - - - - - - 2 - ['|', ['country_id', '=', 'Belgium'], ['country_id', '=', 'France']] - - - - - 1 - [['country_id', '!=', 'Belgium']] - - - - - - - 1 - - - - - 2 - ['&', ['lang_id', '=', 'English'], ['country_id', '=', 'Belgium']] - - - - - - - 1 - - - - - - - 3 - [['country_id', '=', 'France']] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Belgium Score - 8 - [['country_id', '=', 'Belgium']] - - - English Score - 4 - [['lang_id', '=', 'English']] - - - France Score - 2 - [['country_id', '=', 'France']] - - - Anti-China Score - 1 - [['country_id', '!=', 'China']] - - - Homepage Score - 2 - [['score_pageview_ids.url', 'ilike', '%/page/homepage']] - - - Aboutus Score - 8 - [['score_pageview_ids.url', 'ilike', '%/page/website.aboutus']] - - - Email - 8 - [['email_from', '!=', False]] - - - US Score - 4 - [['country_id', '=', 'United States']] - - - - diff --git a/addons/website_crm_score/i18n/website_crm_score.pot b/addons/website_crm_score/i18n/website_crm_score.pot deleted file mode 100644 index a1760b3aa18..00000000000 --- a/addons/website_crm_score/i18n/website_crm_score.pot +++ /dev/null @@ -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 "" - diff --git a/addons/website_crm_score/models/__init__.py b/addons/website_crm_score/models/__init__.py deleted file mode 100644 index e72a5602e0f..00000000000 --- a/addons/website_crm_score/models/__init__.py +++ /dev/null @@ -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 diff --git a/addons/website_crm_score/models/crm_lead.py b/addons/website_crm_score/models/crm_lead.py deleted file mode 100644 index 47e84cb8248..00000000000 --- a/addons/website_crm_score/models/crm_lead.py +++ /dev/null @@ -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) diff --git a/addons/website_crm_score/models/ir.py b/addons/website_crm_score/models/ir.py deleted file mode 100644 index e1240551be1..00000000000 --- a/addons/website_crm_score/models/ir.py +++ /dev/null @@ -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") diff --git a/addons/website_crm_score/models/leads_dry_run.py b/addons/website_crm_score/models/leads_dry_run.py deleted file mode 100644 index c26df8a3135..00000000000 --- a/addons/website_crm_score/models/leads_dry_run.py +++ /dev/null @@ -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; - """) diff --git a/addons/website_crm_score/models/pageview.py b/addons/website_crm_score/models/pageview.py deleted file mode 100644 index 198f56e38d1..00000000000 --- a/addons/website_crm_score/models/pageview.py +++ /dev/null @@ -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 = '%s' % (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 diff --git a/addons/website_crm_score/models/sales_team.py b/addons/website_crm_score/models/sales_team.py deleted file mode 100644 index 432ccc14ac3..00000000000 --- a/addons/website_crm_score/models/sales_team.py +++ /dev/null @@ -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) diff --git a/addons/website_crm_score/models/website_crm_score.py b/addons/website_crm_score/models/website_crm_score.py deleted file mode 100644 index 22c8854d204..00000000000 --- a/addons/website_crm_score/models/website_crm_score.py +++ /dev/null @@ -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() diff --git a/addons/website_crm_score/security/ir.model.access.csv b/addons/website_crm_score/security/ir.model.access.csv deleted file mode 100644 index 2a2e86eef56..00000000000 --- a/addons/website_crm_score/security/ir.model.access.csv +++ /dev/null @@ -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 \ No newline at end of file diff --git a/addons/website_crm_score/static/description/icon.png b/addons/website_crm_score/static/description/icon.png deleted file mode 100644 index d668394483683ad68a14797e8116689c620f1fe2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23008 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 ::= - ::= | '!' | - ::= '&' | '|' - ::= '(' ',' ',' ')' - ::= '=' | '!=' | '<=' | '<' | '>' | '>=' | '=?' | - '=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 = 'Domain too big'; - 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 = ''+ tag +''; - return [i+1, span]; - } - else if (a === '!'){ - var res = this.interpret(val, i+1); - var 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); - -}); diff --git a/addons/website_crm_score/static/src/js/set_score.js b/addons/website_crm_score/static/src/js/set_score.js deleted file mode 100644 index f5cc2cfafe8..00000000000 --- a/addons/website_crm_score/static/src/js/set_score.js +++ /dev/null @@ -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 = $(''); - 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()]); - } - }, -}); - -}); diff --git a/addons/website_crm_score/static/src/xml/track_page.xml b/addons/website_crm_score/static/src/xml/track_page.xml deleted file mode 100644 index 18d67a6251e..00000000000 --- a/addons/website_crm_score/static/src/xml/track_page.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - -
-

4. Track Page to better score your leads: - -

-
-
-
-
- -
- diff --git a/addons/website_crm_score/tests/__init__.py b/addons/website_crm_score/tests/__init__.py deleted file mode 100644 index 85d844a6e81..00000000000 --- a/addons/website_crm_score/tests/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- -from . import test_assign, test_dry_run, test_pageview diff --git a/addons/website_crm_score/tests/common.py b/addons/website_crm_score/tests/common.py deleted file mode 100644 index b76cf666dc4..00000000000 --- a/addons/website_crm_score/tests/common.py +++ /dev/null @@ -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() diff --git a/addons/website_crm_score/tests/test_assign.py b/addons/website_crm_score/tests/test_assign.py deleted file mode 100644 index 393dfeaf735..00000000000 --- a/addons/website_crm_score/tests/test_assign.py +++ /dev/null @@ -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') diff --git a/addons/website_crm_score/tests/test_dry_run.py b/addons/website_crm_score/tests/test_dry_run.py deleted file mode 100644 index d4e7a59eb4d..00000000000 --- a/addons/website_crm_score/tests/test_dry_run.py +++ /dev/null @@ -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') diff --git a/addons/website_crm_score/tests/test_pageview.py b/addons/website_crm_score/tests/test_pageview.py deleted file mode 100644 index 994eb3f5506..00000000000 --- a/addons/website_crm_score/tests/test_pageview.py +++ /dev/null @@ -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' - ) diff --git a/addons/website_crm_score/views/marketing.xml b/addons/website_crm_score/views/marketing.xml deleted file mode 100644 index c747ce5f4f9..00000000000 --- a/addons/website_crm_score/views/marketing.xml +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - - - - Lead Assignation - - - 1 - days - -1 - - - - - - - - Lead Scoring - - - 1 - hours - -1 - - - - - - - Apply marked scores - - code - - self.assign_scores_to_leads(cr, uid, context['active_ids'], context) - - - - - - - Apply marked scores - - - - - - - - - Leads - crm.lead - form - tree,form - [('score_ids', 'in', active_id)] - - - - - Website Crm Score Form - website.crm.score - -
- -
- -
-
-

- -

-
- - - - - - - - - - - - - - - - - - -
- - - crm.lead.tree.opp.score.inherit - crm.lead - - - - - - - - - - crm.lead.form.opp.score.inherit - crm.lead - - - - - - - - - - - - - - - - - - - Unassigned leads - crm.lead - - - - - - - - - Unassigned leads - crm.lead - form - graph,tree,form - - - - - Opportunities - crm.lead - - - - - - - - - - Opportunities - crm.lead - form - graph,tree,form - - - - - - crm.team.form.inherit - crm.team - - - -
- - -
-
- - - - - - - - - - - - - - - - -
-
    -
  • - - - -
  • -
  • -
    - - - - - - -
    -
  • -
-
-
- - - - - -
- - - - -
-
-
-
-
-
-
-
-
-
-
- - - Lead Dry Run - - code - - self.pool['crm.leads.dry.run'].assign_leads(cr, uid, None, context=context) - - - - - - - Launch Lead Dry Run - - - -
-
diff --git a/addons/website_crm_score/views/website_crm_score.xml b/addons/website_crm_score/views/website_crm_score.xml deleted file mode 100644 index 13409af1507..00000000000 --- a/addons/website_crm_score/views/website_crm_score.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - -