From 22c80fff6e98e4529a55f03c9ab2602c3361d2df Mon Sep 17 00:00:00 2001 From: Jeremy Kersten Date: Fri, 29 Jan 2016 14:20:00 +0100 Subject: [PATCH] [FIX] utm: use tracking_fields from utm.mixin and not from the current model 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 Eg: class utm_mixin(osv.AbstractModel): _name = 'utm.mixin' def tracking_fields(self): return "A" class utm_mixin_overridden(osv.AbstractModel): _inherit = 'utm.mixin' def tracking_fields(self): return "B" class crm_lead(osv.osv): _name = "crm.lead" _inherit = ['utm.mixin'] def func_1(self): print self.tracking_fields() # print "A" def func_2(self): print self.pool['utm.mixin'].tracking_fields() # print "B" It's the dispatch method of ir_http which save GET parameters in cookies, ignoring the overridden tracking_fields method in inherited model. --- addons/utm/models/utm.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/addons/utm/models/utm.py b/addons/utm/models/utm.py index 3168d9255b0..248c2719dc3 100644 --- a/addons/utm/models/utm.py +++ b/addons/utm/models/utm.py @@ -50,6 +50,12 @@ class utm_mixin(osv.AbstractModel): } 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'), @@ -58,7 +64,7 @@ class utm_mixin(osv.AbstractModel): ] def tracking_get_values(self, cr, uid, vals, context=None): - for key, fname, cook in self.tracking_fields(): + for key, fname, cook in self.pool['utm.mixin'].tracking_fields(): field = self._fields[fname] value = vals.get(fname) or (request and request.httprequest.cookies.get(cook)) # params.get should be always in session by the dispatch from ir_http if field.type == 'many2one' and isinstance(value, basestring):