2017-04-05 82 views
0

我想通過自定義模塊修改Odoo的功能。事情是改變項目任務複製功能。從本質上講,當從具有工作摘要的任務的模板創建新項目時,工作摘要不會被複制(我想保留它們)。我發現複製任務的功能,但我陷入了這個...TypeError修改Odoo 8本地模塊

這是我得到的錯誤(我不明白,因爲它是指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) 

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

有關我爲什麼會出錯的任何想法?

非常感謝您的幫助!

親切的問候。

回答

0

首先在使用Odoo之前閱讀官方文檔。爲什麼?因爲odoo 8引入了你必須使用的新API,而不是舊的。這是官方建議。

所以再次發生錯誤是因爲您還沒有閱讀官方文檔。裝飾者做什麼@api.multi?它將參數傳遞給函數cr,uid,id和上下文。因此,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上詢問。

問候

+0

即使你的答案是完全傲慢,這是非常有幫助的。我會再次閱讀文檔。只是要說清楚:我沒有期望任何人爲我免費編寫代碼。謝謝。 –

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

問候

+0

非常感謝,奧斯卡!我得到UnboundLocalError:賦值之前引用的局部變量'default'。那是因爲我需要替換一些東西嗎?問候。 –

+0

這種方法沒有辦法觸發錯誤,因爲'default'在方法的所有名稱空間中,我認爲錯誤在其他方法中。 –

+0

非常感謝! –