2017-11-22 3 views
1

親クラスからbooleanフィールドを子(ライン)クラスにチェックしたいと思います。親モデルからブール値フィールドをラインにチェック - Odoo v8

class bsi_print_order(models.Model): 
    _name = 'bsi.print.order' 

    @api.model 
    def create(self, vals): 
     if vals.get('name', 'New') == 'New': 
      vals['name'] = self.env['ir.sequence'].next_by_code('bsi.print.order') or '/' 
     return super(bsi_print_order, self).create(vals) 

    name = fields.Char('Reference', required=True, index=True, copy=False, readonly='True', default='New') 
    date = fields.Date(string="Print Date",default=fields.Datetime.now) 
    production_orders = fields.Many2one('bsi.production.order', ondelete='cascade', string="Production Order") 
    due_date = fields.Date(string="Due Date") 
    journal_entry = fields.Many2one('account.move', string="Journal Entry") 
    stock_picking_id = fields.Many2one('stock.picking', string="Stock Picking") 
    order_picking = fields.One2many('bsi.print.order.lines', 'print_order', string="Order lines") 
    book_block = fields.Boolean(string="Book Block", default=True) 
    binding = fields.Boolean(string="Binding") 
    edging = fields.Boolean(string="Edging") 

class bsi_print_order_lines(models.Model): 
    _name = 'bsi.print.order.lines' 

    print_order = fields.Many2one('bsi.print.order', string="Print Order") 
    isbn = fields.Many2one('product.product', string="ISBN", domain="[('is_isbn', '=', True)]") 
    qty = fields.Integer(string="Quantity") 
    consumed_qty = fields.Integer(string="Quantity consumed") 
    remaining_qty = fields.Float(string="Remaining quantity") #, compute="_remaining_func" 
    is_book_block = fields.Boolean(string="Is Book Block Done") 
    is_binding = fields.Boolean(string="Is Binding Done") 
    is_edging = fields.Boolean(string="Is Edging Done") 
    isbns = fields.Many2one('worksheets.isbns', string="Worksheet ISBNS") 

ので、book_blockボタンがチェックされたときに、is_book_blockが自動的にbindingedgingと同じ、あまりにもチェックする必要があり、彼らはそれぞれis_bindingis_edgingをチェックする必要があります。

これらは私が持っているメソッドです。

@api.depends('book_block', 'order_picking', 'order_picking.is_book_block') 
def _bool_book_block(self): 
    if self.book_block == True: 
     order_picking.is_book_block = True 
    else: 
     order_picking.is_book_block = False 

@api.depends('binding', 'order_picking', 'order_picking.is_binding') 
def _bool_binding(self): 
    if self.binding == True: 
     order_picking.is_binding = True 
    else: 
     order_picking.is_binding = False 

@api.onchange('edging', 'order_picking', 'order_picking.is_edging') 
def _bool_edging(self): 
    if self.edging == True: 
     order_picking.is_edging == True 
    else: 
     order_picking.is_edging == False 

しかし、それは動作しません、私は、例えばedgingを確認していない、とさえ文書を保存しますが、行のbooleanフィールドには何の変化です。

アイデア?あなたのフィールドが100%、計算フィールド、あなた を計算するために、親クラスに変更するために聞くことができますodooで最高のものであれば

some_feild = fiels.SomeType(......., compute='method_name') 


    @api.depends('some_field_2', ...) 
    def method_name(self): 
     # and here the function will be computed. 

答えて

1

使用するフィールドは、計算属性を持っている必要があります依存します子フィールド:

class bsi_print_order(models.Model): 
    _name = 'bsi.print.order' 
    .... 



class bsi_print_order_lines(models.Model): 
    _name = 'bsi.print.order.lines' 

    is_book_block = fields.Boolean(string="Is Book Block Done", compute="compute_book_block") 

    @api.depends('print_order.book_block') 
    def compute_book_block(self): 

     # in depends it's always a good this to loop 
     # or use api.one with depends 
     for rec in self: 
      if rec.print_order: 
       self.is_book_block = self.print_order.book_block 

しかし、これは、このフィールドは常に計算フィールドである場合にのみOKですが、私は、ユーザーが 変更、それはUIからの値だことはありません意味します。

フィールドが計算されておらず、ユーザーが値段を変更できる場合は、親クラスの を使用する必要があります。

class bsi_print_order(models.Model): 
    _name = 'bsi.print.order' 
    .... 

    @api.onchange('book_block '): 
    def onchange_book_block(self): 
     # in onchange no need for loop 
     # because self should always have only one recod 
     for line in self.order_picking: 
      line.is_book_block = self.book_block 
+0

最初のケースは完全に、素晴らしいです:) – NeoVe

関連する問題