Odoo - переопределение старого метода API новым API?

Я пытаюсь переопределить метод compute_refund, но получаю сообщение об ошибке. Я использую неправильный декоратор? (пробовал, model, multi и one, но каждый из них дает ошибку). Например, сделать это:

@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

person Andrius    schedule 30.04.2015    source источник


Ответы (3)


Несмотря на то, что на вопрос уже был дан ответ, я хотел сказать, что изменение @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'
    }
person Brotbret    schedule 24.11.2016

Я слишком глубоко задумался. Моя ошибка заключалась в том, что я просто забыл добавить аргумент self при определении метода. И нужен был multi декоратор.

person Andrius    schedule 03.05.2015

Я пока не могу голосовать, потому что моя пунктуация, но ответ 1 работает для меня, я просто хочу похвалить, что это происходит также, когда вы устанавливаете кнопку с новым API, если вы не украшаете с помощью @api.multi, это приведет к ошибке с этой ошибкой, Я надеюсь, что это поможет кому-то еще узнать, что это решение этой ошибки.

украсьте @api.multi и прикрепите метод к классу с помощью self.

@api.multi
def your_method(self):
    -...- Do your stuff.
person Nhomar Hernandez    schedule 29.07.2015