2013-01-10 68 views
2

我試圖根據下拉列表中的選擇來達到與發票行表單類似的效果,其中某些列出現或消失(編輯視圖?)。如何使用fields_get方法來編輯視圖?

我想研究account_invoice_layout中實現這種效果的代碼,但它有點難以理解。

下面是完整的代碼:

class account_invoice_line(osv.osv): 

def move_line_get_item(self, cr, uid, line, context=None): 
    if line.state != 'article': 
     return None 
    return super(account_invoice_line, self).move_line_get_item(cr, uid, line, context) 

def fields_get(self, cr, uid, fields=None, context=None): 
    article = { 
     'article': [('readonly', False), ('invisible', False)], 
     'text': [('readonly', True), ('invisible', True), ('required', False)], 
     'subtotal': [('readonly', True), ('invisible', True), ('required', False)], 
     'title': [('readonly', True), ('invisible', True), ('required', False)], 
     'break': [('readonly', True), ('invisible', True), ('required', False)], 
     'line': [('readonly', True), ('invisible', True), ('required', False)], 
    } 
    states = { 
     'name': { 
      'break': [('readonly', True),('required', False),('invisible', True)], 
      'line': [('readonly', True),('required', False),('invisible', True)], 
      }, 
     'product_id': article, 
     'account_id': article, 
     'quantity': article, 
     'uos_id': article, 
     'price_unit': article, 
     'discount': article, 
     'invoice_line_tax_id': article, 
     'account_analytic_id': article, 
    } 
    res = super(account_invoice_line, self).fields_get(cr, uid, fields, context) 
    for field in res: 
     if states.has_key(field): 
      for key,value in states[field].items(): 
       res[field].setdefault('states',{}) 
       res[field]['states'][key] = value 
    return res 

def onchange_invoice_line_view(self, cr, uid, id, type, context=None, *args): 

    if (not type): 
     return {} 
    if type != 'article': 
     temp = {'value': { 
       'product_id': False, 
       'uos_id': False, 
       'account_id': False, 
       'price_unit': False, 
       'price_subtotal': False, 
       'quantity': 0, 
       'discount': False, 
       'invoice_line_tax_id': False, 
       'account_analytic_id': False, 
       }, 
      } 
     if type == 'line': 
      temp['value']['name'] = ' ' 
     if type == 'break': 
      temp['value']['name'] = ' ' 
     if type == 'subtotal': 
      temp['value']['name'] = 'Sub Total' 
     return temp 
    return {} 

def create(self, cr, user, vals, context=None): 
    if vals.has_key('state'): 
     if vals['state'] == 'line': 
      vals['name'] = ' ' 
     if vals['state'] == 'break': 
      vals['name'] = ' ' 
     if vals['state'] != 'article': 
      vals['quantity']= 0 
      vals['account_id']= self._default_account(cr, user, None) 
    return super(account_invoice_line, self).create(cr, user, vals, context) 

def write(self, cr, user, ids, vals, context=None): 
    if vals.has_key('state'): 
     if vals['state'] != 'article': 
      vals['product_id']= False 
      vals['uos_id']= False 
      vals['account_id']= self._default_account(cr, user, None) 
      vals['price_unit']= False 
      vals['price_subtotal']= False 
      vals['quantity']= 0 
      vals['discount']= False 
      vals['invoice_line_tax_id']= False 
      vals['account_analytic_id']= False 
     if vals['state'] == 'line': 
      vals['name'] = ' ' 
     if vals['state'] == 'break': 
      vals['name'] = ' ' 
    return super(account_invoice_line, self).write(cr, user, ids, vals, context) 

def copy_data(self, cr, uid, id, default=None, context=None): 
    if default is None: 
     default = {} 
    default['state'] = self.browse(cr, uid, id, context=context).state 
    return super(account_invoice_line, self).copy_data(cr, uid, id, default, context) 

def _fnct(self, cr, uid, ids, name, args, context=None): 
    res = {} 
    lines = self.browse(cr, uid, ids, context=context) 
    account_ids = [line.account_id.id for line in lines] 
    account_names = dict(self.pool.get('account.account').name_get(cr, uid, account_ids, context=context)) 
    for line in lines: 
     if line.state != 'article': 
      if line.state == 'line': 
       res[line.id] = '-----------------------------------------' 
      elif line.state == 'break': 
       res[line.id] = 'PAGE BREAK' 
      else: 
       res[line.id] = ' ' 
     else: 
      res[line.id] = account_names.get(line.account_id.id, '') 
    return res 

_name = "account.invoice.line" 
_order = "invoice_id, sequence asc" 
_description = "Invoice Line" 
_inherit = "account.invoice.line" 
_columns = { 
    'state': fields.selection([ 
      ('article','Product'), 
      ('title','Title'), 
      ('text','Note'), 
      ('subtotal','Sub Total'), 
      ('line','Separator Line'), 
      ('break','Page Break'),] 
     ,'Type', select=True, required=True), 
    'sequence': fields.integer('Sequence Number', select=True, help="Gives the sequence order when displaying a list of invoice lines."), 
    'functional_field': fields.function(_fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type='char', fnct_search=None, obj=None, store=False, string="Source Account"), 
} 

def _default_account(self, cr, uid, context=None): 
    cr.execute("select id from account_account where parent_id IS NULL LIMIT 1") 
    res = cr.fetchone() 
    return res[0] 

_defaults = { 
    'state': 'article', 
    'sequence': 0, 
} 

account_invoice_line()

什麼是fields_get方法做​​什麼呢?何時執行?上述代碼如何管理編輯視圖?

謝謝。

回答

3

實際上,fields_get()返回模塊的字段定義。在Fields定義中,您可以提供一個states參數。

默認情況下,它的工作原理是這樣的一個字段定義:

states = {'draft':[('readonly','=',True)]} 

它把現場的只讀時態形式是「草稿」。

變量狀態文章店相同的值。

現在你告訴我們,在模塊中,狀態字段值從平常值不同勢:

[('article','Product'), 
      ('title','Title'), 
      ('text','Note'), 
      ('subtotal','Sub Total'), 
      ('line','Separator Line'), 
      ('break','Page Break'),] 

在fields_get()函數的最後一部分,我們有:

res = super(account_invoice_line, self).fields_get(cr, uid, fields, context) 
for field in res: 
    if states.has_key(field): 
     for key,value in states[field].items(): 
      res[field].setdefault('states',{}) 
      res[field]['states'][key] = value 
return res 

它使用超類的方法,它的工作原理是這樣的:

fields_get()返回fields參數中模塊上存在的字段。 你的模塊只是強制每個字段的狀態參數。

最後,它允許根據fictif狀態字段顯示字段。 在你的榜樣:

  • 如果行是在「文章」狀態,這是默認顯示,
  • 如果行是在「標題」狀態,它是無形的展示和只讀。

我認爲這些州的值是在這裏告訴如果一行是標題,文章或其他。

所以,如果你想要做同樣的你自己的模塊中,複製/粘貼此fields_get()函數的定義,定製你的文章和狀態變量,不要忘記去適應,如果需要的話,該狀態字段定義上的_columns類屬性。

希望我幫助你,

Nonow

相關問題