[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.
This commit is contained in:
Jeremy Kersten
2016-02-01 12:16:43 +01:00
parent 0de35ffa7f
commit 22c80fff6e
+7 -1
View File
@@ -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):