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 
00030 
00031 
00032 
00033 import time
00034 import os
00035 import gettext
00036 import base64
00037 import tempfile
00038 import subprocess
00039 
00040 from Koo import Rpc
00041 
00042 import WindowService
00043 from PreferencesDialog import *
00044 from FullTextSearchDialog import *
00045 from DatabaseCreationDialog import DatabaseCreationDialog
00046 from DatabaseDialog import *
00047 from TipOfTheDayDialog import *
00048 
00049 from PyQt4.QtCore import *
00050 from PyQt4.QtGui import *
00051 from PyQt4.uic import * 
00052 
00053 from LoginDialog import * 
00054 from AdministratorPasswordDialog import *
00055 
00056 from Koo.Common.Settings import Settings
00057 from Koo.Common import Common
00058 from Koo.Common import Api
00059 from Koo.Common import ViewSettings
00060 from Koo.Common import Debug
00061 from Koo.Common import Icons
00062 from Koo.Common import RemoteHelp
00063 
00064 from Koo.View.ViewFactory import *
00065 
00066 from Koo.Plugins import *
00067 
00068 class MainTabWidget(QTabWidget):
00069         def __init__(self, parent=None):
00070                 QTabWidget.__init__(self, parent)
00071                 self.pressedAt = -1
00072                 if Common.isQtVersion45():
00073                         self.setMovable( True )
00074 
00075         def mousePressEvent(self, event):
00076                 if event.button() == Qt.MidButton:
00077                         self.pressedAt = self.tabBar().tabAt( event.pos() )
00078         
00079         def mouseReleaseEvent(self, event):
00080                 if event.button() == Qt.MidButton:
00081                         tab = self.tabBar().tabAt( event.pos() )
00082                         if tab != self.pressedAt:
00083                                 self.pressedAt = -1
00084                                 return
00085                         self.emit(SIGNAL('middleClicked(int)'), tab)
00086 
00087         def wheelEvent(self, event):
00088                 if not self.tabBar().underMouse():
00089                         return 
00090                 degrees = event.delta() / 8
00091                 steps = degrees / 15
00092                 self.setCurrentIndex( ( self.currentIndex() + steps ) % self.count() )
00093 
00094 (KooMainWindowUi, KooMainWindowBase) = loadUiType( Common.uiPath('mainwindow.ui') )
00095 
00096 class KooMainWindow(QMainWindow, KooMainWindowUi):
00097         
00098         instance = None
00099         
00100         def __init__(self):     
00101                 QMainWindow.__init__(self)
00102                 KooMainWindowUi.__init__(self)
00103                 self.setupUi( self )
00104                 
00105                 
00106                 KooMainWindow.instance = self
00107                 
00108                 self.fixedWindowTitle = self.windowTitle()
00109 
00110                 self.uiServerInformation.setText( _('Press Ctrl+O to login') )
00111 
00112                 self.tabWidget = MainTabWidget( self. centralWidget() )
00113                 self.connect( self.tabWidget, SIGNAL("currentChanged(int)"), self.currentChanged )
00114                 self.connect( self.tabWidget, SIGNAL("middleClicked(int)"), self.closeTab )
00115                 self.connect( self.tabWidget, SIGNAL("tabCloseRequested(int)"), self.closeTab )
00116 
00117                 self.pushClose = QToolButton( self.tabWidget )
00118                 self.pushClose.setIcon( QIcon( ':/images/close_tab.png' ) )
00119                 self.pushClose.setAutoRaise( True )
00120                 self.pushClose.setSizePolicy( QSizePolicy.Fixed, QSizePolicy.Fixed )
00121                 self.pushClose.setToolTip( _('Close tab') )
00122                 self.connect(self.pushClose, SIGNAL('clicked()'), self.closeCurrentTab )
00123 
00124                 self.tabWidget.setCornerWidget( self.pushClose, Qt.TopRightCorner )
00125 
00126                 self.layout = self.centralWidget().layout()
00127                 self.layout.setSpacing( 2 )
00128                 self.layout.addWidget( self.tabWidget )
00129                 self.layout.addWidget( self.frame )     
00130 
00131                 self.actionFullTextSearch.setShortcuts( ['Ctrl+T', 'Ctrl+Alt+T'] )
00132                 
00133                 self.connect( self.actionClose, SIGNAL("triggered()"), self.closeCurrentTab )
00134                 self.connect( self.actionConnect ,SIGNAL("triggered()"), self.showLoginDialog )
00135                 self.connect( self.actionDisconnect ,SIGNAL("triggered()"), self.logout )
00136                 self.connect( self.actionSendRequest, SIGNAL("triggered()"), self.newRequest )
00137                 self.connect( self.actionReadMyRequest, SIGNAL("triggered()"), self.pendingRequests )
00138                 self.connect( self.actionWaitingRequests, SIGNAL("triggered()"), self.waitingRequests )
00139                 self.connect( self.actionNewDatabase, SIGNAL("triggered()"), self.createDatabase )
00140                 self.connect( self.actionExit, SIGNAL("triggered()"), self.close )
00141                 self.connect( self.actionFullTextSearch, SIGNAL("triggered()"), self.fullTextSearch )
00142                 self.connect( self.actionNextTab, SIGNAL("triggered()"), self.nextTab )
00143                 self.connect( self.actionPreviousTab, SIGNAL("triggered()"), self.previousTab )
00144                 self.connect( self.actionBackupDatabase, SIGNAL('triggered()'), self.backupDatabase )
00145                 self.connect( self.actionRestoreDatabase, SIGNAL('triggered()'), self.restoreDatabase )
00146                 self.connect( self.actionDropDatabase, SIGNAL('triggered()'), self.dropDatabase )
00147                 self.connect( self.actionAdminPassword, SIGNAL('triggered()'), self.changeAdministratorPassword )
00148                 self.connect( self.actionPreferences, SIGNAL('triggered()'), self.userPreferences )
00149                 self.connect( self.actionOpenMenuTab, SIGNAL('triggered()'), self.openMenuTab )
00150                 self.connect( self.actionOpenHomeTab, SIGNAL('triggered()'), self.openHomeTab )
00151                 self.connect( self.actionClearCache, SIGNAL('triggered()'), self.clearCache )
00152 
00153                 self.connect( self.actionHtmlManual, SIGNAL('triggered()'), self.openHtmlManual )
00154                 self.connect( self.actionPdfManual, SIGNAL('triggered()'), self.openPdfManual )
00155                 self.connect( self.actionDocOpenErpCom, SIGNAL('triggered()'), self.openDocOpenErpCom )
00156                 self.connect( self.actionTips, SIGNAL('triggered()'), self.showTipOfTheDay )
00157                 self.connect( self.actionShortcuts, SIGNAL('triggered()'), self.showShortcuts )
00158                 self.connect( self.actionLicense, SIGNAL('triggered()'), self.showLicense )
00159                 self.connect( self.actionAbout, SIGNAL('triggered()'), self.showAboutDialog )
00160                 
00161                 self.connect( self.actionFormDesigner, SIGNAL('triggered()'), self.formDesigner )
00162 
00163                 
00164                 self.connect( self.pushReadRequests, SIGNAL('clicked()'), self.pendingRequests )
00165                 self.connect( self.pushSendRequest, SIGNAL('clicked()'), self.newRequest )
00166 
00167                 self.connect( self.pushHelp, SIGNAL('clicked()'), self.help )
00168 
00169                 
00170                 
00171                 
00172                 
00173                 
00174                 self.actions = [ 'New', 'Save', 'Delete', 'Find', 'Previous', 'Next', 
00175                         'Reload', 'Switch', 'Attach', 'Export', 'Import', 'GoToResourceId', 
00176                         'Duplicate', 'AccessLog', 'MassiveUpdate', 'StoreViewSettings' ]
00177                 for x in self.actions:
00178                         action = eval('self.action'+ x)
00179                         self.connect( action, SIGNAL( 'triggered()' ), self.callChildView )
00180 
00181 
00182                 self.pushSwitchView = self.uiToolBar.widgetForAction( self.actionSwitch )
00183                 self.pushSwitchView.setPopupMode( QToolButton.MenuButtonPopup )
00184 
00185                 self.updateEnabledActions()
00186 
00187                 self.shortcutActions = []
00188                 self.shortcutsGroup = None
00189 
00190                 
00191                 
00192                 self.menuId = False
00193 
00194                 
00195                 
00196                 self.requestsTimer = QTimer()
00197                 self.connect( self.requestsTimer, SIGNAL('timeout()'), self.updateRequestsStatus )
00198                 self.pendingRequests = -1 
00199                 
00200                 
00201                 self.subscriber = None
00202 
00203                 
00204                 self.actionOpenPartnersTab = QAction( self )
00205                 self.actionOpenPartnersTab.setIcon( QIcon( ':/images/partner.png' ) )
00206                 self.actionOpenPartnersTab.setText( _('Open partners tab') )
00207                 self.connect( self.actionOpenPartnersTab, SIGNAL('triggered()'), self.openPartnersTab )
00208 
00209                 self.actionOpenProductsTab = QAction( self )
00210                 self.actionOpenProductsTab.setIcon( QIcon( ':/images/product.png' ) )
00211                 self.actionOpenProductsTab.setText( _('Open products tab') )
00212                 self.connect( self.actionOpenProductsTab, SIGNAL('triggered()'), self.openProductsTab )
00213                 
00214                 self.systemTrayMenu = QMenu()
00215                 self.systemTrayMenu.addAction( self.actionFullTextSearch )
00216                 self.systemTrayMenu.addAction( self.actionOpenPartnersTab ) 
00217                 self.systemTrayMenu.addAction( self.actionOpenProductsTab ) 
00218                 self.systemTrayMenu.addAction( self.actionOpenMenuTab )
00219                 self.systemTrayMenu.addSeparator()
00220                 self.systemTrayMenu.addAction( self.actionSendRequest )
00221                 self.systemTrayMenu.addAction( self.actionReadMyRequest )
00222                 self.systemTrayMenu.addAction( self.actionWaitingRequests )
00223                 self.systemTrayMenu.addSeparator()
00224                 self.systemTrayMenu.addAction( self.actionExit )
00225 
00226                 self.systemTrayIcon = QSystemTrayIcon( self )
00227                 self.systemTrayIcon.setIcon( QIcon(":/images/koo-icon.png") )
00228                 self.systemTrayIcon.setContextMenu( self.systemTrayMenu )
00229                 self.connect( self.systemTrayIcon, SIGNAL('activated(QSystemTrayIcon::ActivationReason)'), self.systemTrayIconActivated )
00230 
00231                 if RemoteHelp.isRemoteHelpAvailable():
00232                         
00233                         self.actionRemoteHelp = QAction( self )
00234                         self.actionRemoteHelp.setIcon( QIcon( ':/images/partner.png' ) )
00235                         self.actionRemoteHelp.setText( _('Remote Help') )
00236                         QObject.connect( self.actionRemoteHelp, SIGNAL('triggered()'), self.remoteHelp )
00237                         self.menuHelp.addAction( self.actionRemoteHelp )
00238 
00239                 
00240                 
00241                 Plugins.list()
00242 
00243         def remoteHelp(self):
00244                 RemoteHelp.remoteHelp( self )
00245 
00246         def systemTrayIconActivated(self, reason):
00247                 if reason != QSystemTrayIcon.DoubleClick:
00248                         return
00249                 self.setVisible( not self.isVisible() )
00250                 if self.isMinimized():
00251                         self.showNormal()
00252 
00253         def openPartnersTab(self):
00254                 if not self.isVisible():
00255                         self.showNormal()
00256                 Api.instance.createWindow(None, 'res.partner', mode='tree')
00257 
00258         def openProductsTab(self):
00259                 if not self.isVisible():
00260                         self.showNormal()
00261 
00262                 model = Rpc.session.execute('/object', 'execute', 'ir.model', 'search', [('model','=','product.product')], Rpc.session.context )
00263                 if not model:
00264                         QMessageBox.information(self, _('Products'), _('Products module is not installed.') )
00265                         return
00266 
00267                 Api.instance.createWindow(None, 'product.product', mode='tree')
00268                         
00269 
00270         def startRequestsTimer(self):
00271                 
00272                 
00273                 frequency = Settings.value( 'koo.requests_refresh_interval', 5 * 60, int ) * 1000
00274                 if frequency > 0:
00275                         self.requestsTimer.start( frequency )
00276                 else:
00277                         self.requestsTimer.stop()
00278 
00279                 
00280                 self.checkNewRelease()
00281 
00282                 
00283                 
00284                 self.subscriber = Rpc.Subscriber(Rpc.session, self)
00285                 
00286                 self.subscriber.subscribe( 'updated_model:res.request', self.updateRequestsStatus )
00287 
00288         def stopRequestsTimer(self):
00289                 self.requestsTimer.stop()
00290                 if self.subscriber:
00291                         self.subscriber.unsubscribe()
00292                         self.subscriber = None
00293 
00294         def formDesigner(self):
00295                 dialog = FormDesigner(self)
00296                 dialog.show()
00297 
00298         
00299         
00300         
00301         
00302         
00303         
00304         
00305         def closeTab(self, tab):
00306                 widget = self.tabWidget.widget(tab)
00307                 if widget:
00308                         
00309                         if not widget.canClose():
00310                                 return False
00311                 self.tabWidget.removeTab( tab ) 
00312                 if widget:
00313                         widget.setParent( None )
00314                         del widget
00315                 self.updateEnabledActions()
00316                 return True
00317 
00318         
00319         def closeCurrentTab(self):
00320                 return self.closeTab( self.tabWidget.currentIndex() )
00321 
00322         def fullTextSearch(self):
00323                 
00324                 
00325                 
00326                 if not self.isVisible():
00327                         self.showNormal()
00328 
00329                 win = FullTextSearchDialog(self)
00330                 win.exec_()
00331 
00332         def nextTab(self):
00333                 pn = self.tabWidget.currentIndex()
00334                 if pn == self.tabWidget.count() - 1:
00335                         pn = 0
00336                 else:
00337                         pn = pn + 1
00338                 self.tabWidget.setCurrentIndex( pn )
00339 
00340         def previousTab(self):
00341                 pn = self.tabWidget.currentIndex()
00342                 if pn == 0:
00343                         pn = self.tabWidget.count() - 1
00344                 else:
00345                         pn = pn - 1
00346                 self.tabWidget.setCurrentIndex( pn )
00347 
00348         def userPreferences(self):
00349                 win = PreferencesDialog(self)
00350                 win.exec_()
00351 
00352         def newRequest(self):
00353                 if not self.isVisible():
00354                         self.showNormal()
00355                 Api.instance.createWindow(None, 'res.request', False, 
00356                         [('act_from','=',Rpc.session.uid)], 'form', mode='form,tree')
00357 
00358         
00359         def pendingRequests(self):
00360                 if not self.isVisible():
00361                         self.showNormal()
00362                 Api.instance.createWindow(False, 'res.request', False, 
00363                         [('act_to','=',Rpc.session.uid)], 'form', mode='tree,form')
00364 
00365         
00366         def waitingRequests(self):
00367                 if not self.isVisible():
00368                         self.showNormal()
00369                 Api.instance.createWindow(False, 'res.request', False, 
00370                         [('act_from','=',Rpc.session.uid), ('state','=','waiting')], 'form', mode='tree,form')
00371 
00372         
00373         
00374         
00375         
00376         
00377         def updateRequestsStatus(self):
00378                 
00379                 
00380                 uid = Rpc.session.uid
00381                 try:
00382                         ids,ids2 = Rpc.session.call('/object', 'execute', 'res.request', 'request_get')
00383                 except Rpc.RpcException, e:
00384                         return ([], [])
00385 
00386                 if len(ids):
00387                         message = _('%s request(s)') % len(ids)
00388                 else:
00389                         message = _('No request')
00390                 if len(ids2):
00391                         message += _(' - %s pending request(s)') % len(ids2)
00392                 self.uiRequests.setText( message )
00393                 message = "%s - [%s]" % (message, Rpc.session.databaseName)
00394                 self.systemTrayIcon.setToolTip( message )
00395                 if self.pendingRequests != -1 and self.pendingRequests < len(ids):
00396                         QApplication.alert( self )
00397                         if self.systemTrayIcon.isVisible() and not self.isVisible():
00398                                 self.systemTrayIcon.showMessage( _("New Request"), _("You've received a new request") )
00399                 self.pendingRequests = len(ids)
00400                 return (ids, ids2)
00401 
00402         def help(self):
00403                 widget = self.tabWidget.currentWidget()
00404                 if widget:
00405                         widget.help( self.pushHelp )
00406 
00407         def checkNewRelease(self):
00408                 from Koo.Common import Version
00409 
00410                 Rpc.session.callAsync(self.newReleaseInformation, '/object', 'execute', 'nan.koo.release', 'needs_update', Version.Version, os.name, True, Rpc.session.context)
00411                 
00412         def newReleaseInformation(self, value, exception):
00413                 if exception:
00414                         return
00415 
00416                 if not value:
00417                         return
00418 
00419                 directory = tempfile.mkdtemp()
00420                 installer = os.path.join( directory, value['filename'] )
00421                 f = open( installer, 'wb' )
00422                 f.write( base64.decodestring( value['installer'] ) )
00423                 f.close()
00424                 command_line = value['command_line'].split(' ')
00425                 command_line = [x.replace('$path', directory) for x in command_line]
00426                 subprocess.Popen(command_line, cwd=directory)
00427 
00428         def showLoginDialog(self):
00429                 dialog = LoginDialog( self )
00430                 while dialog.exec_() == QDialog.Accepted:
00431                         self.login( dialog.url, dialog.databaseName )
00432                         if Rpc.session.open:
00433                                 return
00434 
00435         
00436         
00437         
00438         
00439         
00440         
00441         
00442         
00443         
00444         def login(self, url, databaseName):
00445                 
00446                 
00447                 
00448                 
00449                 if not self.logout():
00450                         return
00451                 try:
00452                         loginResponse = Rpc.session.login(url, databaseName)
00453                         url = QUrl( url )
00454                         if loginResponse == Rpc.session.LoggedIn:
00455                                 Settings.loadFromServer()
00456                                 if Settings.value('koo.use_cache'):
00457                                         Rpc.session.cache = Rpc.Cache.ActionViewCache()
00458                                 else:
00459                                         Rpc.session.cache = None
00460 
00461                                 iconVisible = Settings.value('koo.show_system_tray_icon', True )
00462                                 self.systemTrayIcon.setVisible( iconVisible )
00463 
00464                                 
00465                                 
00466                                 self.startRequestsTimer()
00467 
00468                                 self.openMenuTab()
00469                                 self.openHomeTab()
00470 
00471                                 if Common.isQtVersion45():
00472                                         self.tabWidget.setTabsClosable( Settings.value('koo.tabs_closable') )
00473 
00474                                 self.updateRequestsStatus()
00475                                 self.updateUserShortcuts()
00476 
00477                         elif loginResponse == Rpc.session.Exception:
00478                                 QMessageBox.warning(self, _('Connection error !'), _('Unable to connect to the server !')) 
00479                         elif loginResponse == Rpc.session.InvalidCredentials:
00480                                 QMessageBox.warning(self, _('Connection error !'), _('Bad username or password !'))
00481 
00482                 except Rpc.RpcException, e:
00483                         if len(e.args) == 2:
00484                                 (e1,e2) = e.args
00485                                 Common.error(_('Connection Error !'), e.args[0], e.args[1])
00486                         else:
00487                                 Common.error(_('Connection Error !'), _('Error logging into database.'), e)
00488                         Rpc.session.logout()
00489 
00490 
00491         
00492         def closeAllTabs(self):
00493                 while self.tabWidget.count() > 0:
00494                         if not self.closeCurrentTab():
00495                                 return False
00496                 return True
00497 
00498         def logout(self):
00499                 if not self.closeAllTabs():
00500                         return False
00501                 self.uiRequests.clear()
00502                 self.stopRequestsTimer()
00503                 self.uiUserName.setText( _('Not logged !') )
00504                 self.uiServerInformation.setText( _('Press Ctrl+O to login') )
00505                 self.setWindowTitle( self.fixedWindowTitle )
00506                 Rpc.session.logout()
00507                 self.updateEnabledActions()
00508                 self.updateUserShortcuts()
00509                 return True
00510 
00511         def openPdfManual(self):
00512                 try:
00513                         pdf = Rpc.session.call('/object', 'execute', 'ir.documentation.paragraph', 'export_to_pdf', Rpc.session.context)
00514                 except:
00515                         return False
00516                 if not pdf:
00517                         return False
00518 
00519                 pdf = base64.decodestring(pdf)
00520                 fd, fileName = tempfile.mkstemp( '.pdf' )
00521                 os.write( fd, pdf )
00522                 os.close( fd )
00523                 Common.openFile( fileName )
00524                 return True
00525 
00526         def openHtmlManual(self):
00527                 Api.instance.createWebWindow( 'openerp://ir.documentation.file/get/index.html', _('Manual') )
00528 
00529         def openDocOpenErpCom(self):
00530                 Api.instance.createWebWindow( 'http://doc.openerp.com', 'doc.openerp.com' )
00531 
00532         def showTipOfTheDay(self):
00533                 dialog = TipOfTheDayDialog(self)
00534                 dialog.exec_()
00535                 
00536         def showLicense(self):
00537                 dialog = QDialog( self )
00538                 loadUi( Common.uiPath('license.ui'), dialog )
00539                 dialog.exec_()
00540 
00541         def showAboutDialog(self):
00542                 dialog = QDialog( self )
00543                 loadUi( Common.uiPath('about.ui'), dialog )
00544                 from Koo.Common import Version
00545                 dialog.uiOpenErp.setHtml( unicode(dialog.uiOpenErp.toHtml()) % Version.Version )
00546                 dialog.exec_()
00547 
00548         def showShortcuts(self):
00549                 dialog = QDialog( self )
00550                 loadUi( Common.uiPath('shortcuts.ui'), dialog )
00551                 dialog.exec_()
00552 
00553         def shortcutsChanged(self, model):
00554                 if model == 'ir.ui.menu':
00555                         self.updateUserShortcuts()
00556 
00557         def updateUserShortcuts(self):
00558                 
00559                 for action in self.shortcutActions:
00560                         self.menuWindow.removeAction( action )
00561                 self.shortcutActions = []
00562 
00563                 if not Rpc.session.logged():
00564                         return
00565                 fields = Rpc.session.execute('/object', 'execute', 'ir.ui.view_sc', 'fields_get', ['res_id', 'name'])
00566                 self.shortcutsGroup = RecordGroup( 'ir.ui.view_sc', fields )
00567                 self.shortcutsGroup.setDomain( [('user_id','=',Rpc.session.uid), ('resource','=','ir.ui.menu')] )
00568                 self.shortcutActions.append( self.menuWindow.addSeparator() )
00569                 for record in self.shortcutsGroup:
00570                         action = QAction( self )
00571                         action.setObjectName( str( record.id ) )
00572                         action.setText( record.value('name') )
00573                         action.setIcon( QIcon( ':/images/relate.png' ) )
00574                         self.connect( action, SIGNAL('triggered()'), self.executeShortcut )
00575                         self.menuWindow.addAction( action )
00576                         self.shortcutActions.append( action )
00577 
00578         def executeShortcut(self):
00579                 action = self.sender()
00580                 id = int( action.objectName() )
00581                 
00582                 
00583                 
00584                 m = self.shortcutsGroup[ id ]
00585                 id = self.shortcutsGroup.fieldObjects[ 'res_id' ].get( m )
00586                 Api.instance.executeKeyword('tree_but_open', {'model':'ir.ui.menu', 'id':id, 'ids': [id]})
00587 
00588         
00589         
00590         
00591         
00592         def openMenuTab(self):
00593 
00594                 
00595                 if not self.isVisible():
00596                         self.showNormal()
00597 
00598                 
00599                 for p in range(self.tabWidget.count()):
00600                         if self.tabWidget.widget(p).model=='ir.ui.menu':
00601                                 self.tabWidget.setCurrentIndex(p)
00602                                 return 
00603 
00604                 
00605                 data = Rpc.session.execute('/object', 'execute', 'res.users', 'read', [Rpc.session.uid], ['menu_id','name','company_id'], Rpc.session.context)
00606                 record = data[0]
00607                 user = record['name'] or ''
00608                 company = record['company_id'][1]
00609                 self.uiUserName.setText( '%s (%s)' % (user, company)  )
00610                 self.uiServerInformation.setText( "%s [%s]" % (Rpc.session.url, Rpc.session.databaseName) )
00611                 self.setWindowTitle( "[%s] - %s" % (Rpc.session.databaseName, self.fixedWindowTitle) )
00612 
00613 
00614                 if not record['menu_id']:
00615                         QMessageBox.warning(self, _('Access denied'), _('You can not log into the system !\nAsk the administrator to verify\nyou have an action defined for your user.') )
00616                         Rpc.session.logout()
00617                         self.menuId = False
00618                         return 
00619 
00620                 
00621                 
00622                 self.menuId = record['menu_id'][0]
00623 
00624                 Api.instance.execute(self.menuId, {'window':self })
00625 
00626 
00627         
00628         
00629         
00630         
00631         def openHomeTab(self):
00632                 id = Rpc.session.execute('/object', 'execute', 'res.users', 'read', [Rpc.session.uid], [ 'action_id','name'], Rpc.session.context)
00633 
00634                 if not id[0]['action_id']:
00635                         return 
00636                 id = id[0]['action_id'][0]
00637                 if not id:
00638                         return
00639 
00640                 
00641                 if id == self.menuId:
00642                         return
00643                 Api.instance.execute(id, {'window':self })
00644 
00645         def clearCache(self):
00646                 ViewSettings.ViewSettings.clear()
00647                 if Rpc.session.cache:
00648                         Rpc.session.cache.clear()
00649 
00650         def closeEvent(self, event):
00651                 if QMessageBox.question(self, _("Quit"), _("Do you really want to quit ?"), _("Yes"), _("No")) == 1:
00652                         event.ignore()  
00653                         return
00654                 wid = self.tabWidget.currentWidget()
00655                 if wid:
00656                         
00657                         if not wid.canClose():
00658                                 event.ignore()
00659                                 return
00660                 Rpc.session.logout()
00661                 self.systemTrayIcon.setVisible( False )
00662 
00663         def closeTabForced(self):
00664                 idx = self.tabWidget.indexOf( self.sender() )
00665                 self.tabWidget.removeTab( idx ) 
00666                 self.updateEnabledActions()
00667                 
00668 
00669         def addWindow(self, win, target):
00670                 if target in ('current', 'background'):
00671                         self.connect( win, SIGNAL('closed()'), self.closeTabForced )
00672                         self.connect( win, SIGNAL('shortcutsChanged'), self.shortcutsChanged )
00673                         self.tabWidget.addTab( win, win.name )
00674                         
00675                         if target != 'background':
00676                                 self.tabWidget.setCurrentIndex( self.tabWidget.count()-1 )
00677                 else:
00678                         
00679                         
00680                         
00681                         parent = QApplication.activeModalWidget()
00682                         if not parent:
00683                                 parent = self
00684                         dialog = QDialog( parent )
00685                         dialog.setWindowTitle( _('Wizard') )
00686                         dialog.setModal( True )
00687                         layout = QHBoxLayout(dialog)
00688                         layout.setContentsMargins( 0, 0, 0, 0 )
00689                         layout.addWidget( win )
00690                         win.setParent( dialog )
00691                         self.connect( win, SIGNAL('closed()'), dialog.accept )
00692                         win.show()
00693                         dialog.exec_()
00694 
00695         def updateEnabledActions(self):
00696                 view = self.tabWidget.currentWidget()
00697                 for x in self.actions:
00698                         action = eval( 'self.action' + x )
00699                         if view and x in view.handlers:
00700                                 action.setEnabled( True )
00701                         else:
00702                                 action.setEnabled( False )
00703 
00704                 if Rpc.session.open:
00705                         self.actionFullTextSearch.setEnabled( True )
00706                 else:
00707                         self.actionFullTextSearch.setEnabled( False )
00708 
00709                 if Settings.value('koo.allow_massive_updates', True):
00710                         self.actionMassiveUpdate.setVisible( True )
00711                 else:
00712                         self.actionMassiveUpdate.setVisible( False )
00713 
00714                 
00715                 self.menuReports.clear()
00716                 self.menuBrowse.clear()
00717                 self.menuActions.clear()
00718                 self.menuPlugins.clear()
00719                 reports = False
00720                 browse = False
00721                 actions = False
00722                 plugins = False
00723                 if view:
00724                         self.pushSwitchView.setMenu( view.switchViewMenu() )
00725                         for x in view.actions():
00726                                 if x.type() == 'print':
00727                                         self.menuReports.addAction( x )
00728                                         reports = True
00729                                 elif x.type() == 'relate':
00730                                         self.menuBrowse.addAction( x )
00731                                         browse = True
00732                                 elif x.type() == 'action':
00733                                         self.menuActions.addAction( x ) 
00734                                         actions = True
00735                                 else: 
00736                                         self.menuPlugins.addAction( x )
00737                                         plugins = True
00738                         
00739                 self.menuReports.setEnabled( reports )
00740                 self.menuBrowse.setEnabled( browse )
00741                 self.menuActions.setEnabled( actions )
00742                 self.menuPlugins.setEnabled( plugins )
00743 
00744                 value = Rpc.session.logged()
00745                 self.actionOpenMenuTab.setEnabled( value )
00746                 self.actionOpenHomeTab.setEnabled( value )
00747                 self.actionPreferences.setEnabled( value )
00748                 self.actionClearCache.setEnabled( value )
00749                 self.actionSendRequest.setEnabled( value )
00750                 self.actionReadMyRequest.setEnabled( value )
00751                 self.actionWaitingRequests.setEnabled( value )
00752                 self.actionDisconnect.setEnabled( value )
00753 
00754                 if self.tabWidget.count() > 0:
00755                         value = True
00756                 else:
00757                         value = False
00758                 self.actionClose.setEnabled( value )
00759                 self.actionNextTab.setEnabled( value )
00760                 self.actionPreviousTab.setEnabled( value )
00761 
00762         def callChildView( self ):
00763                 o = self.sender()
00764                 action = str( o.objectName() ).replace('action','')
00765                 wid = self.tabWidget.currentWidget()
00766                 if wid:
00767                         res = True
00768                         if action in wid.handlers:
00769                                 res = wid.handlers[action]()
00770 
00771         def currentChanged( self, page ): 
00772                 self.updateEnabledActions()
00773 
00774         def createDatabase(self):
00775                 dialog = DatabaseCreationDialog(self)
00776                 if dialog.exec_() == QDialog.Accepted:
00777                         self.login( dialog.url, dialog.databaseName )
00778 
00779         def dropDatabase(self):
00780                 dropDatabase( self )
00781 
00782         def restoreDatabase(self):
00783                 restoreDatabase( self )
00784 
00785         def backupDatabase(self):
00786                 backupDatabase( self )
00787 
00788         def changeAdministratorPassword(self):
00789                 dialog = AdministratorPasswordDialog( self )
00790                 dialog.exec_()
00791