2017-03-24 46 views
0

我有这样的方法:类型错误:int()函数的参数必须是字符串或数字,而不是“名单” - Odoo的V8 Odoo V10社区

@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,但现在它不会引发任何错误,但它不工作,它只是停留在同一窗口,并没有按”重写任何发票。

它创建它现在是第一位的这两个函数之前发票的方法是这样的:

@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 
+1

为什么当你调用'self.new_open_window([inv_id],'action_invoice_tree1','account')''时,会把'inv_id'放入列表中?也许它应该是'self.new_open_window(inv_id,'action_invoice_tree1','account')' – Barmar

+0

不,还是一样,没有新窗口,它什么都不做,这是来自我正在迁移的模块,但是这是一种模糊的代码 – NeoVe

+1

您能否在这里添加真实的原点方法?要打开弹出窗口,您需要返回字典而不是窗口操作记录。这就是为什么在原始方法中有读取。 – CZoellner

回答

2

我会喜欢迁移方法:

@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是一种多记录方法,将返回一个字典列表。最后,我添加了@ Charif的有趣提示。

+0

非常感谢,它给了一些其他问题,但我会为此打开另一个问题 – NeoVe

1

的问题是在这里:

result['res_id'] = list_ids 

我认为RES_ID应该是一个整数,不喜欢你的列表如果你想在表单视图中显示它,那么你只需要在res_id中传递一个id。但是如果你想传递更多的记录,那么使用domain not res_id。

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

这种方式仅记载,muches域将显示

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

+0

嗨,谢谢你,同样的问题在这里,当我去发票时,它也给了我一个无效的扩展叶子:/ – NeoVe

+0

Charif忘掉了括号。域条目必须是元组(三元组)。我编辑过它。 – CZoellner

+0

是无效的叶总是关于域中的语法错误 – Cherif

相关问题