00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 from PyQt4.QtCore import *
00029 from PyQt4.QtGui import *
00030 from Koo import Rpc
00031 
00032 class FieldsModel( QStandardItemModel ):
00033         def __init__(self):
00034                 QStandardItemModel.__init__(self)
00035                 self.rootItem = self.invisibleRootItem()
00036                 self.setColumnCount( 1 )
00037                 self.setHeaderData( 0, Qt.Horizontal, QVariant( _('Fields') ) )
00038 
00039         def addField(self, text, data):
00040                 item = QStandardItem( text )            
00041                 item.setData( QVariant(data) )
00042                 self.rootItem.appendRow( item )
00043 
00044         def load(self, fields, fieldsInfo = None, fieldsInvertedInfo = None):
00045                 if fieldsInfo is None:
00046                         fieldsInfo = {}
00047                 if fieldsInvertedInfo is None:
00048                         fieldsInvertedInfo = {}
00049                 self.fieldsInfo = fieldsInfo
00050                 self.fieldsInvertedInfo = fieldsInvertedInfo
00051                 self.populate(fields)
00052 
00053         def populate(self, fields, prefix_node='', prefix=None, prefix_value='', level=2):
00054                 fields_order = fields.keys()
00055                 fields_order.sort(lambda x,y: -cmp(fields[x].get('string', ''), fields[y].get('string', '')))
00056                 if prefix == None:
00057                         prefix = self.rootItem
00058                 for field in fields_order:
00059                         st_name = fields[field]['string'] or field 
00060                         node = QStandardItem(st_name) 
00061                         node.setData( QVariant(field) )
00062                         if fields[field].get('required', False):
00063                                 font = node.font()
00064                                 font.setBold( True )
00065                                 node.setFont( font )
00066                         prefix.appendRow( node )
00067 
00068                         
00069                         self.fieldsInvertedInfo[prefix_value+st_name] = prefix_node+field
00070                         self.fieldsInfo[prefix_node+field] = fields[field]
00071                         if prefix_node:
00072                                 self.fieldsInfo[prefix_node + field]['string'] = '%s%s' % (prefix_value, self.fieldsInfo[prefix_node + field]['string'])
00073                         
00074                         if fields[field].get('relation', False) and level>0:
00075                                 fields2 = Rpc.session.execute('/object', 'execute', fields[field]['relation'], 'fields_get', False, Rpc.session.context)
00076                                 self.populate(fields2, prefix_node+field+'/', node, st_name+'/', level-1)