source: dassmodus/trunk/dassmodus/dassmodus/dassModus.py@ 954

Last change on this file since 954 was 954, checked in by pstorz, on Sep 28, 2011 at 11:33:28 AM

forgotten files for first checkin

  • Property svn:executable set to *
File size: 51.7 KB
RevLine 
[954]1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# $Id: dassmodus.py 11432 2010-11-01 19:20:55Z pstorz $
5
6
7from PyQt4 import QtGui, QtCore
8from PyQt4.QtCore import *
9from PyQt4.QtGui import *
10from functools import partial
11
12import dassmodus.ui.schedule
13import dassmodus.ui.onlinehelpdialog
14import dassmodus.ui.messagesdialog
15import dassmodus.ui.listselectdialog
16import dassmodus.ui.baseconfwizard
17import dassmodus.ui.fetchDCdialog
18import dassmodus.ui.integrityCheckDialog
19import dassmodus.ui.newdatacenterwizard
20import dassmodus.ui.deploywizard
21
22from nosferatu.bacresources import *
23from nosferatu.prettynames import PrettyNames
24#from nosferatu.directive import *
25#from nosferatu import configrules
26
27import logging
28
29logging.basicConfig(level=logging.DEBUG,
30 format='%(asctime)s %(levelname)s \t (%(module)s:%(lineno)d) %(message)s ',
31 #filename='vanHelsing.log',
32 filemode='w')
33
34
35import sys
36import os
37import re
38import platform
39#import glob
40
41from dassmodus.ui.mainwindow import Ui_MainWindow as Dlg
42import re
43
44import xmlrpclib
45
46import dassmodus.dragndrop
47
48import dassmodus.ui.qt_resources # for the icons
49
50
51'''
52find where our executable script is called from,as the templates dir is relative to that.
53As we are running as py2exe on windows, we have to make these efforts:
54see http://www.py2exe.org/index.cgi/WhereAmI
55'''
56def we_are_frozen():
57 """Returns whether we are frozen via py2exe.
58 This will affect how we find out where we are located."""
59
60 return hasattr(sys, "frozen")
61
62
63def module_path():
64 """ This will get us the program's directory,
65 even if we are frozen using py2exe"""
66
67 if we_are_frozen():
68 return os.path.dirname(unicode(sys.executable, sys.getfilesystemencoding( )))
69 return os.path.dirname(unicode(__file__, sys.getfilesystemencoding( )))
70
71DASSMODUS_PATH = module_path()
72
73RXP_DATE = re.compile('.*\((.*)\)')
74
75#from nosferatu.directive import *
76
77__version__ = 0.1
78
79__revision__ = "$Rev: 11441 $".replace('$','').replace('Rev: ','.')
80
81
82datestring = "$Date: 2011-02-10 15:00:43 +0100 (Do, 10 Feb 2011) $".replace('$','').replace('Date: ','')
83m = RXP_DATE.match(datestring)
84__date__ = '(' + m.group(1) + ')'
85
86
87
88
89INTERNALLY_REFERENCED_ITEMS = set(['fileset',
90 'client' ,
91 'catalog',
92 'messages',
93 'schedule',
94 'storage',
95 'jobdefs',
96 'pool',
97 'incrementalbackuppool',
98 'fullbackuppool',
99 'differentialbackuppool',
100 'job',
101 'basejob',
102 'device',
103 ])
104BOOL_ITEMS = set([
105 'store_bool',
106 'store_runscript_bool',
107 ])
108
109logging.basicConfig(level=logging.DEBUG,
110 format='%(asctime)s %(levelname)s \t (%(module)s:%(lineno)d) %(message)s ',
111 filename='dassModus.log',
112 filemode='w')
113
114# create logger
115logger = logging.getLogger("vanHelsing")
116logger.setLevel(logging.DEBUG)
117
118
119
120logger.debug(QApplication.translate('Main','Started Main Program'))
121
122
123
124OUTPUTDIR = '/etc/bacula/'
125#INPUTDIR = '/etc/bacula/'
126INPUTDIR = ':/'
127
128
129#Configurations = [] # global list of configuration objects
130Datacenters = []
131
132#proxy = xmlrpclib.ServerProxy("http://bacula-devel:8000/")
133class SafeTransportWithCert(xmlrpclib.SafeTransport):
134# __cert_file = DFLT_CERTFILE
135# __key_file = DFLT_KEYFILE
136 __cert_file = 'certs/client-cert.pem' # Replace with your PEM formatted key file
137 __key_file = 'certs/client-cert.pem' # Replace with your PEM formatted certificate file
138
139 def make_connection(self,host):
140 host_with_cert = (host, {
141 'key_file' : self.__key_file,
142 'cert_file' : self.__cert_file
143 } )
144 return xmlrpclib.SafeTransport.make_connection(
145 self,host_with_cert)
146
147
148
149#server_url = 'https://bacula-devel:4443'
150#transport = SafeTransportWithCert()
151#proxy = xmlrpclib.ServerProxy(server_url,
152# transport = transport)
153
154#print proxy.get_lsscsi()
155
156#name = 'bacula-sd.conf'
157#filename = INPUTDIR + name
158#outfile = OUTPUTDIR + name
159#configstring = open(filename).read()
160#sdconf = StorageDaemonConfig(configstring)
161#writefile = open(outfile,'w')
162#writefile.write(str(sdconf))
163
164
165#name = ('bacula-fd.conf')
166#filename = INPUTDIR + name
167#outfile = OUTPUTDIR + name
168#configstring = open(filename).read()
169#fdconf = FileDaemonConfig(configstring)
170
171
172#writefile = open(outfile,'w')
173#writefile.write(str(fdconf))
174
175
176#name = ('bconsole.conf')
177#filename = INPUTDIR + name
178#outfile = OUTPUTDIR + name
179
180#readfile = open(filename)
181#configstring = readfile.read()
182#conconf = ConsoleConfig(configstring)
183#readfile.close()
184
185#writefile = open(outfile,'w')
186#writefile.write(str(conconf))
187
188
189
190#name = 'bacula-dir.conf'
191#filename = INPUTDIR + name
192#outfile = OUTPUTDIR + name
193#configstring = open(filename).read()
194#dirconf = DirectorConfig(configstring)
195
196
197#Configurations.append(dirconf)
198#Configurations.append(sdconf)
199#Configurations.append(fdconf)
200#Configurations.append(conconf)
201#writefile = open(outfile,'w')
202#writefile.write(str(dirconf))
203
204#print dirconf
205
206
207
208#def bind(objectName, propertyName, type):
209#
210# def getter(self):
211# return type(self.findChild(QObject, objectName).property(propertyName).toPyObject())
212#
213# def setter(self, value):
214# self.findChild(QObject, objectName).setProperty(propertyName, QVariant(value))
215#
216# return property(getter, setter)
217#
218
219
220
221class StorageItemCheckbox(QCheckBox):
222 def __init__(self, storageItem, label):
223 QCheckBox.__init__(self,label)
224 self.storageItem = storageItem
225
226class StorageItemLineEdit(QLineEdit):
227 def __init__(self, parentWidget, storageItem):
228 QCheckBox.__init__(self, parentWidget)
229 self.storageItem = storageItem
230
231
232class StorageItemCombobox(QComboBox):
233 def __init__(self, storageItem):
234 QComboBox.__init__(self)
235 self.storageItem = storageItem
236
237class ResourceTreeWidgetItem(QTreeWidgetItem):
238 itemsList = [] # class variable
239 def __init__(self, Resource, headerlist):
240 self.Resource = Resource
241 #print "type:" , type(headerlist),"headerlist:" , headerlist
242
243 self.itemsList.append(self)
244
245 QTreeWidgetItem.__init__(self, headerlist)
246
247 #TODO: Why does the treeview not use the standard fontsize?
248 #col = 0
249 #f = self.font(col)
250 #f.setPixelSize(14)
251 #self.setFont(col,f)
252 #col=1
253 #f = self.font(col)
254 #f.setBold(True)
255 #f.setPixelSize(14)
256 #self.setFont(col,f)
257 # fontsize end
258
259class ResourceListWidgetItem(QListWidgetItem):
260 def __init__(self, Resource):
261 self.Resource = Resource
262 QListWidgetItem.__init__(self,self.Resource.resourcetype+ ' ' +
263 self.Resource.getName())
264 #self.Resource.items_dict['name'].storage.value)
265 icon = QtGui.QIcon(":/icons/" + self.Resource.resourcetype + ".png")
266 self.setIcon(icon)
267
268class ResItemTableWidgetItem(QTableWidgetItem):
269 def __init__(self, ResItem):
270 self.ResItem = ResItem
271 QTableWidgetItem.__init__(self)
272
273class StorageItemPushButton(QPushButton):
274 def __init__(self, storageItem):
275 QPushButton.__init__(self)
276 self.storageItem = storageItem
277
278#class VHTreeWidget(QtGui.QTreeWidget):
279# def __init__(self, parent):
280# super(VHTreeWidget, self).__init__(parent)
281
282
283
284
285#self.treeWidget = QtGui.QTreeWidget(self.verticalLayoutWidget_3)
286
287class MeinDialog(QtGui.QMainWindow, Dlg):
288
289 def __init__(self):
290 QtGui.QDialog.__init__(self)
291 self.setupUi(self)
292 self.gridwidgets = []
293 self.onlinehelpdialog = dassmodus.ui.onlinehelpdialog.OnlinehelpDialog(self)
294
295 # restore the applications settings
296 settings = QSettings()
297 #size = settings.value("MainWindows/Size",
298 # QVariant(QSize(600,500))).toSize()
299 #
300 #self.resize(size)
301 ##self.restoreGeometry(settings.value("Geometry").toByteArray())
302 #position = settings.value("MainWindow/Position",
303 # QVariant(QPoint(0,0))).toPoint()
304 #self.move(position)
305 #self.restoreState(settings.value("Mainwindow/State").toByteArray())
306
307
308 self.restoreGeometry(settings.value("Geometry").toByteArray())
309 self.onlinehelpdialog.restoreGeometry(settings.value("HelpWindowsGeometry").toByteArray())
310
311 # restoring state end
312
313
314
315
316
317
318
319 # statusbar
320 self.statusLabel = QLabel()
321 self.statusLabel.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
322 self.statusBar.setSizeGripEnabled(False)
323 self.statusBar.addPermanentWidget(self.statusLabel)
324 self.statusPB = QProgressBar(self.statusBar)
325 self.statusPB.setMaximumWidth(200)
326 self.statusPB.setTextVisible(True)
327 self.statusBar.addPermanentWidget(self.statusPB)
328
329 self.statusPB.setMinimum(0)
330 self.statusPB.setMaximum(10)
331
332 self.statusBar.showMessage(self.tr("Welcome to the bacula configuration program"), 5000)
333
334
335
336 #self.configsToTreeWidget()
337 #self.dirconfRoot = self.addConfigToTreeWidget(dirconf)
338 #self.sdconfRoot = self.addConfigToTreeWidget(sdconf)
339 #self.addConfigToTreeWidget(fdconf)
340 #self.addConfigToTreeWidget(conconf)
341 self.treeWidget.setMouseTracking(True)
342 self.treeWidget.setColumnCount(3)
343 self.treeWidget.resizeColumnToContents(0)
344 self.treeWidget.setAlternatingRowColors(False)
345
346 self.treeWidget.sortByColumn(0, Qt.AscendingOrder)
347
348
349
350 #self.treeWidget = VHTreeWidget(self.verticalLayoutWidget_3)
351 self.verticalLayout_3.addWidget(self.treeWidget)
352
353
354
355
356 #self.textEdit.setText('hallo')
357 #<print "started"
358 # signale connecten
359
360 self.treeWidget.setContextMenuPolicy(Qt.CustomContextMenu)
361 self.connect(self.treeWidget,
362 QtCore.SIGNAL("customContextMenuRequested(const QPoint &)")
363 ,self.menuContextTree)
364
365 self.connect(self.treeWidget,
366 QtCore.SIGNAL("itemClicked(QTreeWidgetItem *,int)"),
367 self.onTreeItemClick)
368 self.connect(self.treeWidget,
369 QtCore.SIGNAL("currentItemChanged (QTreeWidgetItem *,QTreeWidgetItem *)"),
370 self.onTreeItemClick)
371
372 self.modifyAction(self.actionSave, None, None, self.tr("save a local configuration file"), False)
373 self.connect(self.actionSave, SIGNAL("triggered()"), self.onSave)
374
375 self.modifyAction(self.actionOpen, None, 'open', self.tr("load a local datacenter file"), False)
376 self.connect(self.actionOpen, SIGNAL("triggered()"), self.onActionOpen)
377 self.toolBar.addAction(self.actionOpen)
378
379 self.modifyAction(self.actionFetch, None, 'repository', self.tr("fetch a configuration file from a server"), False)
380 self.connect(self.actionFetch, SIGNAL("triggered()"), self.onActionFetch)
381 self.toolBar.addAction(self.actionFetch)
382
383 self.modifyAction(self.actionOpenHelp, None, 'help-contextual', self.tr("open the contextsensitive help window"), False)
384 self.connect(self.actionOpenHelp, SIGNAL("triggered()"), self.onOpenHelp)
385 self.toolBar.addAction(self.actionOpenHelp)
386
387 self.modifyAction(self.actionCommit_to_server, None, None, self.tr("commmit a configuration file on a server"), False)
388 self.connect(self.actionCommit_to_server, SIGNAL("triggered()"), self.onActionCommit)
389
390 self.modifyAction(self.actionQuit_2, None, None, self.tr("quit program"), False)
391 self.connect(self.actionQuit_2, SIGNAL("triggered()"), self.close)
392
393 self.modifyAction(self.actionNew_Datacenter, None, 'datacenter_new', self.tr("create new Datacenter"), False)
394 self.connect(self.actionNew_Datacenter, SIGNAL("triggered()"), self.onActionNewDatacenter)
395 self.toolBar.addAction(self.actionNew_Datacenter)
396
397
398 self.modifyAction(self.actionAbout, None, None, self.tr("information about the program"), False)
399 self.statusBar.addAction(self.actionAbout)
400 self.toolBar.addAction(self.actionAbout)
401
402 self.connect(self.actionAbout, SIGNAL("triggered()"), self.onActionAbout)
403
404 self.treeWidget.setHeaderLabels([self.tr('Resourcetype'),self.tr('Name'),self.tr('Ref.')])
405
406
407 self.connect(self.referencesListWidget,
408 SIGNAL("itemDoubleClicked(QListWidgetItem *)"),
409 self.onReferenceItemDoubleClicked
410 )
411 self.onlinehelpdialog.show()
412 # delete widgets from form
413 #self.label.setParent(None)
414 #self.textEdit.setParent(None)
415
416 def okToQuit(self):
417 reply = QMessageBox.question(self,
418 self.tr("close dassModus"),
419 self.tr("Do you really want to quit"),
420 QMessageBox.Yes|QMessageBox.No | QMessageBox.Cancel)
421 if reply != QMessageBox.Yes:
422 return False
423 else:
424 return True
425
426 def closeEvent(self, event):
427 if self.okToQuit():
428 settings = QSettings()
429 settings.setValue("Geometry",QVariant(self.saveGeometry()))
430 settings.setValue("HelpWindowsGeometry",QVariant(self.onlinehelpdialog.saveGeometry()))
431 #settings.setValue("MainWindow/Size", QVariant(self.size()))
432 #settings.setValue("MainWindow/Position", QVariant(self.pos()))
433 #settings.setValue("Mainwindow/State", QVariant(self.saveState()))
434 else:
435 event.ignore()
436
437
438
439
440
441 def modifyAction(self, action, shortcut=None, icon=None,
442 tip=None, checkable=False ):
443 if icon is not None:
444 action.setIcon(QIcon(":/icons/%s.png" % icon))
445 if shortcut is not None:
446 action.setShortcut(shortcut)
447 if tip is not None:
448 action.setToolTip(tip)
449 action.setStatusTip(tip)
450 if checkable:
451 action.setCheckable(True)
452 return action
453
454 def onOpenHelp(self):
455 self.onlinehelpdialog.show()
456
457 def onActionAbout(self):
458 """Show about box"""
459 # TODO: do the Translation for this, maybe use QString (see PyQtBook, Page 515)s
460 QMessageBox.about(self,"About dassModus",
461 u"""
462 <b>dassModus v %s</b>
463 <p>
464 A GUI program to configure Bacula
465 <p>Copyright &copy; 2010 <a href="http://www.dass-it.de/">dass IT GmbH</a><br>
466 <a href="http://www.dass-it.de/">http://www.dass-it.de</a>
467 <p>Händelstraße 25-29<br>
468 50674 Köln <br>
469 Germany <br>
470 Phone: +49 221 3 56 56 66-0 <br>
471 <p>
472 Python %s - Qt %s - PyQt %s on %s
473 """ % (str(__version__) + __revision__ + '<br>' + __date__, platform.python_version(),
474 QT_VERSION_STR, PYQT_VERSION_STR, platform.system()
475 )
476 )
477
478 def onActionDeployConfig(self, Resource):
479 server_url = 'https://bacula-old:4443'
480 transport = SafeTransportWithCert()
481 proxy = xmlrpclib.ServerProxy(server_url,
482 transport = transport)
483
484 deploywizard = dassmodus.ui.deploywizard.deploywizard(proxy, str(Resource),Resource.longname, self )
485 deploywizard.exec_()
486
487
488 #server_url = 'https://bacula-old:4443'
489 #transport = SafeTransportWithCert()
490 #proxy = xmlrpclib.ServerProxy(server_url,
491 # transport = transport)
492 #OLD_CONFIG = proxy.get_conf('dir')
493 #proxy.set_conf('dir',str(Resource))
494 #print proxy.reload_director()
495
496
497 def onActionFetch(self):
498 availableDCs = proxy.list_datacenters()
499 DCdialog = dassmodus.ui.fetchDCdialog.FetchDCDialog( datacenterlist = availableDCs )
500
501 if DCdialog.exec_():
502 selectedDC = unicode( DCdialog.listWidget.selectedItems()[0].text() )
503 DCdata = proxy.get_datacenter(selectedDC).data
504
505 #TODO: write this to a temporary file, open this file
506
507 #print availableDCs
508# configstring = proxy.get_dirdconf()
509# print "configstring:", configstring
510# print str(configstring)
511# dirconf = DirectorConfig(str(configstring))
512# Configurations.append(dirconf)
513# self.rebuildTreeWidget()
514
515 def onActionCheckIntegrity(self, Resource):
516 '''
517 call the Datacenters own integrity checks and display the output
518 '''
519 dc = Resource
520 intcheckdlg = dassmodus.ui.integrityCheckDialog.IntegrityCheckDialog(self,dc.checkFileDaemonsIntegrity())
521 intcheckdlg.show()
522 #print dc.checkFileDaemonsIntegrity()
523 #print dc.checkStorageDaemonsIntegrity()
524
525 def onActionNewDatacenter(self):
526 wizard = dassmodus.ui.newdatacenterwizard.newdatacenterwizard(DASSMODUS_PATH)
527 if wizard.exec_():
528 self.openDatacenterFile(wizard.filename)
529
530 def onActionCommit(self):
531 #configstring = Configurations[0]
532 #print unicode(configstring)
533 #proxy.set_dirdconf(unicode(configstring))
534 pass
535
536 def onRunentryEdit(self):
537 #print "onRunEntryEdi called"
538 #print self.sender().storageItem.runentry
539 rune = self.sender().storageItem.runentry
540 parentcfg = self.sender().storageItem.parentitem.parentresource.parentconfig
541
542 dialog = dassmodus.ui.schedule.RunentryDialog(self,
543 runentry=rune,
544 parentconfig=parentcfg
545 )
546
547 # get parent config to be able to find valid pools, storages, etc. to fill in comboboxes
548
549
550 if dialog.exec_():
551 print "yes" + str(self.sender().storageItem.runentry)
552 #else:
553 # print "no"
554
555 def onMessageEntryEdit(self):
556 mesgDict = self.sender().storageItem.messageDict
557 dialog = dassmodus.ui.messagesdialog.MessagesDialog(self,
558 messagesTypesDict=mesgDict)
559 if dialog.exec_():
560 print "yes"# + str(self.sender().storageItem.runentry)
561 else:
562 print "no"
563
564 def onAclEntryEdit(self):
565 sender = self.sender()
566 aclname = sender.storageItem.parentitem.name
567 if aclname == 'commandacl':
568 for cmd in commands.keys():
569 if not cmd in sender.storageItem.ACLDict:
570 sender.storageItem.ACLDict[cmd] = False
571 else:
572 parentconfig = self.sender().storageItem.parentitem.parentresource.parentconfig
573 aclresourcename = aclname.lower().replace('acl','') # FilesetACL -> fileset
574 availableresources = parentconfig.getResourcesListByResType(aclresourcename)
575 #cfgdict = {}
576 for res in availableresources:
577 #if not res.items_dict['name'].storage.value in sender.storageItem.ACLDict:
578 if not res.getName() in sender.storageItem.ACLDict:
579 sender.storageItem.ACLDict[res.getName()] = False
580
581
582 dialog = dassmodus.ui.listselectdialog.ListSelectDialog(self,
583 configDict = sender.storageItem.ACLDict,
584 title = 'Edit %s' % (aclname) )
585
586
587 #sender.storageItem.setValue(str(sender.storageItem))
588
589 #.setValue( unicode(self.sender().text() ) )
590
591 if dialog.exec_():
592 print "yes"# + str(self.sender().storageItem.runentry)
593 sender.storageItem.__ACLDict2value__()
594 else:
595 print "no"
596
597 def processEventsCallback(self, info = None):
598 QtGui.QApplication.processEvents()
599 if info:
600 self.statusBar.showMessage(info)
601
602
603
604
605 def onActionOpen(self):
606
607 #fd = QFileDialog(self)
608 #fd.setFileMode(QFileDialog.Directory)
609 filename = unicode(QFileDialog.getOpenFileName(self
610 ,self.tr('Open Datacenter file')
611 ,''
612 ,self.tr('dassModus datacenter .dmdz files (*.dmdz)'))
613 )
614
615
616 if filename:
617 self.openDatacenterFile(filename)
618
619 # self.statusPB.setMinimum(0)
620 # self.statusPB.setMaximum(0)
621 #
622 # dc = DataCenter(filename, self.processEventsCallback )
623 # Datacenters.append(dc)
624 #
625 # self.statusPB.setMaximum(100)
626 #
627 # self.updateReferenceInformation()
628 # self.rebuildTreeWidget()
629 # self.treeWidget.expandToDepth(0)
630 # self.treeWidget.resizeColumnToContents(0)
631 # self.treeWidget.resizeColumnToContents(1)
632 #
633 # #self.statusPB.setEnabled(False)
634 # #pd.close()
635 # self.statusBar.clearMessage()
636 # self.statusPB.setMaximum(100)
637 # self.statusPB.setMinimum(0)
638
639 def openDatacenterFile(self,filename):
640
641 self.statusPB.setMinimum(0)
642 self.statusPB.setMaximum(0)
643
644 dc = DataCenter(filename, self.processEventsCallback )
645 Datacenters.append(dc)
646
647 self.statusPB.setMaximum(100)
648
649 self.updateReferenceInformation()
650 self.rebuildTreeWidget()
651 self.treeWidget.expandToDepth(0)
652 self.treeWidget.resizeColumnToContents(0)
653 self.treeWidget.resizeColumnToContents(1)
654
655 #self.statusPB.setEnabled(False)
656 #pd.close()
657 self.statusBar.clearMessage()
658 self.statusPB.setMaximum(100)
659 self.statusPB.setMinimum(0)
660
661
662 def datacentersToTreeWidget(self):
663
664 dcs_to_create = set(Datacenters)
665 dc2treewidgetitem = {}
666 # check if there is already a toplevel item for this dc
667 for dc in Datacenters:
668 count = self.treeWidget.topLevelItemCount()
669 for i in range(count):
670 tli = self.treeWidget.topLevelItem(i)
671 if tli.Resource == dc:
672 dcs_to_create.remove(dc)
673 dc2treewidgetitem[dc] = tli
674
675 # only add top treewidget for not existing datacenters
676 for dc in Datacenters:
677 #root = self.addDatacenterToTreeWidget(config)
678 if dc in dcs_to_create:
679 dcTWI = QTreeWidgetItem([self.tr('Datacenter'), unicode(dc.name)])
680 dcTWI.Resource = dc
681 icon = QtGui.QIcon(":/icons/datacenter.png")
682 dcTWI.setIcon(0,icon)
683 # TODO: why does treewidget not use standard fontsize?
684 #col = 0
685 #f = dcTWI.font(col)
686 #f.setPixelSize(14)
687 #dcTWI.setFont(col,f)
688 #col = 1
689 #f = dcTWI.font(col)
690 ## f.setBold(True)
691 #f.setPixelSize(14)
692 #dcTWI.setFont(col,f)
693 #font end
694 self.treeWidget.addTopLevelItem(dcTWI)
695 else:
696 dcTWI = dc2treewidgetitem[dc]
697
698 for config in list(dc.directors) + list(dc.filedaemons) + list(dc.storagedaemons) + list(dc.consoles):
699 self.addConfigToDc(config, dcTWI)
700
701 def addDatacenterToTreeWidget(self):
702 #parent = ResourceTreeWidgetItem(Resource,[Resource.__class__.__name__, name])
703 #self.treeWidget.expandAll()
704 pass
705
706
707 def menuContextTree(self, point):
708 # Infos about the node selected.
709 index = self.treeWidget.indexAt(point)
710 if not index.isValid():
711 return
712 item = self.treeWidget.itemAt(point)
713 name = item.text(0) # The text of the node.
714 resource = item.Resource
715 # We build the menu.
716 menu=QtGui.QMenu(self)
717 #action=menu.addAction(name)
718 print "Contextmenu for:" + name + ':'
719
720 if name == PrettyNames['client']:
721 actionCreateFDConfig = menu.addAction(self.tr("create FiledaemonConfig from ") + name)
722 self.connect(actionCreateFDConfig, SIGNAL("triggered()"),
723 partial(self.onActionCreateFDConfig, resource ) )
724
725
726 if hasattr(resource, 'validitemsset'):
727 for r in resource.validitemsset:
728 if r in MULTIPLE_ALLOWED_ITEMS_SET:
729 icon = QtGui.QIcon(":/icons/" + r + ".png")
730 actionAdd=menu.addAction(icon,'add' + PrettyNames[r])
731 actionAdd.setObjectName(r)
732 self.connect(actionAdd, SIGNAL("triggered()"), partial( self.onActionAdd, resource, r ) )
733
734 elif hasattr(resource, 'validresourcesset'):
735 for r in resource.validresourcesset:
736 if r in MULTIPLE_RESOURCES_IN_DIRD:
737 icon = QtGui.QIcon(":/icons/" + r + ".png")
738 actionAdd=menu.addAction(icon, self.tr('add ') + PrettyNames[r])
739 actionAdd.setObjectName(r)
740 self.connect(actionAdd, SIGNAL("triggered()"), partial( self.onActionAdd, resource, r ) )
741
742 # import a client snippet from the abcd
743 if name == 'DirectorConfig':
744 actionImportSnippet = menu.addAction( icon, 'import client snippet from autoconfiguration' )
745 self.connect(actionImportSnippet, SIGNAL("triggered()"), partial( self.onImportSnippet, resource) )
746
747 # deploy configuration to director
748 actionDeployConfig = menu.addAction( icon, 'deploy configuration....' )
749 self.connect(actionDeployConfig, SIGNAL("triggered()"), partial( self.onActionDeployConfig, resource) )
750
751
752 if name == 'Datacenter':
753 # TODO: icons for these menu entries
754 actionCheckIntegrity = menu.addAction(self.tr("check integrity of Datacenter"))
755 self.connect(actionCheckIntegrity, SIGNAL("triggered()"),
756 partial(self.onActionCheckIntegrity, resource ) )
757
758 actionSaveDatacenter = menu.addAction(self.tr("save Datacenter (") + resource.filename + ')')
759 self.connect(actionSaveDatacenter, SIGNAL("triggered()"),
760 partial(self.onActionSaveDc, resource ) )
761
762 actionSaveDatacenterAs = menu.addAction(self.tr("save Datacenter as"))
763 self.connect(actionSaveDatacenterAs, SIGNAL("triggered()"),
764 partial(self.onActionSaveDcAs, resource ) )
765
766
767 menu.addSeparator()
768
769 actionImportConfigurationFile = menu.addAction(self.tr("Import existing configuration file"))
770 self.connect(actionImportConfigurationFile, SIGNAL("triggered()"),
771 partial(self.onActionImportConfigFile, resource ) )
772
773 actionExport = menu.addAction(self.tr("export ") + name)
774 self.connect(actionExport, SIGNAL("triggered()"),
775 partial(self.onActionExport, resource ) )
776
777
778 menu.addSeparator()
779 actionDelete = menu.addAction(self.tr("delete ") + name)
780 self.connect(actionDelete, SIGNAL("triggered()"),
781 partial(self.onActionDelete, resource ) )
782
783
784 menu.exec_(QtGui.QCursor.pos())
785
786 def onActionImportConfigFile(self, datacenter):
787 filename = unicode(QFileDialog.getOpenFileName(self
788 ,self.tr('Import bacula configuration file')
789 ,''
790 ,self.tr('bacula configuration files (*.conf)'))
791 )
792 if filename:
793 print "open filename" + filename
794
795 if filename.find('-fd.conf') != -1:
796 datacenter.importConfigurationFile(filename, 'filedaemon')
797
798 elif filename.find('-sd.conf') != -1:
799 datacenter.importConfigurationFile(filename, 'storagedaemon')
800 elif filename.find('-dir.conf') != -1:
801 datacenter.importConfigurationFile(filename, 'director')
802 elif filename.find('bconsole.conf') != -1:
803 datacenter.importConfigurationFile(filename, 'console')
804 else:
805 # TODO: QMessageBox Error
806 QMessageBox.warning(self,
807 self.tr('Warning'),
808 self.tr('did not recognize the file format of file ' + filename)
809 )
810 self.datacentersToTreeWidget()
811 '''
812 TODO: ask for filetype (dir, fd, sd, console) or try all and look if it works?
813 '''
814
815
816
817 def onActionExport(self, resource):
818 filename = unicode(QFileDialog.getSaveFileName(self
819 ,self.tr('Export configuration file')
820 ,resource.getName().strip('"')+'.conf'
821 )
822 )
823 if filename:
824 f = open(filename,'w')
825 f.write(str(resource))
826 f.close()
827
828
829
830 def onActionSaveDcAs(self ,datacenter):
831 filename = unicode(QFileDialog.getSaveFileName(self
832 ,self.tr('save datacenter file as...')
833 ,datacenter.getName().strip('"')+'.dmdz'
834 )
835 )
836 if filename:
837 datacenter.setFileName(filename)
838 datacenter.safeDatacenter()
839
840 def onActionSaveDc(self ,datacenter):
841 datacenter.safeDatacenter()
842
843
844 def onImportSnippet(self, resource):
845 filename = unicode(QFileDialog.getOpenFileName(self
846 ,self.tr('Import bacula client snippet from autoconfiguration daemon')
847 ,''
848 ,self.tr('bacula client configuration snippets (*.snippet)'))
849 )
850 if filename:
851 f = open(filename,'r')
852 snippet = f.read()
853 f.close()
854 #newres = resource.createResource('client')
855 resource.parse_configfile(snippet, None)
856 self.rebuildTreeWidget()
857
858 def onActionAdd(self, resource, resname):
859
860 newres = resource.createResource(resname)
861 wizard = dassmodus.ui.baseconfwizard.baseconfigwizard(newres,resource)
862 if wizard.exec_():
863 print "ok"
864 else:
865 resource.deleteResource(newres)
866 self.rebuildTreeWidget()
867 #self.sender().storageItem.setValue( unicode(self.sender().currentText() ) )
868
869 def onActionDelete(self, resource):
870 print self.tr("deleting ") , resource
871 if hasattr(resource,'parentconfig'): # resource?
872 resource.parentconfig.deleteResource(resource)
873 del resource
874
875 elif hasattr(resource,'parentdatacenter'): # resource?
876 resource.parentdatacenter.deleteConfiguration(resource)
877 #del resource
878
879 else:
880 print "help me"
881 # BaculaConfig TODO!
882 #Configurations.remove(resource)
883 # del resource
884
885 self.treeWidget.clear() # TODO: better remove the corresponding treewidgetitem
886 self.rebuildTreeWidget()
887
888 def onActionCreateFDConfig(self, dirClient):
889 print self.tr("creating FD Config from ") , dirClient
890 newFdConfig = FileDaemonConfig('')
891 dirClient.parentconfig.parentdatacenter.filedaemons.add(newFdConfig)
892 newFdConfig.createFdConfigFromDirClient(dirClient) # copy relevant info from dirClient entry
893 #newFdConfig.filename = os.getcwd()+ newFdConfig.name +'-fd.conf'
894 newFdConfig.filename = os.getcwd()+ '/' + newFdConfig.name +'-fd.conf'
895 self.rebuildTreeWidget()
896
897
898
899
900 #def newClient(self):
901 # newres = dirconf.createResource('client')
902 # newres.items_dict['name'].storage.setValue('newclient')
903 # self.addResourcesToTreeWidget(self.dirconfRoot, [newres])
904 #
905 #def newJobDefs(self):
906 # newres = dirconf.createResource('jobdefs')
907 # newres.items_dict['name'].storage.setValue('newJobDefs')
908 # self.addResourcesToTreeWidget(self.dirconfRoot, [newres])
909 #
910 #def newDirector(self):
911 # newres = dirconf.createResource('director')
912 # newres.items_dict['name'].storage.setValue('newDirector')
913 # self.addResourcesToTreeWidget(self.dirconfRoot, [newres])
914
915 def onSave(self):
916 for dc in Datacenters:
917 dc.writeDatacenter('/tmp/')
918
919 #for conf in Configurations:a
920 # print "writing "+ conf.filename
921 # writefile = open(conf.filename,'w')
922 # #writefile = open(outfile,'w')
923 # writefile.write(str(conf))
924 # #print str(dirconf)
925 # writefile.close()
926
927 def onTreeItemClick(self, item):
928
929 #print item.Resource.onlinehelpURL
930 if hasattr(item,'Resource'):
931 if hasattr(item.Resource,'onlinehelpURL'):
932 self.onlinehelpdialog.loadURL(item.Resource.onlinehelpURL)
933
934 if self.textEdit.isVisible(): # only create the config file if output is visible
935 self.textEdit.setText(unicode(item.Resource))
936
937 self.addConfigItemsToItemsGroup(item.Resource)
938 self.updateReferencesItemsList(item.Resource)
939
940 # TODO: this does not work (why?)
941 #if hasattr(item.Resource,'filename'):
942 # self.statusBar.showMessage(item.Resource.filename, 5000)
943
944
945
946 #def onPushButton(self):
947 # print "PushButton"
948 # self.addConfigToTreeWidget(dirconf,None)
949 # #self.addDictToTreeWidget(myNewResDict,None)
950
951 def rebuildTreeWidget(self):
952
953 #self.treeWidget.clear()
954
955 self.datacentersToTreeWidget()
956
957 #self.configsToTreeWidget()
958
959 #self.treeWidget.expandToDepth(0)
960 #self.treeWidget.resizeColumnToContents(0)
961 #self.treeWidget.resizeColumnToContents(1)
962 self.treeWidget.setAlternatingRowColors(False)
963 self.treeWidget.sortByColumn(0, Qt.AscendingOrder)
964 #self.treeWidget.expandAll()
965
966 def addResourcesToTreeWidget( self, parentTreeItem, Resources ):
967 # check if we already have a treewidgetitem for this resource
968 resources2treewidgetitem = {}
969 resources_to_create = set(Resources)
970 # check if there is already a sibling item for this resource
971 #QtGui.QTreeWidgetItem.
972 count = parentTreeItem.childCount()
973 #print count
974 for res in Resources: # all resources
975 for i in range(count): # iterate over all siblings
976 tli = parentTreeItem.child(i)
977 if tli.Resource == res: # is there already a sibling representing res?
978 resources_to_create.remove(res)
979 resources2treewidgetitem[res]= tli
980
981
982 #logger.info(str(resources_to_create))
983 for res in Resources: # some Resources do not have a name (include, exclude, options...s)
984 try:
985 name = res.getName()
986 #name = res.items_dict['name'].storage.value.strip('"')
987 except:
988 name = ' ' # no name
989
990 refcount = len(res.reflist)
991 # only add treewidget for not existing resources
992 if res in resources_to_create:
993 mytreeitem = ResourceTreeWidgetItem( res, [ PrettyNames[res.resourcetype], unicode(name), str(refcount)] )
994 parentTreeItem.addChild(mytreeitem)
995 icon = QtGui.QIcon(":/icons/" + res.resourcetype + ".png")
996 mytreeitem.setIcon(0,icon)
997 else:
998 mytreeitem = resources2treewidgetitem[res]
999
1000 self.addResourcesToTreeWidget(mytreeitem, res.resources)
1001
1002
1003
1004 def addConfigToTreeWidget(self,Resource):
1005 name = Resource.getName()
1006 #parent = ResourceTreeWidgetItem(Resource,[Resource.__class__.__name__, name, Resource.filename])
1007 parent = ResourceTreeWidgetItem(Resource,[Resource.__class__.__name__, unicode(name)] )
1008
1009 parent.setStatusTip(0,QtCore.QString(Resource.filename))
1010 #parent.setToolTip(0,QtCore.QString(Resource.filename))
1011 #parent.setWhatsThis(0,QtCore.QString(Resource.filename))
1012 icon = QtGui.QIcon(":/icons/config.png")
1013 parent.setIcon(0,icon)
1014 #if Resource.__class__.__name__ == 'DirectorConfig':
1015 # self.resGroupingTreeItems = {} # which resource types are grouped under DirectorConfig?
1016
1017 self.treeWidget.addTopLevelItem(parent)
1018 self.addResourcesToTreeWidget(parent, Resource.resources)
1019 return parent
1020
1021
1022 def addConfigToDc(self, Resource, DcTreeWidgetItem):
1023
1024 parent = None
1025 count = DcTreeWidgetItem.childCount()
1026 #QtGui.QTreeWidgetItem.child(int)
1027 for i in range (count):
1028 if DcTreeWidgetItem.child(i).Resource == Resource:
1029 parent = DcTreeWidgetItem.child(i)
1030
1031 if not parent:
1032 name = Resource.getName().strip('"') # remove quotation marks
1033 #parent = ResourceTreeWidgetItem(Resource,[Resource.__class__.__name__, name, Resource.filename])
1034 parent = ResourceTreeWidgetItem(Resource,[Resource.__class__.__name__, unicode(name) ])
1035
1036 parent.setStatusTip(0,QtCore.QString(Resource.filename))
1037 #parent.setToolTip(0,QtCore.QString(Resource.filename))
1038 #parent.setWhatsThis(0,QtCore.QString(Resource.filename))
1039 #icon = QtGui.QIcon(":/icons/config.png")
1040 #print Resource.__class__.__name__.replace('Config','').lower()
1041 icon = QtGui.QIcon(":/icons/" + Resource.__class__.__name__.replace('Config','').lower() +".png")
1042
1043 parent.setIcon(0,icon)
1044 #if Resource.__class__.__name__ == 'DirectorConfig':
1045 # self.resGroupingTreeItems = {} # which resource types are grouped under DirectorConfig?
1046 DcTreeWidgetItem.addChild(parent)
1047 #self.treeWidget.addTopLevelItem(parent)
1048 self.addResourcesToTreeWidget(parent, Resource.resources)
1049 return parent
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061 def onCheckboxChecked(self):
1062 print "checkbox was checked by:" , self.sender().objectName() , "to:" , self.sender().isChecked()
1063 self.sender().storageItem.setValue( self.sender().isChecked() )
1064
1065 def onComboboxChanged(self):
1066 print "combobox was changed by:" , self.sender().objectName() , "to:" , self.sender().currentText()
1067 self.sender().storageItem.setValue( unicode(self.sender().currentText() ) )
1068
1069 def onLineEditChanged(self):
1070 print "LineEdit was changed by:" , self.sender().objectName() , "to:" , self.sender().text()
1071 self.sender().storageItem.setValue( unicode(self.sender().text() ) )
1072
1073 def onReferenceItemDoubleClicked(self,item):
1074 print "RefItemClicked:" , ":" , item.text(), item.Resource
1075 for ResTreeItem in ResourceTreeWidgetItem.itemsList:
1076 if ResTreeItem.Resource == item.Resource:
1077 self.treeWidget.setCurrentItem(ResTreeItem)
1078 #TODO: Find the right TreeWidgetItem and activate it
1079
1080 def onFileListItemDoubleClicked(self,item):
1081 print "FileItemClicked:" , ":" , item.text()
1082 item.editItem(item)
1083
1084 #for ResTreeItem in ResourceTreeWidgetItem.itemsList:
1085 # if ResTreeItem.Resource == item.Resource:
1086 # self.treeWidget.setCurrentItem(ResTreeItem)
1087
1088
1089 def updateReferenceInformation(self):
1090 """
1091 iterate over all resources and update the
1092 reference information accordingly
1093 """
1094 for dc in Datacenters:
1095 for config in list(dc.directors) + list(dc.filedaemons) + list(dc.storagedaemons) + list(dc.consoles):
1096 for res in config.resources:
1097 reflist = config.getReferencingResourcesListForResource(res)
1098 res.reflist = reflist
1099 #print '\n',res.resourcetype, res.items_dict['name'].storage.value,"is referenced", len(reflist),"times:"
1100 #for refres in reflist:
1101 # print refres.resourcetype, refres.items_dict['name'].storage.value
1102
1103 def updateReferencesItemsList(self,Resource):
1104 self.referencesListWidget.clear()
1105 for r in Resource.reflist:
1106 #icon = QtGui.QIcon(":/icons/" + r.resourcetype + ".png")
1107 ListWidgetItem = ResourceListWidgetItem(r)
1108 #QtGui.QListWidgetItem(r.resourcetype+ ' ' + r.items_dict['name'].storage.value)
1109 #ListWidgetItem.setIcon(icon)
1110 self.referencesListWidget.addItem(ListWidgetItem)
1111
1112
1113
1114 def addConfigItemsToItemsGroup(self,Resource):
1115
1116 #cleanup widgets
1117 for widget in self.gridwidgets:
1118 self.gridLayout_2.removeWidget(widget)
1119 widget.setParent(None)
1120 self.gridwidgets = []
1121 #TODO: do this depending on the type, ignore for Configs
1122 if not hasattr(Resource,'items'):
1123 return
1124
1125 row = 0
1126
1127 # special treatment of file entries
1128 if Resource.shortname == 'include': # is the same as exclude
1129 newlabel = QtGui.QLabel(self.scrollAreaWidgetContents)
1130 newlabel.setText('Files')
1131 self.gridLayout_2.addWidget(newlabel, row, 0, 1, 1)
1132 self.gridwidgets.append(newlabel)
1133
1134 filelistWidget = dassmodus.dragndrop.DnDListWidget()
1135 self.gridwidgets.append(filelistWidget)
1136 self.gridLayout_2.addWidget(filelistWidget, row, 1, 1, 1)
1137 for f in Resource.getItemsListByItemName('file'):
1138 if f.print_item():
1139 fileListWidgetItem = QtGui.QListWidgetItem(unicode(f.storage.value).rstrip('"').lstrip('"'))
1140
1141 self.connect( filelistWidget,
1142 SIGNAL("itemDoubleClicked(QListWidgetItem *)"),
1143 self.onFileListItemDoubleClicked
1144 )
1145 #print Resource.items_dict
1146 icon = QIcon(":/icons/" + Resource.resourcetype + "file.png")
1147 fileListWidgetItem.setIcon(icon)
1148 filelistWidget.addItem(fileListWidgetItem)
1149 row += 1
1150
1151 #TODO: create a ListWidget on the fileset level containing both include and exclude with +/- icons
1152 # in order to view all included and excluded things at once
1153
1154
1155
1156
1157
1158 for item in Resource.items:
1159
1160 if item.name == 'file':
1161 continue
1162 # clear
1163
1164 # items manually added to horizontallayout
1165
1166 if item.print_item() or self.showAllCheckBox.isChecked(): # only print configured or required items
1167
1168 newlabel = QtGui.QLabel(self.scrollAreaWidgetContents)
1169 labeltext = PrettyNames[item.name]
1170 # show job items that are inherited from jobdefs
1171 if hasattr(item.parentresource,'shortname') and item.parentresource.shortname == 'job':
1172 jobdef = False
1173 jobdefname = item.parentresource.getItemValue('jobdefs')
1174 #jobdefname = item.parentresource.items_dict['jobdefs'].storage.value
1175
1176 if jobdefname is not None:
1177 print "jobdefs is set:" + str(jobdefname)
1178 jobdef = True
1179
1180 else:
1181 print "jobdefs is not set:" + str(item.parentresource.items_dict['jobdefs'].storage)
1182 jobdef = False
1183
1184 if jobdef and item.storage.value == item.defaultvalue:
1185 jobdefs = item.parentresource.parentconfig.getResourceByName( jobdefname )
1186 if jobdefs.items_dict[item.name].storage.value != jobdefs.items_dict[item.name].defaultvalue:
1187 #print '>' + jobdefs.items_dict[item.name].storage.value + '<'
1188 #labeltext = PrettyNames[item.name] + ' (' + jobdefname + '->' + jobdefs.items_dict[item.name].storage.value + ' )'
1189 #labeltext = PrettyNames[item.name] + ' (' + jobdefs.items_dict[item.name].storage.value + ')'
1190 labeltext = PrettyNames[item.name] + ' (' + jobdefs.getName() + ')'
1191
1192 newlabel.setText(labeltext)
1193
1194 self.gridLayout_2.addWidget(newlabel, row, 0, 1, 1)
1195 self.gridwidgets.append(newlabel)
1196
1197 font = QtGui.QFont()
1198
1199 # bold means: item will be printed
1200 if item.print_item():
1201 font.setWeight(75)
1202 font.setBold(True)
1203 newlabel.setFont(font)
1204 newlabel.setToolTip(self.tr('item will be printed'))
1205
1206 # Italic means: item is required
1207 if item.required:
1208 font.setWeight(50)
1209 font.setItalic(True)
1210 font.setUnderline(True)
1211 newlabel.setFont(font)
1212 newlabel.setToolTip(self.tr('item is required'))
1213
1214 if item.storage.__class__.__name__ in BOOL_ITEMS:
1215 newcheckbox = StorageItemCheckbox(item.storage, unicode(item.storage.value))
1216
1217 #newcheckbox = QtGui.QCheckBox(str(item.storage.value))
1218 self.gridLayout_2.addWidget(newcheckbox, row, 1, 1, 1)
1219 newcheckbox.setObjectName(item.name)
1220
1221 newcheckbox.setChecked( bool(item.storage.value) )
1222 self.gridwidgets.append(newcheckbox)
1223
1224 self.connect( newcheckbox,
1225 SIGNAL("toggled(bool)"),
1226 self.onCheckboxChecked )
1227
1228
1229 elif item.name == 'run': # Schedule "Run" entries
1230 # 'String input'
1231 newlineedit = StorageItemLineEdit(self.scrollAreaWidgetContents,
1232 item.storage)#QtGui.QLineEdit(self.scrollAreaWidgetContents)
1233 newlineedit.setText(unicode(item.storage.value))
1234
1235 self.gridLayout_2.addWidget(newlineedit, row, 1, 1, 1)
1236 self.gridwidgets.append(newlineedit)
1237 self.connect( newlineedit,
1238 SIGNAL("returnPressed()"),
1239 self.onLineEditChanged )
1240 self.connect( newlineedit,
1241 SIGNAL("editingFinished()"),
1242 self.onLineEditChanged )
1243
1244 # add a Button to edit the run entry (with own dialog)
1245 newbutton = StorageItemPushButton(item.storage)
1246 newbutton.setText(self.tr('Edit...'))
1247 self.gridwidgets.append(newbutton)
1248
1249 self.gridLayout_2.addWidget(newbutton, row, 2, 1, 1)
1250 self.connect( newbutton,
1251 SIGNAL("clicked()"),
1252 self.onRunentryEdit )
1253
1254
1255
1256 elif item.name in INTERNALLY_REFERENCED_ITEMS:
1257 newcombobox = StorageItemCombobox(item.storage)
1258 newcombobox.setObjectName(item.name)
1259 #QtGui.QComboBox()
1260
1261 newcombobox.addItem(unicode(item.storage.value))
1262 #newcombobox.addItem(unicode(item.storage.value.strip('"')))
1263 #QtGui.QComboBox.currentIndexChanged(*types name=str)
1264
1265 restype = item.name
1266 if restype.endswith('pool'):
1267 restype = 'pool'
1268 if restype.endswith('job'):
1269 restype = 'job'
1270
1271 for r in Resource.parentconfig.getResourcesListByResType(restype):
1272 if newcombobox.findText(QString(r.getName())) == -1:
1273 newcombobox.addItem(r.getName())
1274 #newcombobox.addItem(r.items_dict['name'].storage.value)
1275 #newcombobox.setText(str(item.storage.value))
1276 self.gridLayout_2.addWidget(newcombobox, row, 1, 1, 1)
1277 self.gridwidgets.append(newcombobox)
1278
1279 self.connect( newcombobox,
1280 SIGNAL("currentIndexChanged(int)"),
1281 self.onComboboxChanged )
1282
1283 elif len(item.storage.possiblevalues) > 0: # do we have predefined possible values?
1284 #print item.storage.__class__.__name__
1285 newcombobox = StorageItemCombobox(item.storage)#QtGui.QComboBox()
1286 newcombobox.setObjectName(item.name)
1287
1288
1289 for v in item.storage.possiblevalues:
1290 newcombobox.addItem(PrettyNames[v.lower().replace(' ','')])
1291
1292 self.gridLayout_2.addWidget(newcombobox, row, 1, 1, 1)
1293 self.gridwidgets.append(newcombobox)
1294
1295 if item.storage.value is None:
1296 newcombobox.addItem('unconfigured')
1297 newcombobox.setCurrentIndex(newcombobox.findText('unconfigured'))
1298
1299 elif item.storage.value is True:
1300 #newcombobox.addItem('Yes')
1301 newcombobox.setCurrentIndex(newcombobox.findText('Yes'))
1302
1303 elif item.storage.value is False:
1304 #newcombobox.addItem('No')
1305 newcombobox.setCurrentIndex(newcombobox.findText('No'))
1306
1307 else:
1308 newcombobox.setCurrentIndex(
1309 newcombobox.findText(unicode(item.storage.value).lower().replace(' ','') ))
1310
1311
1312 self.connect( newcombobox,
1313 SIGNAL("currentIndexChanged(int)"),
1314 self.onComboboxChanged )
1315
1316 else:
1317 # 'String input'
1318 newlineedit = StorageItemLineEdit(self.scrollAreaWidgetContents, item.storage)#QtGui.QLineEdit(self.scrollAreaWidgetContents)
1319
1320 #newlineedit.setText(str(item.storage.value))
1321 newlineedit.setText(unicode(item.storage))
1322
1323 self.gridLayout_2.addWidget(newlineedit, row, 1, 1, 1)
1324 self.gridwidgets.append(newlineedit)
1325
1326 self.connect( newlineedit,
1327 SIGNAL("returnPressed()"),
1328 self.onLineEditChanged )
1329 self.connect( newlineedit,
1330 SIGNAL("editingFinished()"),
1331 self.onLineEditChanged )
1332
1333
1334 if item.storage.__class__.__name__ == 'store_msgs': # messages items
1335 #print "found store_msgs"
1336 # add a Button to edit the run entry (with own dialog)
1337 newbutton = StorageItemPushButton(item.storage)
1338 newbutton.setText('Edit...')
1339 self.gridwidgets.append(newbutton)
1340
1341 self.gridLayout_2.addWidget(newbutton, row, 2, 1, 1)
1342 self.connect( newbutton,
1343 SIGNAL("clicked()"),
1344 self.onMessageEntryEdit )
1345
1346 elif item.storage.__class__.__name__.endswith('acl'): # acl items
1347 #print "found store_msgs"
1348 # add a Button to edit the run entry (with own dialog)
1349 newbutton = StorageItemPushButton(item.storage)
1350 newbutton.setText('Edit...')
1351 self.gridwidgets.append(newbutton)
1352
1353 self.gridLayout_2.addWidget(newbutton, row, 2, 1, 1)
1354 self.connect( newbutton,
1355 SIGNAL("clicked()"),
1356 self.onAclEntryEdit )
1357
1358 # write the default value after the configured value
1359 if item.defaultvalue:
1360 requiredlabel = QtGui.QLabel(self.scrollAreaWidgetContents)
1361 requiredlabel.setText('('+str(item.defaultvalue)+')')
1362 self.gridLayout_2.addWidget(requiredlabel, row, 2, 1, 1)
1363 self.gridwidgets.append(requiredlabel)
1364
1365
1366 row += 1
1367
1368
1369
1370
1371
1372
1373# create logger
1374#logger = logging.getLogger("vanHelsing")
1375#print FS_option_kw
1376
1377
1378
1379def main():
1380
1381 print "started in directory " + DASSMODUS_PATH
1382 app = QtGui.QApplication(sys.argv)
1383 locale = QLocale.system().name()
1384 qtTranslator = QTranslator()
1385 if qtTranslator.load("qt_" + locale, ":/"):
1386 app.installTranslator(qtTranslator)
1387 appTranslator = QTranslator()
1388 if appTranslator.load("dassModus_" + locale + ":/"):
1389 app.installTranslator(appTranslator)
1390
1391
1392 app.setOrganizationDomain("dass-it.de")
1393 app.setOrganizationName("dassIT GmbH")
1394 app.setApplicationName("dassModus")
1395 app.setWindowIcon(QIcon(":/icons/DassModusLogo/logo300.png"))
1396 dialog = MeinDialog()
1397 dialog.show()
1398 dialog.onActionAbout()
1399 sys.exit(app.exec_())
1400
1401
1402if __name__ == "__main__":
1403 sys.exit(main())
1404
1405
Note: See TracBrowser for help on using the repository browser.