Python Odoo-用新api覆盖旧api方法?
我试图覆盖Python Odoo-用新api覆盖旧api方法?,python,odoo,python-decorators,Python,Odoo,Python Decorators,我试图覆盖compute\u return方法,但出现了一个错误。我用错装饰器了吗?(尝试过,模型,多个和一个,但每一个都给出了一个错误)。 例如,这样做: @api.model def compute_refund(mode='refund'): inv_ids = self.env.context.get('active_ids', []) for invoice in self.env['account.invoice'].browse(inv_ids):
compute\u return
方法,但出现了一个错误。我用错装饰器了吗?(尝试过,模型
,多个
和一个
,但每一个都给出了一个错误)。
例如,这样做:
@api.model
def compute_refund(mode='refund'):
inv_ids = self.env.context.get('active_ids', [])
for invoice in self.env['account.invoice'].browse(inv_ids):
if invoice.employee_invoice:
if mode == 'refund':
raise Warning(_("This Refund Method is not supported for employee invoices"))
if mode == 'cancel':
#Unrelate such invoice from insurance.commission.payment record
invoice.commission_payment_id = None
for line in invoice.invoice_line:
line.insurance_commission_ids.write({'state': 'confirm'})
line.insurance_commission_ids = None
return super(account_invoice_refund, self).compute_refund(mode=mode)
但在尝试运行该方法时,它只会出现以下错误:
Traceback (most recent call last):
File "/home/oerp/openerp80/odoo/openerp/http.py", line 530, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/home/oerp/openerp80/odoo/openerp/http.py", line 567, in dispatch
result = self._call_function(**self.params)
File "/home/oerp/openerp80/odoo/openerp/http.py", line 303, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/home/oerp/openerp80/odoo/openerp/service/model.py", line 113, in wrapper
return f(dbname, *args, **kwargs)
File "/home/oerp/openerp80/odoo/openerp/http.py", line 300, in checked_call
return self.endpoint(*a, **kw)
File "/home/oerp/openerp80/odoo/openerp/http.py", line 796, in __call__
return self.method(*args, **kw)
File "/home/oerp/openerp80/odoo/openerp/http.py", line 396, in response_wrap
response = f(*args, **kw)
File "/home/oerp/openerp80/odoo/addons/web/controllers/main.py", line 939, in call_button
action = self._call_kw(model, method, args, {})
File "/home/oerp/openerp80/odoo/addons/web/controllers/main.py", line 927, in _call_kw
return getattr(request.registry.get(model), method)(request.cr, request.uid, *args, **kwargs)
File "/home/oerp/openerp80/odoo/openerp/api.py", line 241, in wrapper
return old_api(self, *args, **kwargs)
File "/home/oerp/openerp80/odoo/addons/account/wizard/account_invoice_refund.py", line 231, in invoice_refund
return self.compute_refund(cr, uid, ids, data_refund, context=context)
File "/home/oerp/openerp80/odoo/openerp/api.py", line 241, in wrapper
return old_api(self, *args, **kwargs)
File "/home/oerp/openerp80/odoo/openerp/api.py", line 335, in old_api
recs = self.browse(cr, uid, [], context)
File "/home/oerp/openerp80/odoo/openerp/api.py", line 241, in wrapper
return old_api(self, *args, **kwargs)
File "/home/oerp/openerp80/odoo/openerp/models.py", line 5203, in browse
return self._browse(Environment(cr, uid, context or {}), ids)
File "/home/oerp/openerp80/odoo/openerp/api.py", line 709, in __new__
self.cr, self.uid, self.context = self.args = (cr, uid, frozendict(context))
TypeError: cannot convert dictionary update sequence element #0 to a sequence
我想得太深了。我犯的错误是,在定义方法时,我只是忘记添加
self
参数。我还不能投票,因为我的标点符号,但答案1对我来说很有用,我只是想恭维一下,如果你不使用@api来装饰,当你用新api设置一个按钮时也会出现这种情况。multi它会因这个错误而失败,我希望它能帮助其他人知道它是解决这个错误的方法
用@api.multi装饰
和
使用self将方法附加到类
@api.multi
def your_method(self):
-...- Do your stuff.
即使这个问题已经得到了回答,我还是想说将
@api.model
更改为@api.multi
也有助于返回视图。我搜索了几个小时,终于解决了我的问题!
以下是我的工作代码示例:
@api.multi
def action_button_return_view(self):
view_id = self.env.ref('external_id').id
return {
'name': 'Name',
'view_type': 'form',
'view_mode': 'tree',
'view_id': view_id,
'res.model': 'your_model',
'type': 'ir.actions.act_window',
'target': 'current'
}