Search code examples
odooodoo-10

How to update/ delete a key from a context in Odoo 10?


Hi i am trying to delete a key value from the context for res.partner form view.

I opening the partner form view using controller function and trying to set phone number as default and its working fine. But when i try to create a new customer by clicking on the create button the phone number again auto-filled. In order to avoid this behaviour, in default_get function, i copied the context into another variable, removed the key value from the context using del context['cc_mobile']. And reassigned to self.env.context. But when i try to create a new customer, the deleted key value comes in the context again.

Controller.py

@http.route('/open_customer/<string:val>', type="http",method=['POST','GET'],website=False, auth="public")
def open_case_window(self,**kw):
    mobile_no = kw.get('val')
    action = request.env.ref('base.action_partner_form').sudo()
    mobile_flag = 0
    partner = 'res.partner'
    partner_model = request.env[partner]
    regex = re.match( '^(?:\01|02|03|04|06|07|09)\d*$', mobile_no)
    if regex:
        mobile_flag = 0
        partner_id = partner_model.search([('phone', '=', mobile_no)]).id
    else:
        mobile_flag = 1
        partner_id = partner_model.search([('mobile','=',mobile_no)]).id

    if partner_id:
        return werkzeug.utils.redirect('/web#id='+str(partner_id)+'&view_type=form&model='+partner)
    else:
        context = dict(action._context)
        if mobile_flag == 0:
            context.update({'cc_phone': mobile_no})
        else:
            context.update({'cc_mobile': mobile_no})
        context.pop('lang')
        url = werkzeug.utils.redirect('/web?debug=#view_type=form&model='+str(partner)+'&action=%s'%(action.id))
        return url

ResPartner.py

 @api.model
def default_get(self, fields):
    context = self.env.context.copy()
    print'default_get context',context
    res = super(Partner, self).default_get(fields)
    if 'cc_mobile' in context:
        res.update({'mobile':context.get('cc_mobile')})
    if 'cc_phone' in context:
        res.update({'phone':context.get('cc_phone')})
    if context.get('cc_mobile'):
        del context['cc_mobile']
    if context.get('cc_phone'):
        del context['cc_phone']
    self.env.context = context
    print'self.env.context after',self.env.context
    action = self.env.ref('base.action_partner_form').sudo()
    action.env.context = self.env.context
    return res

Solution

  • You cannot remove a key of action context from python side, because it's in the client side. when ever you call the server like search in many2one field, create a record in fly you will see this context comeback again every time (The way Odoo work).

    What you need is something that will be used for one time, I think you need some kind of persistence for example:

    1. dummy model that contains user_id, model_name, value, active fields so in the controller you create a record for default value for that specific user.

    2. get that value by overriding default_get by searching with user_id and model_name field and hide that value or delete it.

    this way when yo hit create button or create contact in fly when you search for the value it will be gone so it will not be used a second time.

    This a simple Idea and easy to implement, you need to handle some cases to prevent user from saving two default value if some interruption happens should not be hard.

    Edit

    After second thought to prevent any error when you create a record just pass it's ID in the context with a special key, then use That Id to retrieve it, use it then delete it. easier, safer and no need for search.