NeoVe NeoVe - 1 month ago 16
JSON Question

TypeError(repr(o) + " is not JSON serializable") - Odoo v8

I have this method, which calls for a document associated with an invoice on Odoo v8.

@api.multi
def button_generate_wh_doc(self):
context = self._context
partner = self.env['res.partner']
res = {}
for inv in self:
view_id = self.env['ir.ui.view'].search([
('name', '=', 'account.invoice.wh.iva.customer')])
context = self.env.context.copy()
context.update({'domain':[(
('invoice_id','=',inv.id),
('type','=',inv.type),
('default_partner_id','=', partner._find_accounting_partner(
inv.partner_id).id),
('default_name' ,'=', inv.name or inv.number),
('view_id' ,'=', view_id))]})
res = {
'name': _('Withholding vat customer'),
'type': 'ir.actions.act_window',
'res_model': 'account.wh.iva',
'view_type': 'form',
'view_id': False,
'view_mode': 'form',
'nodestroy': True,
'target': 'current',
'domain': "[('type', '=', '" + inv.type + "')]",
'context': context
}
return res


But everytime I call this from button it throws me this:

Traceback (most recent call last):
File "/home/kristian/odoov8/odoo-8.0-20161017/openerp/http.py", line 544, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/home/kristian/odoov8/odoo-8.0-20161017/openerp/http.py", line 595, in dispatch
return self._json_response(result)
File "/home/kristian/odoov8/odoo-8.0-20161017/openerp/http.py", line 533, in _json_response
body = simplejson.dumps(response)
File "/usr/local/lib/python2.7/dist-packages/simplejson/__init__.py", line 366, in dumps
return _default_encoder.encode(obj)
File "/usr/local/lib/python2.7/dist-packages/simplejson/encoder.py", line 269, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/local/lib/python2.7/dist-packages/simplejson/encoder.py", line 348, in iterencode
return _iterencode(o, 0)
File "/usr/local/lib/python2.7/dist-packages/simplejson/encoder.py", line 246, in default
raise TypeError(repr(o) + " is not JSON serializable")


I've read this answer

But I'm still not sure about it, it could be because of the
domain
where I'm working this on?

Answer

The domain you passing in res has to be list of tuple and not list of tuple of string, check below code :

@api.multi
def button_generate_wh_doc(self):
    context = self._context
    partner = self.env['res.partner']
    res = {}
    for inv in self:
        view_id = self.env['ir.ui.view'].search([
            ('name', '=', 'account.invoice.wh.iva.customer')])
        context = self.env.context.copy()
        context.update({
            'domain':[
                ('invoice_id','=',inv.id),
                ('type','=',inv.type),
                ('default_partner_id','=', partner._find_accounting_partner(inv.partner_id).id),
                ('default_name' ,'=', inv.name or inv.number),
                ('view_id' ,'=', view_id[0].id)
            ]
        })
    return {
        'name': _('Withholding vat customer'),
        'type': 'ir.actions.act_window',
        'res_model': 'account.wh.iva',
        'view_type': 'form',
        'view_id': False,
        'view_mode': 'form',
        'target': 'current',
        'domain': [('type', '=', inv.type )],
        'context': context,
    }