2017-04-05 5 views
0

사용자 지정 모듈을 통해 Odoo의 기능을 수정하려고합니다. 것은 프로젝트 작업 복사 기능을 변경하는 것입니다. 기본적으로 작업 요약이있는 작업으로 템플릿에서 새 프로젝트를 만들 때 작업 요약은 복사되지 않습니다 (나는 유지하고 싶습니다). 작업을 복사하는 기능을 찾았지만이 문제에 붙어 있습니다 ...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를 도입했기 때문에. 그것이 공식 추천입니다.

공식적인 문서를 읽지 않았으므로 다시 오류가 발생합니다. @api.multi 데코레이터는 무엇을합니까? cr, uid, ids 및 context 함수에 인수를 전달합니다. 따라서 self은 반복이없는 현재 RecordSet입니다. 따라서 @api.multi을 올바르게 사용하려면 레코드를 반복해야합니다. 당신이 새로운 API browse에서 odoo-8과 아직도 발전 모듈은 ID를 취 모르기 때문에 그래서 당신은

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

그리고 다시 사용해야합니다.

나는 당신이 알아야 할 모든 것을 말했습니다. 나는 당신을 위해 무료로 함수를 작성하지 않을 것이다. 먼저 공식 문서를 읽고 나서 stackoverflow에 대해 물어 보라.

감사

+0

할 필요가, 그것은 매우 도움이되었다. 나는 다시 문서를 읽을 것이다. 일을 분명히하기 위해서 : 나는 누군가가 나를 위해 무료로 코드를 작성하는 것을 기대하지 않았다. 감사. –

0

당신은 오래된 API 호환성 문제가있는 :

copy_data 방법을 상속하는 올바른 방법이이다 : 당신은 이미 장식으로 된 API를 혼합하는

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

메소드를 새 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

정말 고마워요! –