2016-07-14 5 views
0

私は私のモジュールのモデルにhr.holidays(leaves module)を継承Odoo v9上のカスタムアプリケーション(モジュール)を、作成、およびcreate()メソッドをオーバーライドしているとも_check_state_access_right()方法でメソッドを作成継承私のモジュールで。私はそれが葉モジュールの基底クラスのメソッドを作成し、再度_check_state_access_right()に行く呼び出すsuper(hr_holidays,self).create(cr,uid, values,context=context)を呼び出すメソッドを作成オーバーライドした場合(hr_holidays.py私は<code>_check_state_access_right()</code>を変更するようhr.holidaysクラスとオーバーライドはOdoo V9

class hr_holidays(osv.osv): 
    _name = "hr.holidays" 
    _description = "Leave" 
    _order = "type desc, date_from desc" 
    _inherit = ['mail.thread', 'ir.needaction_mixin'] 


    def _check_state_access_right(self, cr, uid, vals, context=None): 
     if vals.get('state') and vals['state'] not in ['draft', 'confirm', 'cancel'] and not self.pool['res.users'].has_group(cr, uid, 'base.group_hr_user'): 
      return False 
     return True 

    def create(self, cr, uid, values, context=None): 
     """ Override to avoid automatic logging of creation """ 
     if context is None: 
      context = {} 
     employee_id = values.get('employee_id', False) 
     context = dict(context, mail_create_nolog=True, mail_create_nosubscribe=True) 
     if not self._check_state_access_right(cr, uid, values, context): 
      raise AccessError(_('You cannot set a leave request as \'%s\'. Contact a human resource manager.') % values.get('state')) 
     if not values.get('name'): 
      employee_name = self.pool['hr.employee'].browse(cr, uid, employee_id, context=context).name 
      holiday_type = self.pool['hr.holidays.status'].browse(cr, uid, values.get('holiday_status_id'), context=context).name 
      values['name'] = _("%s on %s") % (employee_name, holiday_type) 
     hr_holiday_id = super(hr_holidays, self).create(cr, uid, values, context=context) 
     self.add_follower(cr, uid, [hr_holiday_id], employee_id, context=context) 
     return hr_holiday_id 

- 葉のモジュールの基本クラスを既存の

基本クラスのメソッドと私の機能が失敗します。コードを見て、super(hr_holidays, self)に電話をかけずにレコードを作成できるかどうかを教えてください。

class HrHolidaysCustom(osv.osv): 
    _name = 'hr.holidays' 
    _inherit= 'hr.holidays' 

    def _check_state_access_right_new(self, vals): 
     if vals.get('state') and vals['state'] not in ['draft', 'doa', 'reroute', 'confirm', 'cancel'] and not self.pool['res.users'].has_group(request.cr, request.uid, 'base.group_hr_user') : # 
      return False 
     return True 

    @api.model 
    def create(self, values): 
     """ Override to add states in method _check_state_access_rights() """ 
     cr, uid, context = request.cr, request.uid, request.context 
     if context is None: 
      context = {} 
     employee_id = values.get('employee_id', False) 
     context = dict(context, mail_create_nolog=True, mail_create_nosubscribe=True) 
     if not self._check_state_access_right_new(values): 
      print self._check_state_access_right_new(values) 
      raise AccessError(_('You cannot set a leave request as \'%s\'. Contact a human resource manager.') % values.get('state')) 
     if not values.get('name'): 
      employee_name = self.pool['hr.employee'].browse(cr, uid, employee_id, context=context).name 
      holiday_type = self.pool['hr.holidays.status'].browse(cr, uid, values.get('holiday_status_id'), context=context).name    
      values['name'] = ("%s on %s") % (employee_name, holiday_type) 
     hr_holiday_id = super(HrHolidaysCustom, self).create(values) 
     return hr_holiday_id 

は最終的に私は、既存の休暇モジュールのコード内の任意の変更を行うのではなく、作られたカスタムモジュールに変更を加えることによって_check_state_access_rights方法では、さらに2つの状態を追加したいです。

答えて

0

あなただけ_inhereit='hr.holidays'を使用してモデルにプロパティをオーバーライドしたり、追加したい場合は、_name = 'hr.holidays'を取り除くことは結構です

正しくクラスの新しいメソッドにメソッド名を上書きしますので、あなたには、同一である必要はありHrHolidaysCustomクラスはトンを呼び出すことなく、あなたがはい

+0

を拡張しているが、その後も、それはレコードを作成されていない古いものの代わりに呼び出される新しい方法で、今から

def _check_state_access_right(self, vals): if vals.get('state') and vals['state'] not in ['draft', 'doa', 'reroute', 'confirm', 'cancel'] and not self.pool['res.users'].has_group(request.cr, request.uid, 'base.group_hr_user') : # return False return True 

にあなたのメソッド定義を変更します彼は休暇の基本クラスです。私は、継承されたクラスがレコードをローカルに作成したい。基本クラスが呼び出されるたびに、それは_check_state_access_rightsメソッドに行き、私のオーバーライドは役に立たなくなります。 –

+0

oh okay ...私の編集を参照してください – danidee

+0

ありがとうございます。あなたの応答のために。 _check_state_access_rightsはプライベートメソッドなので、基本クラスのcreateメソッドからは呼び出されません。基本クラスのcreateメソッドは、作成しカスタマイズしたメソッドを呼び出す代わりに、独自の_check_state_access_rightsメソッドを呼び出します。あなたの貴重な応答を待っています。ありがとう –

関連する問題