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