TypeError: int() argument must be a string or a number, not 'list' - Odoo v8 to Odoo v10 community

TypeError: int() argument must be a string or a number, not 'list' - Odoo v8 to Odoo v10 community

我有这个方法:

@api.multi
def new_open_window(self, list_ids, xml_id, module):
    """ Generate new window at view form or tree
    """
    mod_obj = self.env['ir.model.data']
    act_obj = self.env['ir.actions.act_window']
    result = mod_obj._get_id(module, xml_id) 
    imd_id = mod_obj.browse(result)['res_id']
    result = act_obj.browse(imd_id)
    result['res_id'] 
    return result

现在,我点击一个按钮,它像这样调用这个函数return self.new_open_window([inv_id], 'action_invoice_tree1', 'account')完整的方法如下所示:

@api.multi
def create_invoice(self): 
    """ Create a invoice refund
    """
    #context = context or {}
    wizard_brw = self.browse() 
    inv_id = self._context.get('active_id')
    for wizard in wizard_brw:
        if not wizard.sure:
            raise UserError(
                _("Validation error!"),
                _("Please confirm that you know what you're doing by"
                  " checking the option bellow!"))
        if (wizard.invoice_id and wizard.invoice_id.company_id.jour_id and
                wizard.invoice_id and wizard.invoice_id.company_id.acc_id):
            inv_id = self.action_invoice_create(wizard,
                                                wizard.invoice_id) 
        else:
            raise UserError(
                _('Validation error!'),
                _("You must go to the company form and configure a journal"
                  " and an account for damaged invoices"))
    return self.new_open_window([inv_id], 'action_invoice_tree1', 'account')

但它不加载任何东西,在方法 new_open_window 之前看起来像这样:

@api.multi
def new_open_window(self, list_ids, xml_id, module): #cr, uid, ids, list_ids, xml_id, module,  context=None
    """ Generate new window at view form or tree
    """
    mod_obj = self.env['ir.model.data']
    act_obj = self.env['ir.actions.act_window']
    result = mod_obj._get_id(module, xml_id) #cr, uid was first
    imd_id = mod_obj.browse(result)['res_id']#['res_id'] #cr, uid were first was read() before #(result, ['res_id'])
    result = act_obj.browse(imd_id) # cr, uid were first was read() before
    result['res_id'] = list_ids
    return result

但是 list_ids 给我扔了这个:

Traceback (most recent call last):
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 638, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 675, in dispatch
result = self._call_function(**self.params)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 331, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/service/model.py", line 119, in wrapper
return f(dbname, *args, **kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 324, in checked_call
result = self.endpoint(*a, **kw)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 933, in __call__
return self.method(*args, **kw)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 504, in response_wrap
response = f(*args, **kw)
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/web/controllers/main.py", line 866, in call_button
action = self._call_kw(model, method, args, {})
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/web/controllers/main.py", line 854, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/api.py", line 681, in call_kw
return call_kw_multi(method, model, args, kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/api.py", line 672, in call_kw_multi
result = method(recs, *args, **kwargs)
File "/home/kristian/odoov10/gilda/l10n_ve_fiscal_requirements/wizard/wizard_invoice_nro_ctrl.py", line 139, in create_invoice
return self.new_open_window([inv_id], 'action_invoice_tree1', 'account') 
File "/home/kristian/odoov10/gilda/l10n_ve_fiscal_requirements/wizard/wizard_invoice_nro_ctrl.py", line 114, in new_open_window
result['res_id'] = list_ids
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/models.py", line 5180, in __setitem__
return self._fields[key].__set__(self, value)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/fields.py", line 878, in __set__
value = self.convert_to_cache(value, record)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/fields.py", line 1109, in convert_to_cache
return int(value or 0)
TypeError: int() argument must be a string or a number, not 'list'

问题出在这一行 result['res_id'] = list_ids 上,但现在它不会抛出任何错误但它不起作用,它只是保持不变 window 并且不会重写任何发票.

在这两个函数之前创建发票的方法现在如下所示:

@api.multi
def action_invoice_create(self, wizard_brw, inv_brw): #cr, uid, ids, wizard_brw, inv_brw, context=None
    """
    If the invoice has control number, this function is responsible for
    passing the bill to damaged paper
    @param wizard_brw: nothing for now
    @param inv_brw: damaged paper
    """
    invoice_line_obj = self.env['account.invoice.line']
    invoice_obj = self.env['account.invoice']
    acc_mv_obj = self.env['account.move']
    acc_mv_l_obj = self.env['account.move.line']
    tax_obj = self.env['account.invoice.tax']
    invoice = {}
    if inv_brw.nro_ctrl:
        invoice.update({
            'name': 'PAPELANULADO_NRO_CTRL_%s' % (
                inv_brw.nro_ctrl and inv_brw.nro_ctrl or ''),
            'state': 'paid',
            'tax_line': [],
        })
    else:
        raise UserError(
            _('Validation error!'),
            _("You can run this process just if the invoice have Control"
              " Number, please verify the invoice and try again."))
    inv_brw.write(invoice) 
    inv_brw.invoice_line_ids.write({
        'quantity' : 0.0,
        'invoice_line_tax_id' : [],
        'price_unit' : 0.0
    }) 

    taxes = self.env['account.tax'].search([]) 
    invoice_taxes = tax_obj.search(
        [('invoice_id', '=', inv_brw and inv_brw.id)]).unlink()
    move = inv_brw.move_id 

    if move: #if move_id:
        move.button_cancel() 
        move.ref = 'Damanged Paper' 
        move.line_ids.unlink() 
    return inv_brw.id

有什么想法吗?

编辑

这是原来的new_open_window方法:

def new_open_window(self, cr, uid, ids, list_ids, xml_id, module,
                    context=None):
    """ Generate new window at view form or tree
    """
    mod_obj = self.pool.get('ir.model.data')
    act_obj = self.pool.get('ir.actions.act_window')
    result = mod_obj._get_id(cr, uid, module, xml_id)
    imd_id = mod_obj.read(cr, uid, result, ['res_id'])['res_id']
    result = act_obj.read(cr, uid, imd_id)
    result['res_id'] = list_ids
    return result

问题在这里:

 result['res_id'] = list_ids

我认为 res_id 应该是一个整数而不是像你给的那样的列表,如果你只想在表单视图中显示它那么你只需要在 res_id 中传递一个 id。但是如果你想传递更多的记录然后使用域而不是 res_id.

result['domain'] = [('id', 'in' , list_ids)]

这样只会显示与域相关的记录

res_id is used when you need to edit a record only one record if you want more use domain

我会像这样迁移方法:

@api.multi
def new_open_window(list_ids, xml_id, module)
    """ Generate new window at view form or tree """
    action = self.env.ref("{}.{}".format(module, xml_id))
    result = action.read()[0]
    if isinstance(list_ids, (list, tuple)):
        result['domain'] = [('id', 'in', list_ids)]
    else:
        result['res_id'] = list_ids
    return result

ref 将获取操作的记录。 read 是一种多记录方法,将 return 字典列表。最后我添加了@Charif 的有趣提示。