Purpose: Having the res_group defined in base and sales_team auto installed with mail doens't make sense. - Move the empty res_config class and the related view from base_setup to sales_team (base_setup only contains the 'General Settings' model and views - Move the 'sale' related content from product to sale module (Access rights, menuitems,...) - Set sales_team at autoinstall False. The module is installed when needed by crm or sale for example - Set sales_team as a dependency of voip. (Access rights defined for configuration purpose) - Set sales_team ad a dependency of subscription (Access rights issue too) [FIX] account: move some ir.model.access to sale module [FIX] payment: Move some ir.rule to website_sale [FIX] stock: move some ir.model.access rule to sale_stock [FIX] project: Move some ir.model.access rules to crm_project_issue [FIX] mrp: Move some ir.model.access rules to sale_mrp [FIX] calendar: move some ir.model.access rules to crm Rename xmlids accordingly. Example: 'base.group_sale_manager' becomes sales_team.group_sale_manager. [ADD] sales_team: See own documents => See only his sales team Moved the "User: Own Leads Only", "User: All Leads" and "Manager" groups from sale and crm into sales_team module. Add the record rules so that user can see only his Own Sales Team if "See Own Leads" is sales right and can see all sales teams if he is having sales rights of "See All Leads" or manager.
83 lines
3.5 KiB
Python
83 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models, SUPERUSER_ID
|
|
from odoo.http import request
|
|
|
|
|
|
class UtmMedium(models.Model):
|
|
# OLD crm.case.channel
|
|
_name = 'utm.medium'
|
|
_description = 'Channels'
|
|
_order = 'name'
|
|
|
|
name = fields.Char(string='Channel Name', required=True)
|
|
active = fields.Boolean(default=True)
|
|
|
|
|
|
class UtmCampaign(models.Model):
|
|
# OLD crm.case.resource.type
|
|
_name = 'utm.campaign'
|
|
_description = 'Campaign'
|
|
|
|
name = fields.Char(string='Campaign Name', required=True, translate=True)
|
|
|
|
|
|
class UtmSource(models.Model):
|
|
_name = 'utm.source'
|
|
_description = 'Source'
|
|
|
|
name = fields.Char(string='Source Name', required=True, translate=True)
|
|
|
|
|
|
class UtmMixin(models.AbstractModel):
|
|
|
|
"""Mixin class for objects which can be tracked by marketing. """
|
|
_name = 'utm.mixin'
|
|
|
|
campaign_id = fields.Many2one('utm.campaign', 'Campaign',
|
|
help="This is a name that helps you keep track of your different campaign efforts Ex: Fall_Drive, Christmas_Special")
|
|
source_id = fields.Many2one('utm.source', 'Source',
|
|
help="This is the source of the link Ex:Search Engine, another domain,or name of email list")
|
|
medium_id = fields.Many2one('utm.medium', 'Medium',
|
|
help="This is the method of delivery.Ex: Postcard, Email, or Banner Ad", oldname='channel_id')
|
|
|
|
def tracking_fields(self):
|
|
# This function cannot be overridden in a model which inherit utm.mixin
|
|
# Limitation by the heritage on AbstractModel
|
|
# record_crm_lead.tracking_fields() will call tracking_fields() from module utm.mixin (if not overridden on crm.lead)
|
|
# instead of the overridden method from utm.mixin.
|
|
# To force the call of overridden method, we use self.pool['utm.mixin'].tracking_fields() which respects overridden
|
|
# methods of utm.mixin, but will ignore overridden method on crm.lead
|
|
return [
|
|
# ("URL_PARAMETER", "FIELD_NAME_MIXIN", "NAME_IN_COOKIES")
|
|
('utm_campaign', 'campaign_id', 'odoo_utm_campaign'),
|
|
('utm_source', 'source_id', 'odoo_utm_source'),
|
|
('utm_medium', 'medium_id', 'odoo_utm_medium'),
|
|
]
|
|
|
|
@api.model
|
|
def default_get(self, fields):
|
|
values = super(UtmMixin, self).default_get(fields)
|
|
|
|
# We ignore UTM for salemen, except some requests that could be done as superuser_id to bypass access rights.
|
|
if self.env.uid != SUPERUSER_ID and self.env.user.has_group('sales_team.group_sale_salesman'):
|
|
return values
|
|
|
|
for url_param, field_name, cookie_name in self.env['utm.mixin'].tracking_fields():
|
|
if field_name in fields:
|
|
field = self._fields[field_name]
|
|
value = False
|
|
if request:
|
|
# ir_http dispatch saves the url params in a cookie
|
|
value = request.httprequest.cookies.get(cookie_name)
|
|
# if we receive a string for a many2one, we search/create the id
|
|
if field.type == 'many2one' and isinstance(value, basestring) and value:
|
|
Model = self.env[field.comodel_name]
|
|
records = Model.search([('name', '=', value)], limit=1)
|
|
if not records:
|
|
records = Model.create({'name': value})
|
|
value = records.id
|
|
values[field_name] = value
|
|
return values
|