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 
00029 from PyQt4.QtCore import *
00030 from PyQt4.QtGui import *
00031 from PyQt4.uic import *
00032 
00033 from Koo.Common import Api
00034 from Koo.Common import Common
00035 from Koo.Common import Shortcuts
00036 from Koo import Rpc
00037 
00038 from Koo.Screen.Screen import Screen
00039 from Koo.Model.Group import RecordGroup
00040 from Koo.Fields.AbstractFieldWidget import *
00041 from Koo.Fields.AbstractFieldDelegate import *
00042 from Koo.Dialogs.SearchDialog import SearchDialog
00043 
00044 (ManyToManyFieldWidgetUi, ManyToManyFieldWidgetBase ) = loadUiType( Common.uiPath('many2many.ui') ) 
00045 
00046 class ManyToManyFieldWidget(AbstractFieldWidget, ManyToManyFieldWidgetUi):
00047         def __init__(self, parent, model, attrs={}):
00048                 AbstractFieldWidget.__init__(self, parent, model, attrs)
00049                 ManyToManyFieldWidgetUi.__init__(self)
00050                 self.setupUi(self)
00051 
00052                 self.setSizePolicy( QSizePolicy.Preferred, QSizePolicy.Expanding )
00053 
00054                 self.connect( self.pushAdd, SIGNAL( "clicked()"), self.slotAdd )
00055                 self.connect( self.pushRemove, SIGNAL( "clicked()"), self.remove )
00056                 self.connect( self.uiText, SIGNAL( 'editingFinished()' ), self.match )
00057 
00058                 self.scSearch = QShortcut( self.uiText )
00059                 self.scSearch.setKey( Shortcuts.SearchInField )
00060                 self.scSearch.setContext( Qt.WidgetShortcut )
00061                 self.connect( self.scSearch, SIGNAL('activated()'), self.add )
00062 
00063                 self.connect( self.screen, SIGNAL('activated()'), self.open )
00064 
00065                 self.installPopupMenu( self.uiText )
00066                 self.old = None
00067                 self.latestMatch = None
00068                 self.searching = False
00069 
00070         def initGui(self):
00071                 if self.record:
00072                         group = self.record.value(self.name)
00073                 else:
00074                         group = None
00075                 if not group:
00076                         group = RecordGroup( self.attrs['relation'] )
00077                         group.setDomainForEmptyGroup()
00078                 self.screen.setRecordGroup( group )
00079                 self.screen.setViewTypes( ['tree'] )
00080                 self.screen.setEmbedded( True )
00081 
00082         def open( self ):
00083                 if not ( QApplication.keyboardModifiers() & Qt.ControlModifier ):
00084                         return
00085 
00086                 if not self.screen.currentRecord():
00087                         return
00088                 id = self.screen.currentRecord().id 
00089                 if not id:
00090                         return
00091 
00092                 if QApplication.keyboardModifiers() & Qt.ShiftModifier:
00093                         target = 'background'
00094                 else:
00095                         target = 'current'
00096                 Api.instance.createWindow(False, self.attrs['relation'], id, [('id','=',id)], 'form', mode='form,tree', target=target)
00097 
00098         def match(self):
00099                 if self.searching:
00100                         return
00101                 if not self.record:
00102                         return
00103                 text = unicode(self.uiText.text()).strip()
00104                 if text == '':
00105                         self.uiText.clear()
00106                         return 
00107                 
00108                 
00109                 self.searching = True
00110                 self.add()
00111                 self.searching = False
00112         
00113         def slotAdd(self):
00114                 text = unicode(self.uiText.text()).strip()
00115                 
00116                 
00117                 self.searching = True
00118                 self.add()
00119                 self.searching = False
00120 
00121         def add(self):
00122                 
00123                 
00124                 
00125                 self.view.store()
00126 
00127                 domain = self.record.domain( self.name )
00128                 context = self.record.fieldContext( self.name )
00129 
00130                 ids = Rpc.session.execute('/object', 'execute', self.attrs['relation'], 'name_search', unicode( self.uiText.text()), domain, 'ilike', context, False)
00131                 ids = [x[0] for x in ids] 
00132                 if unicode( self.uiText.text() ) == '' or len(ids) != 1:
00133                         dialog = SearchDialog(self.attrs['relation'], sel_multi=True, ids=ids, domain=domain, context=context)
00134                         if dialog.exec_() == QDialog.Rejected:
00135                                 self.uiText.clear()
00136                                 return
00137                         ids = dialog.result
00138 
00139                 self.screen.load(ids)
00140                 self.screen.display()
00141                 self.uiText.clear()
00142                 
00143                 
00144                 
00145                 self.screen.group.recordChanged( None )
00146                 self.screen.group.recordModified( None )
00147 
00148         def remove(self):
00149                 
00150                 
00151                 
00152                 self.view.store()
00153                 self.screen.remove()
00154                 self.screen.display()
00155 
00156         def setReadOnly(self, value):
00157                 AbstractFieldWidget.setReadOnly(self, value)
00158                 self.uiText.setEnabled( not value )
00159                 self.pushAdd.setEnabled( not value )
00160                 self.pushRemove.setEnabled( not value )
00161 
00162         def clear(self):
00163                 self.uiText.setText('')
00164                 self.screen.setRecordGroup( None )      
00165                 self.screen.display()
00166 
00167         def showValue(self):
00168                 group = self.record.value(self.name)
00169                 self.screen.setRecordGroup(group)
00170                 self.screen.display()
00171 
00172         
00173         
00174         
00175         def storeValue(self):
00176                 pass
00177 
00178         def saveState(self):
00179                 self.screen.storeViewSettings()
00180                 return AbstractFieldWidget.saveState(self)
00181 
00182 class ManyToManyFieldDelegate( AbstractFieldDelegate ):
00183         def setModelData(self, editor, kooModel, index):
00184                 if unicode( editor.text() ) == unicode( index.data( Qt.DisplayRole ).toString() ):
00185                         return
00186                 
00187                 model = kooModel.recordFromIndex( index )
00188 
00189                 
00190                 domain = model.domain( self.name )
00191                 context = model.fieldContext( self.name )
00192 
00193                 ids = Rpc.session.execute('/object', 'execute', self.attributes['relation'], 'name_search', unicode( editor.text() ), domain, 'ilike', context, False)
00194                 ids = [x[0] for x in ids] 
00195                 if len(ids) != 1:
00196                         dialog = SearchDialog(self.attributes['relation'], sel_multi=True, ids=ids, domain=domain, context=context)
00197                         if dialog.exec_() == QDialog.Rejected:
00198                                 return
00199                         ids = dialog.result
00200 
00201                 ids = [QVariant(x) for x in ids]
00202                 kooModel.setData( index, QVariant(ids), Qt.EditRole )
00203