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 Common
00034 from Koo.Common import Api
00035 from Koo.Common import Shortcuts
00036 from Koo.Dialogs.SearchDialog import SearchDialog
00037
00038 from Koo.Fields.AbstractFieldWidget import *
00039 from Koo.Screen.ScreenDialog import ScreenDialog
00040
00041 from Koo import Rpc
00042 from Koo.Rpc import RpcProxy
00043
00044 (ReferenceFieldWidgetUi, ReferenceFieldWidgetBase ) = loadUiType( Common.uiPath('reference.ui') )
00045
00046
00047
00048
00049 class ReferenceFieldWidget(AbstractFieldWidget, ReferenceFieldWidgetUi):
00050 def __init__(self, parent, model, attrs={}):
00051 AbstractFieldWidget.__init__(self, parent, model, attrs)
00052 ReferenceFieldWidgetUi.__init__(self)
00053 self.setupUi(self)
00054
00055 self.connect( self.pushNew, SIGNAL('clicked()'), self.new )
00056 self.connect( self.pushOpen, SIGNAL('clicked()'), self.open )
00057 self.connect( self.pushClear, SIGNAL('clicked()'), self.clear )
00058 self.setPopdown( attrs.get('selection',[]) )
00059 self.connect( self.uiModel, SIGNAL('currentIndexChanged(int)'), self.recordChanged )
00060 self.connect( self.uiText, SIGNAL( "editingFinished()" ), self.match )
00061 self.scNew = QShortcut( self.uiText )
00062 self.scNew.setContext( Qt.WidgetShortcut )
00063 self.scNew.setKey( Shortcuts.CreateInField )
00064 self.connect( self.scNew, SIGNAL('activated()'), self.new )
00065
00066 self.scSearch = QShortcut( self.uiText )
00067 self.scSearch.setContext( Qt.WidgetShortcut )
00068 self.scSearch.setKey( Shortcuts.SearchInField )
00069 self.connect( self.scSearch, SIGNAL('activated()'), self.open )
00070
00071 self.uiModel.setEditable( False )
00072 self.installPopupMenu( self.uiText )
00073
00074 def recordChanged(self, idx):
00075 if idx < 0:
00076 self.uiText.clear()
00077 self.updateStates()
00078
00079 def clear(self):
00080
00081
00082
00083 self.view.store()
00084
00085
00086
00087 if self.record:
00088 self.record.setValue(self.name, False)
00089
00090 def setPopdown(self, selection):
00091 self.invertedModels = {}
00092
00093 for (i,j) in selection:
00094 self.uiModel.addItem( j, QVariant(i) )
00095 self.invertedModels[i] = j
00096
00097 def setReadOnly(self, value):
00098 AbstractFieldWidget.setReadOnly(self, value)
00099 self.updateStates()
00100
00101 def updateStates(self):
00102 readOnly = self.isReadOnly()
00103 if self.uiModel.currentIndex() < 0:
00104 validIndex = False
00105 else:
00106 validIndex = True
00107
00108 self.uiModel.setEnabled( not readOnly )
00109 self.uiText.setReadOnly( not validIndex or readOnly )
00110 self.pushNew.setEnabled( validIndex and not readOnly )
00111 self.pushClear.setEnabled( validIndex and not readOnly )
00112 if self.record and self.record.value(self.name):
00113 self.pushOpen.setEnabled( True )
00114 elif validIndex:
00115 self.pushOpen.setEnabled( True )
00116 else:
00117 self.pushOpen.setEnabled( False )
00118
00119
00120 def colorWidget(self):
00121 return self.uiText
00122
00123 def storeValue(self):
00124
00125 pass
00126
00127 def search(self):
00128 domain = self.record.domain(self.name)
00129 context = self.record.fieldContext(self.name)
00130 resource = str(self.uiModel.itemData(self.uiModel.currentIndex()).toString())
00131 ids = Rpc.session.execute('/object', 'execute', resource, 'name_search', unicode(self.uiText.text()), domain, 'ilike', context, False)
00132
00133 if len(ids)==1:
00134 id, name = ids[0]
00135 self.record.setValue(self.name, (resource, (id, name)) )
00136 self.display()
00137 return
00138
00139 dialog = SearchDialog(resource, sel_multi=False, ids=[x[0] for x in ids], context=context, domain=domain)
00140 if dialog.exec_() == QDialog.Accepted and dialog.result:
00141 id = dialog.result[0]
00142 id, name = Rpc.session.execute('/object', 'execute', resource, 'name_get', [id], Rpc.session.context)[0]
00143 self.record.setValue(self.name, (resource, (id, name)) )
00144 self.display()
00145
00146 def match(self):
00147 name = unicode(self.uiText.text())
00148 if name.strip() == '':
00149 self.record.setValue(self.name, False)
00150 return
00151
00152 value = self.record.value(self.name)
00153 if value and value[1][1] == name:
00154 return
00155 self.search()
00156
00157 def new(self):
00158 resource = unicode(self.uiModel.itemData(self.uiModel.currentIndex()).toString())
00159 dialog = ScreenDialog( self )
00160 dialog.setup( resource )
00161 dialog.setAttributes( self.attrs )
00162 if dialog.exec_() == QDialog.Accepted:
00163 resource = unicode(self.uiModel.itemData(self.uiModel.currentIndex()).toString())
00164 self.record.setValue(self.name, (resource, dialog.record) )
00165
00166 def open(self):
00167
00168
00169
00170 self.view.store()
00171
00172 value = self.record.value(self.name)
00173 if value:
00174 model, (id, name) = value
00175
00176
00177
00178 if QApplication.keyboardModifiers() & Qt.ControlModifier:
00179 if QApplication.keyboardModifiers() & Qt.ShiftModifier:
00180 target = 'background'
00181 else:
00182 target = 'current'
00183 Api.instance.createWindow(False, model, id, [('id','=',id)], 'form', mode='form,tree', target=target)
00184 else:
00185 dialog = ScreenDialog( self )
00186 dialog.setup( model, id )
00187 dialog.setAttributes( self.attrs )
00188 dialog.exec_()
00189 else:
00190 self.search()
00191
00192 def clear(self):
00193 self.uiModel.setCurrentIndex(-1)
00194 if self.record:
00195 self.record.setValue( self.name, False )
00196 self.display()
00197
00198 def showValue(self):
00199 value = self.record.value(self.name)
00200 if value:
00201 model, (id, name) = value
00202 self.uiModel.setCurrentIndex( self.uiModel.findText(self.invertedModels[model]) )
00203 if not name:
00204 id, name = RpcProxy(model).name_get([int(id)], Rpc.session.context)[0]
00205 self.setText(name)
00206 self.pushOpen.setIcon( QIcon(":/images/folder.png") )
00207 self.pushOpen.setToolTip( _("Open") )
00208 else:
00209 self.uiText.clear()
00210 self.uiText.setToolTip('')
00211 self.uiModel.setCurrentIndex(-1)
00212 self.pushOpen.setIcon( QIcon(":/images/find.png") )
00213 self.pushOpen.setToolTip( _("Search") )
00214
00215 def setText(self, text):
00216 self.uiText.setText(text)
00217 self.uiText.setCursorPosition( 0 )
00218 self.uiText.setToolTip(text)
00219