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 的有趣提示。
我有这个方法:
@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 的有趣提示。