我正在尝试通过自定义模块修改Odoo的功能。问题是改变项目任务复制功能。本地,当从具有工作摘要的任务的模板创建新项目时,不会复制工作摘要(我希望保留它们)。我找到了复制任务的功能,但我对此感到困惑......
这是我得到的错误(我不明白,因为当我不从项目类修改该方法时,它指的是 duplicate_template()):
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)
这是我的代码:
mymodule.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)
默认[' work_ids'] = current.work_ids 由我添加 - 它未包含在原始功能中。
关于我为什么会出错的任何想法?
非常感谢您的帮助!
亲切的问候。
答案 0 :(得分:0)
首先阅读官方文档,然后再开始使用Odoo。为什么?因为odoo 8引入了你必须使用的新api,而不是旧的api。这是官方的建议。
所以再次出现错误,因为您还没有阅读官方文档。 @api.multi
装饰者做什么?它将参数传递给函数cr,uid,id和context。因此,self
是没有迭代的当前RecordSet。因此,为了正确使用@api.multi
,您必须在记录之间进行迭代。所以你必须使用
@api.multi
def something(self):
for rec in self:
# Do the job here for single record
再一次,因为你不知道odoo-8,并且仍然在新的api browse
中开发模块只需要id。
我告诉了你需要知道的一切。我不打算免费为你写函数,请先阅读官方文档然后询问stackoverflow。
此致
答案 1 :(得分:0)
您遇到了旧的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
祝你好运