""" CCP4DemoData.py: CCP4 GUI Project Copyright (C) 2015STFC This library is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3, modified in accordance with the provisions of the license to address the requirements of UK law.sstac You should have received a copy of the modified GNU Lesser General Public License along with this library. If not, copies may be downloaded from http://www.ccp4.ac.uk/ccp4license.php This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. """ """ Liz Potterton Sept 2015 - Create, download demo data """ import os, glob, time from PyQt4 import QtGui,QtCore from CCP4ErrorHandling import * import CCP4Utils,CCP4Modules,CCP4Annotation,CCP4Widgets import CCP4Container class CMachineUserPassDialog(QtGui.QDialog): insts = None def password(self): return str(self.widgets['password'].text()) def username(self): return str(self.widgets['username'].text()) def machine(self): return str(self.widgets['server'].text()) def ccp4Dir(self): return str(self.widgets['ccp4Dir'].text()) def get(self,param): if param == 'machine' : param = 'server' if param == 'mechanism': serverGroup = self.container.get('SERVERGROUP'+str(self.modeGroup.checkedId())) return str(serverGroup.mechanism) else: if isinstance(self.widgets[param],QtGui.QLineEdit): return str(self.widgets[param].text()) else: return str(self.widgets[param].currentText()) def setInfo(self,info=None): if info is None: self.widgets['info'].setText('') else: self.widgets['info'].setText(info) def valid(self): return True def __init__(self,parent=None,username="",password="",machine="",ccp4Dir='',info=""): QtGui.QDialog.__init__(self,parent) try: self.loadConfig() except: print 'Failed loading server config file from CCP4I2/local_setup/servers_config.params.xml' self.setWindowTitle('Choose server to run job') layout = QtGui.QVBoxLayout() self.setLayout(layout) self.setMinimumWidth(500) self.widgets = { } frame = QtGui.QFrame(self) frame.setLayout(QtGui.QVBoxLayout()) frame.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Plain) MARGIN = 6 frame.layout().setSpacing(MARGIN) frame.layout().setContentsMargins(MARGIN,MARGIN,MARGIN,MARGIN) frame.layout().addWidget(CCP4Widgets.CItalicLabel('Choose group of servers to use..',self)) self.layout().addWidget(frame) self.modeGroup = QtGui.QButtonGroup(self) default = 0 row = 0 for idx in range(1,10): group = self.container.get('SERVERGROUP'+str(idx)) print 'SERVERGROUP',idx,group if group is not None and group.isSet(): but = QtGui.QRadioButton(str(group.name),self) self.modeGroup.addButton(but,idx) frame.layout().addWidget(but) row = row + 1 if default==0: default = idx self.modeGroup.button(default).setChecked(True) frame = QtGui.QFrame(self) self.layout().addWidget(frame) layout = QtGui.QGridLayout() frame.setLayout(layout) frame.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Plain) layout.addWidget(CCP4Widgets.CItalicLabel('Details',self),0,0,1,2) row = 1 for var,text,param,tooltip in [ [ machine , 'Server' , 'server', 'Choose a server'], [ ccp4Dir, 'CCP4 directory on server', 'ccp4Dir', 'Full path of CCP4 on the server machine' ], [ username , 'Your username on server' , 'username', 'Your username on server'], [ password, 'Your password on server', 'password','Your password on server' ] ] : layout.addWidget( QtGui.QLabel(text,self),row,0) if param == 'server': self.widgets[param] = QtGui.QComboBox(self) else: self.widgets[param] = QtGui.QLineEdit(self) self.widgets[param].setText(var) self.widgets[param].setToolTip(tooltip) if param == 'password' : self.widgets[param].setEchoMode(QtGui.QLineEdit.Password) layout.addWidget(self.widgets[param],row,1) row = row + 1 butBox = QtGui.QDialogButtonBox(self) but = butBox.addButton("Run remote job",QtGui.QDialogButtonBox.AcceptRole) but.clicked.connect(self.accept) but = butBox.addButton("Help",QtGui.QDialogButtonBox.HelpRole) but.clicked.connect(self.help) but = butBox.addButton("Cancel",QtGui.QDialogButtonBox.RejectRole) but.clicked.connect(self.reject) self.layout().addWidget(butBox) self.loadServers() self.connect(self.modeGroup,QtCore.SIGNAL('buttonReleased(int)'),self.loadServers) self.connect(self.widgets['server'],QtCore.SIGNAL('currentIndexChanged(int)'),self.loadccp4Dir) def loadServers(self,mode=None): serverGroup = self.container.get('SERVERGROUP'+str(self.modeGroup.checkedId())) print 'loadServers',self.modeGroup.checkedId(),serverGroup,len(serverGroup.serverList) self.widgets['server'].setEditable(bool(serverGroup.userExtensible)) self.widgets['server'].clear() for item in serverGroup.serverList: self.widgets['server'].addItem(str(item)) self.loadccp4Dir() def loadccp4Dir(self,**args): serverGroup = self.container.get('SERVERGROUP'+str(self.modeGroup.checkedId())) if serverGroup.ccp4Dir.isSet(): self.widgets['ccp4Dir'].setText(str(serverGroup.ccp4Dir)) else: self.widgets['ccp4Dir'].setText('') def loadConfig(self): import CCP4Modules self.container = CCP4Modules.SERVERSETUP() def accept(self): QtGui.QDialog.accept(self) def reject(self): QtGui.QDialog.reject(self) def setInfo(self,text): if not self.widgets.has_key('info'): self.widgets['info'] = QtGui.QLabel(self) self.widgets['info'].setObjectName('warning') self.layout().insertWidget(0,self.widgets['info']) self.widgets['info'].setText(text) def help(self): CCP4Modules.WEBBROWSER().loadWebPage(helpFileName='runRemote.html',newTab=True) class CServerGroupView(CCP4Widgets.CComplexLineWidget): MODEL_CLASS = CCP4Annotation.CServerGroup def __init__(self,parent=None,model=None,qualifiers={}): qualis = { 'vboxLayout' : True } qualis.update(qualifiers) CCP4Widgets.CComplexLineWidget.__init__(self,parent=parent,qualifiers=qualis) self.layout().takeAt(0).widget().deleteLater() self.widgets['name'] = CCP4Widgets.CStringView(self) self.widgets['mechanism'] = CCP4Widgets.CComboBox(self) if model is not None: self.widgets['mechanism'].populate(menuItems=model.mechanism.qualifiers('enumerators'),menuText=model.mechanism.qualifiers('menuText')) self.widgets['serverList'] = CCP4Widgets.CListView(self,model=model.serverList) self.widgets['userExtensible'] = CCP4Widgets.CBooleanView(self) self.widgets['ccp4Dir'] = CCP4Widgets.CDataFileView(self,qualifiers={ 'autoInfoOnFileImport' : False, 'jobCombo': False, 'browseDb' : False , 'isDirectory' : True, 'allowUndefined' : True,'mustExist' : False } ) line = QtGui.QHBoxLayout() line.addWidget(QtGui.QLabel('Name for server group',self)) line.addWidget(self.widgets['name']) line.addWidget(QtGui.QLabel('using mechanism',self)) line.addWidget(self.widgets['mechanism']) self.layout().addLayout(line) line = QtGui.QHBoxLayout() self.widgets['serverList'].setLineWidth(1) self.widgets['serverList'].setFrameStyle(QtGui.QFrame.Box|QtGui.QFrame.Plain) line.addWidget(self.widgets['serverList']) self.layout().addLayout(line) self.widgets['serverList'].setListVisible(True) line = QtGui.QHBoxLayout() line.addWidget(self.widgets['userExtensible']) line.addWidget(QtGui.QLabel('Allow users to add alternative servers at run time',self)) line.addStretch(2) self.layout().addLayout(line) line = QtGui.QHBoxLayout() line.addWidget(CCP4Widgets.CItalicLabel('CCP4 distro directory on these servers',self)) self.layout().addLayout(line) line = QtGui.QHBoxLayout() line.addWidget(self.widgets['ccp4Dir']) self.layout().addLayout(line) self.setModel(model=model) self.updateViewFromModel() def updateModelFromView(self): CCP4Widgets.CComplexLineWidget.updateModelFromView(self) #print 'CServerGroupView.updateModelFromView',self.widgets['mechanism'].getValue() self.model.mechanism.set( self.widgets['mechanism'].getValue() ) class CServerSetupWindow(QtGui.QDialog): ''' This is the glue to get display the CTaskServerSetup as an independent window ''' def __init__(self,parent): QtGui.QDialog.__init__(self,parent) self.setMaximumWidth(650) self.setMinimumHeight(500) self.setLayout(QtGui.QVBoxLayout()) self.widgets= {} import functools import CCP4Modules,CCP4Widgets self.container = CCP4Modules.SERVERSETUP() if self.container.source is not None: line = QtGui.QHBoxLayout() self.sourceLabel = QtGui.QLabel('Server setup loaded from '+str(self.container.source),self) line.addWidget(self.sourceLabel) self.layout().addLayout(line) altSource = ['user','installation'][1 - ['user','installation'].index( self.container.source )] if os.path.exists(self.container.preferencesFile(altSource)[0]): self.altSourceBut = QtGui.QPushButton('Load '+altSource+' setup',self) line.addWidget(self.altSourceBut) self.connect(self.altSourceBut,QtCore.SIGNAL('clicked()'),self.handleLoadAlt) for n in range(1,2): self.widgets['SERVERGROUP'+str(n)] = CServerGroupView(self,self.container.get('SERVERGROUP'+str(n))) self.layout().addWidget(self.widgets['SERVERGROUP'+str(n)]) self.buttons = QtGui.QDialogButtonBox(self) but = self.buttons.addButton(QtGui.QDialogButtonBox.Help) self.connect(but,QtCore.SIGNAL('clicked()'),self.help) if self.container.writeAccess('installation'): but = self.buttons.addButton('Save for CCP4 installation',QtGui.QDialogButtonBox.ApplyRole) self.connect(but,QtCore.SIGNAL('clicked()'),functools.partial(self.doApply,'installation')) but = self.buttons.addButton('Save for me only',QtGui.QDialogButtonBox.ApplyRole) self.connect(but,QtCore.SIGNAL('clicked()'),functools.partial(self.doApply,'user')) but = self.buttons.addButton(QtGui.QDialogButtonBox.Cancel) self.connect(but,QtCore.SIGNAL('clicked()'),self.close) line = QtGui.QHBoxLayout() line.addStretch(0.2) line.addWidget(self.buttons) line.addStretch(0.2) self.layout().addLayout(line) def handleLoadAlt(self): altSource = ['user','installation'][1 - ['user','installation'].index( self.container.source )] print 'handleAltSource',altSource self.container.load(altSource) for n in range(1,2): self.widgets['SERVERGROUP'+str(n)].updateViewFromModel() altSource = ['user','installation'][1 - ['user','installation'].index( self.container.source )] self.altSourceBut.setText('Load '+altSource+' setup') self.sourceLabel.setText('Server setup loaded from '+str(self.container.source)) def doApply(self,source): print 'CServerSetupWindow.doApply', self.widgets['SERVERGROUP1'].widgets['serverList'].listWidget.count() invalidList = [] for key in self.widgets.keys(): self.widgets[key].updateModelFromView() print 'CServerSetupWindow.doApply',key,self.widgets[key].widgets['mechanism'].currentIndex(),self.container.get(key).mechanism self.widgets[key].validate() if self.widgets[key].isValid is not None and not self.widgets[key].isValid: invalidList.append(key) if len(invalidList)>0: QtGui.QMessageBox.warning(self,'Server setup','Invalid data - not saved') else: self.container.save(source) QtGui.QDialog.close(self) def close(self): QtGui.QDialog.close(self) def help(self): CCP4Modules.WEBBROWSER().loadWebPage(helpFileName='runRemote.html',newTab=True)