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

Last change on this file since 954 was 954, checked in by pstorz, 10 years ago

forgotten files for first checkin

  • Property svn:executable set to *
File size: 51.7 KB
Line 
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.