修改Odoo 8本机modu时发生类型错误

2024-04-25 21:13:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过自定义模块修改Odoo的功能。关键是改变项目任务复制功能。在本机上,当从包含工作摘要的任务的模板创建新项目时,不会复制工作摘要(我希望保留它们)。我找到了复制任务的功能,但是我被这个卡住了。。。你知道吗

这是我得到的错误(我不理解,因为它引用了duplicate\u template()当我没有从project类修改该方法时):

Traceback (most recent call last):   File "/opt/odoo/odoo-server/openerp/http.py", line 540, in
_handle_exception
    return super(JsonRequest, self)._handle_exception(exception)   File "/opt/odoo/odoo-server/openerp/http.py", line 577, in dispatch
    result = self._call_function(**self.params)   File "/opt/odoo/odoo-server/openerp/http.py", line 313, in _call_function
    return checked_call(self.db, *args, **kwargs)   File "/opt/odoo/odoo-server/openerp/service/model.py", line 118, in wrapper
    return f(dbname, *args, **kwargs)   File "/opt/odoo/odoo-server/openerp/http.py", line 310, in checked_call
    return self.endpoint(*a, **kw)   File "/opt/odoo/odoo-server/openerp/http.py", line 806, in __call__
    return self.method(*args, **kw)   File "/opt/odoo/odoo-server/openerp/http.py", line 406, in response_wrap
    response = f(*args, **kw)   File "/opt/odoo/odoo-server/addons/web/controllers/main.py", line 948, in call_button
    action = self._call_kw(model, method, args, {})   File "/opt/odoo/odoo-server/addons/web/controllers/main.py", line 936, in
_call_kw
    return getattr(request.registry.get(model), method)(request.cr, request.uid, *args, **kwargs)   File "/opt/odoo/odoo-server/openerp/api.py", line 268, in wrapper
    return old_api(self, *args, **kwargs)   File "/opt/odoo/odoo-server/openerp/api.py", line 399, in old_api
    result = method(recs, *args, **kwargs) 
TypeError: duplicate_template() takes at least 4 arguments (2 given)

这是我的密码:

我的模块.py

import openerp
from openerp import models,fields,api
from openerp.osv import fields, osv

class task(osv.osv):
    _inherit="project.task"

    @api.multi
    def copy_data(self, default=None, context=None):
        if default is None:
            default = {}
        current = self.browse(cr, uid, id, context=context)
        if not default.get('name'):
            default['name'] = _("%s (copy)") % current.name
        if 'remaining_hours' not in default:
            default['remaining_hours'] = current.planned_hours

        default['work_ids'] = current.work_ids
        return super(task, self).copy_data(cr, uid, id, default, context)

default['work_ids'] = current.work_ids was added by me - it was not included in original function.

你知道我为什么会弄错吗?你知道吗

非常感谢您的帮助!你知道吗

谨致问候。你知道吗


Tags: inpyodooselfapihttpdefaultreturn
2条回答

您遇到了旧的API兼容性问题:

继承copy_data方法的正确方法是:

@api.multi
def copy_data(self, default=None):
    #  your stuff here
    return super(ClassName, self).copy_data(default)

另外,您正在将旧API与已修饰的方法与新API混合,因此您的方法应该如下所示:

from openerp import models, fields, api

class Task(models.Model):
    _inherit="project.task"

    @api.multi
    def copy_data(self, default=None):

        if default is None:
            default = {}
        for current in self;
            current = self
            if not default.get('name'):
                default['name'] = _("%s (copy)") % current.name
            if 'remaining_hours' not in default:
                default['remaining_hours'] = current.planned_hours

            default['work_ids'] = current.work_ids
        return super(Task, self).copy_data(default)

由于您是用@api.multi装饰的,您可能在self中收到多条记录,因此您需要在self中迭代。你知道吗

类的签名需要是model.Models

致以最诚挚的问候

首先阅读官方文件,然后再工作的奥多。为什么?因为odoo8引入了必须使用的新api,而不是旧api。这是官方的建议。你知道吗

所以再次出现错误是因为您没有阅读官方文档。装饰器是做什么的?它将参数传递给函数cr、uid、ids和context。因此self是当前记录集,没有迭代。因此,为了正确使用@api.multi,您必须在记录之间进行迭代。所以你必须使用

@api.multi
def something(self):
    for rec in self:
        # Do the job here for single record

同样,因为您不知道odoo-8,并且仍然在新api中开发模块browse只需要id

我把你需要知道的都告诉你了。我不会免费为您编写函数,请先阅读官方文档,然后再询问stackoverflow。你知道吗

敬礼

相关问题 更多 >