diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/utm/models/utm_mixin.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/utm/models/utm_mixin.py')
| -rw-r--r-- | addons/utm/models/utm_mixin.py | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/addons/utm/models/utm_mixin.py b/addons/utm/models/utm_mixin.py new file mode 100644 index 00000000..b74d3385 --- /dev/null +++ b/addons/utm/models/utm_mixin.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models +from odoo.http import request + + +class UtmMixin(models.AbstractModel): + """ Mixin class for objects which can be tracked by marketing. """ + _name = 'utm.mixin' + _description = 'UTM Mixin' + + campaign_id = fields.Many2one('utm.campaign', 'Campaign', + help="This is a name that helps you keep track of your different campaign efforts, e.g. Fall_Drive, Christmas_Special") + source_id = fields.Many2one('utm.source', 'Source', + help="This is the source of the link, e.g. Search Engine, another domain, or name of email list") + medium_id = fields.Many2one('utm.medium', 'Medium', + help="This is the method of delivery, e.g. Postcard, Email, or Banner Ad") + + @api.model + def default_get(self, fields): + values = super(UtmMixin, self).default_get(fields) + + # We ignore UTM for salesmen, except some requests that could be done as superuser_id to bypass access rights. + if not self.env.is_superuser() 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, str) and value: + Model = self.env[field.comodel_name] + records = Model.search([('name', '=', value)], limit=1) + if not records: + if 'is_website' in records._fields: + records = Model.create({'name': value, 'is_website': True}) + else: + records = Model.create({'name': value}) + value = records.id + if value: + values[field_name] = value + return values + + 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.env['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'), + ] |
