2017-04-05 9 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、id、およびcontextに引数を渡します。そのため、selfは現在のレコードセットであり、繰り返しはありません。したがって、@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.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

ありがとうございました! –

関連する問題