def __init__(self, parent=None, multirow=True):
     Qt.QFrame.__init__(self, parent)
     self.setToolTip(self.__help__)
     self.setLayout(Qt.QGridLayout())
     self.api = None
     self.reader = None
     self.schema = Qt.QLabel('SCHEMA:')
     self.attribute = Qt.QLabel('at/tri/bu/te')
     self.start = Qt.QPushButton('Start')
     self.stop = Qt.QPushButton('Stop')
     self.export = Qt.QPushButton('Export')
     self.archiver = fqt.MenuContexted(Qt.QLabel)('archiver(ID)')
     multirow = 3 if multirow else 0
     self.setTable(multirow)
     length = 6
     self.layout().addWidget(self.schema, 0, 0, 1, 1)
     self.layout().addWidget(self.attribute, 0, 1, 1, int(length / 2))
     self.layout().addWidget(self.table, 1, 0, multirow or 1, length)
     self.layout().addWidget(self.archiver, multirow + 2, 0, 1, 2)
     self.layout().addWidget(self.export, multirow + 2, length - 3, 1, 1)
     self.layout().addWidget(self.start, multirow + 2, length - 2, 1, 1)
     self.layout().addWidget(self.stop, multirow + 2, length - 1, 1, 1)
     self.setFrameStyle(self.Panel)
     self.checkDropSupport()
     self.setDropEventCallback(self.setModel)
     self.setModes()
     self.connect(self.start, Qt.SIGNAL('pressed()'), self.applyModes)
     self.connect(self.stop, Qt.SIGNAL('pressed()'), self.resetModes)
     self.connect(self.export,
                  Qt.SIGNAL('pressed()'),
                  lambda s=self: show_history(s.getModel(), {'hdb': 'hdb'}.
                                              get(s.getSchema(), '*'),
                                              parent=s))
     self.connect(self, Qt.SIGNAL('archive'), self.startArchiving)
     self.connect(self, Qt.SIGNAL('update'), self.setModes)
示例#2
0
 def initStyle(self,show=False):
     print 'In AlarmFormula.initStyle(%s)' %(self.obj or self.formula)
     try:
         self.org_formula = self.formula
         self.setChildrenCollapsible(False)
         self.setOrientation(Qt.Qt.Vertical)
         ###################################################################
         upperPanel = Qt.QFrame() #self
         upperPanel.setLayout(Qt.QGridLayout())
         self.insertWidget(0,upperPanel)
         self.editcb = Qt.QCheckBox('Edit')
         self.undobt = Qt.QPushButton()
         self.savebt = Qt.QPushButton()
         l = Qt.QLabel('Formula:')
         l.setFont(get_bold_font())
         self.tf = fandango.qt.QDropTextEdit() #Qt.QTextBrowser()
         self.tf.setMinimumHeight(100)
         if self.obj is not None:
             self.tf.setClickHook(self.onEdit)#@todo setClickHook stop working for unknown reasons !?!?!
             self.tf.setReadOnly(True)
             self.tf.setEnabled(False)
             self.connect(self.editcb,Qt.SIGNAL('toggled(bool)'),self.onEdit)
             upperPanel.layout().addWidget(self.editcb,0,4,1,1)
             self.undobt.setIcon(getThemeIcon('edit-undo'))
             self.undobt.setToolTip('Undo changes in formula')
             self.undobt.setEnabled(True)
             self.connect(self.undobt,Qt.SIGNAL('pressed()'),self.undoEdit)
             upperPanel.layout().addWidget(self.undobt,0,5,1,1)
             self.savebt.setIcon(getThemeIcon('media-floppy'))
             self.savebt.setToolTip('Save Alarm Formula')
             self.savebt.setEnabled(False)
             upperPanel.layout().addWidget(self.savebt,0,6,1,1)
             self.connect(self.savebt,Qt.SIGNAL('pressed()'),self.onSave)
         upperPanel.layout().addWidget(l,0,0,1,1)
         upperPanel.layout().addWidget(self.tf,1,0,1,7)
         ###################################################################
         lowerPanel,row = Qt.QFrame(),0 #self,2
         lowerPanel.setLayout(Qt.QGridLayout())
         self.insertWidget(1,lowerPanel)
         l = Qt.QLabel('Result:')
         l.setFont(get_bold_font())
         lowerPanel.layout().addWidget(l,row,0,1,1)
         self.tb = Qt.QTextEdit()
         #tb.setPlainText('Formula:\n\t%s\n\nOutput:\n\t%s'%(test.source,result))
         self.tb.setMinimumHeight(50)
         self.tb.setReadOnly(True)
         self.redobt = Qt.QPushButton()
         self.redobt.setIcon(getThemeIcon('view-refresh'))
         self.redobt.setToolTip('Update result')
         self.connect(self.redobt,Qt.SIGNAL('pressed()'),self.updateResult)
         lowerPanel.layout().addWidget(self.redobt,row,6,1,1)
         lowerPanel.layout().addWidget(self.tb,row+1,0,1,7)
         ###################################################################
         #Refresh from formula:
         if self.formula: self.updateFormula(self.formula)
         if show: self.show()
         print 'AlarmFormula.initStyle(%s) finished.'%self.formula
     except:
         print traceback.format_exc()
         print 'Unable to show AlarmFormula(%s)'%self.formula
    def setup(self, parent, logger, trend):
        self.trend = trend or logger.trend
        self.logger = logger
        self.setWindowTitle("Reload Archiving")
        lwidget, lcheck = Qt.QVBoxLayout(), Qt.QHBoxLayout()
        self.setLayout(lwidget)

        self._reloadbutton = Qt.QPushButton('Reload Archiving')
        self.layout().addWidget(self._reloadbutton)
        self._reloadbutton.connect(self._reloadbutton, Qt.SIGNAL('clicked()'),
                                   self.logger.resetBuffers)
        self._decimatecombo = Qt.QComboBox()
        self._decimatecombo.addItems([t[0] for t in DECIMATION_MODES])
        self._decimatecombo.setCurrentIndex(0)
        self._nonescheck = Qt.QCheckBox('Remove Nones')
        self._nonescheck.setChecked(True)
        self._nonescheck.connect(self._nonescheck, Qt.SIGNAL('toggled(bool)'),
                                 self.toggle_nones)
        self._windowedit = Qt.QLineEdit()
        self._windowedit.setText('0')

        dl = Qt.QGridLayout()
        dl.addWidget(Qt.QLabel('Decimation method:'), 0, 0, 1, 2)
        dl.addWidget(self._decimatecombo, 0, 3, 1, 2)
        dl.addWidget(Qt.QLabel('Fixed Period (0=AUTO)'), 1, 0, 1, 1)
        dl.addWidget(self._windowedit, 1, 1, 1, 1)
        dl.addWidget(self._nonescheck, 1, 2, 1, 2)
        self.layout().addLayout(dl)
示例#4
0
    def onNew(self):
        w = Qt.QDialog(self.Form)
        w.setWindowTitle('Add New PyAlarm Device')
        w.setLayout(Qt.QGridLayout())
        server, device = Qt.QLineEdit(w), Qt.QLineEdit(w)
        server.setText('TEST')
        device.setText('test/pyalarm/1')
        w.layout().addWidget(Qt.QLabel('Server Instance'), 0, 0, 1, 1)
        w.layout().addWidget(server, 0, 1, 1, 1)
        w.layout().addWidget(Qt.QLabel('Device Name'), 1, 0, 1, 1)
        w.layout().addWidget(device, 1, 1, 1, 1)
        doit = Qt.QPushButton('Apply')
        w.layout().addWidget(doit, 2, 0, 2, 2)

        def create(s=server, d=device, p=w):
            try:
                s, d = str(s.text()), str(d.text())
                if '/' not in s: s = 'PyAlarm/%s' % s
                import fandango.tango as ft
                ft.add_new_device(s, 'PyAlarm', d)
                print('%s - %s: created!' % (s, d))
            except:
                traceback.print_exc()
            self.api.load()
            p.close()

        QtCore.QObject.connect(doit, QtCore.SIGNAL("clicked()"), create)
        w.exec_()
        self.setDevCombo()
示例#5
0
def AlarmsSelector(alarms,text='Choose alarms to modify',):
    qw = Qt.QDialog()
    qw.setModal(True)
    qw.setLayout(Qt.QVBoxLayout())
    qw.layout().addWidget(Qt.QLabel(text))
    qw.layout().addWidget(Qt.QLabel())
    [qw.layout().addWidget(Qt.QCheckBox(a,qw)) for a in alarms]
    addOkCancelButtons(qw)
    if qw.exec_():
        alarms = [str(c.text()) for c in qw.children() if isinstance(c,Qt.QCheckBox) and c.isChecked()]
    else: 
        alarms = []
    return alarms
示例#6
0
 def __init__(self, parent=None):
     Qt.QWidget.__init__(self, parent)
     self.setLayout(Qt.QHBoxLayout())
     self.model = ''
     self.device = ''
     self.label = Qt.QLabel()
     self.label.setFixedWidth(250)
     self.value = Qt.QLabel()
     self.value.setFixedWidth(200)
     self.units = Qt.QLabel()
     self.units.setFixedWidth(50)
     self.setWindowTitle('TaurusSingleValue')
     map(self.layout().addWidget, (self.label, self.value, self.units))
    def __init__(self, views=None):

        if views is None:
            print('load views from database ...')
            views = ft.get_class_devices('PanicViewDS')
            views.append(ft.get_tango_host())

        print('ViewChooser(%s)' % views)
        self.view = ''
        self.views = fd.dicts.SortedDict()
        for v in views:
            if ':' in v:
                self.views[v] = v
            else:
                desc = ft.get_device(v).Description.split('\n')[0]
                self.views[desc] = v

        Qt.QDialog.__init__(self, None)
        #self.setModal(True)
        self.setWindowTitle('PANIC View Chooser')
        self.setLayout(Qt.QVBoxLayout())
        self.layout().addWidget(Qt.QLabel('Choose an AlarmView'))
        self.chooser = Qt.QComboBox()
        self.chooser.addItems(self.views.keys())
        self.layout().addWidget(self.chooser)
        self.button = Qt.QPushButton('Done')
        self.layout().addWidget(self.button)
        self.button.connect(self.button, Qt.SIGNAL('pressed()'), self.done)
        self.button.connect(self.button, Qt.SIGNAL('pressed()'), self.close)
示例#8
0
def getAlarmReport(alarm,parent=None):
    print 'getAlarmReport(%s(%s))'%(type(alarm),alarm)
    try:
        if type(alarm) is panic.Alarm:
            alarm = alarm
        elif type(alarm) is str:
            alarm=panic.current()[alarm]
        else:
            alarm=str(alarm.path()).split('.',1)[0]
        details=''#<pre>'
        details+=str(taurus.Device(alarm.device).command_inout('GenerateReport',[alarm.tag])[0])
        #details+='\n\n<a href="'+str(tb.windowTitle())+'">'+str(tb.windowTitle())+'</a>'
        #details+='</pre>'
    except:
        details = "<h2>Unable to get Alarm details from %s/%s </h2>"%(alarm.device,alarm.tag)
        details += '\n\n'+ '-'*80 +'\n\n'+'<pre>%s</pre>'%traceback.format_exc()
    widget = Qt.QDialog(parent)
    widget.setLayout(Qt.QVBoxLayout())
    msg = 'Last %s report:'%alarm.tag
    widget.setWindowTitle(msg)
    print '%s\n%s'%(msg,details)
    widget.layout().addWidget(Qt.QLabel(msg))
    tb = Qt.QTextBrowser(widget)
    tb.setPlainText(details)
    tb.setMinimumWidth(350)
    widget.layout().addWidget(tb)
    widget.setMinimumWidth(350)
    bt = Qt.QDialogButtonBox(Qt.QDialogButtonBox.Ok,Qt.Qt.Horizontal,widget)
    widget.layout().addWidget(bt)
    bt.connect(bt,Qt.SIGNAL("accepted()"),widget.accept)
    return widget
示例#9
0
 def initStyle(self):
     print 'In AttributesPreview.initStyle()'
     try:
         self.setLayout(Qt.QGridLayout())
         self.redobt = Qt.QPushButton()
         self.redobt.setIcon(getThemeIcon('view-refresh'))
         self.redobt.setToolTip('Update result')
         self.taurusForm=TaurusForm()
         self.taurusForm.setWithButtons(False)
         self.taurusForm.setWindowTitle('Preview')
         self.layout().addWidget(self.redobt,0,6,1,1)
         self.layout().addWidget(Qt.QLabel('Values of attributes used in the Alarm formula:'),0,0,1,1)
         self.layout().addWidget(self.taurusForm,1,0,1,7)
         self.connect(self.redobt,Qt.SIGNAL('pressed()'),self.updateAttributes)
     except:
         print traceback.format_exc()
示例#10
0
    def setupUi(self, USE_SCROLL=False, SHOW_OPTIONS=False, USE_TREND=False):
        self.setWindowTitle('Tango Finder : Search Attributes and Archiving')
        self.setLayout(Qt.QVBoxLayout())
        self.setMinimumWidth(950)  #550)
        #self.setMinimumHeight(700)

        self.layout().setAlignment(Qt.Qt.AlignTop)
        self.browser = Qt.QFrame()
        self.browser.setLayout(Qt.QVBoxLayout())

        self.chooser = Qt.QTabWidget()
        self.chooser.setTabPosition(
            self.chooser.West if SHOW_OPTIONS else self.chooser.North)
        #self.combo = Qt.QComboBox() # Combo used for domains, currently disabled

        self.searchbar = Qt.QFrame()
        self.searchbar.setLayout(Qt.QGridLayout())

        #self.label = Qt.QLabel('Type a part of device name and a part of attribute name, use "*" or " " as wildcards:')
        #self.layout().addWidget(self.label)

        self.ServerFilter = Qt.QLineEdit()
        self.ServerFilter.setMaximumWidth(250)
        self.DeviceFilter = fandango.qt.Dropable(Qt.QLineEdit)()
        self.DeviceFilter.setSupportedMimeTypes(
            fandango.qt.TAURUS_DEV_MIME_TYPE)
        self.AttributeFilter = fandango.qt.Dropable(Qt.QLineEdit)()
        self.AttributeFilter.setSupportedMimeTypes(
            [fandango.qt.TAURUS_ATTR_MIME_TYPE, fandango.qt.TEXT_MIME_TYPE])
        self.update = Qt.QPushButton('Update')
        self.archivecheck = Qt.QCheckBox("Show archived attributes only")
        self.archivecheck.setChecked(True)

        self.searchbar.layout().addWidget(
            Qt.QLabel(
                'Enter Device and Attribute filters using wildcards '
                '(e.g. li/ct/plc[0-9]+ / ^stat*$ & !status ) and push Update'),
            0, 0, 3, 13)

        [
            self.searchbar.layout().addWidget(o, x, y, h, w)
            for o, x, y, h, w in (
                (Qt.QLabel("Device or Alias:"), 4, 0, 1, 1),
                (self.DeviceFilter, 4, 1, 1, 4),
                (Qt.QLabel("Attribute:"), 4, 5, 1, 1),
                (self.AttributeFilter, 4, 6, 1, 4),
                (self.update, 4, 10, 1, 1),
                (self.archivecheck, 4, 11, 1, 2),
            )
        ]

        if SHOW_OPTIONS:
            self.options = Qt.QWidget()  #self.searchbar
            self.options.setLayout(Qt.QGridLayout())
            separator = lambda x: Qt.QLabel(' ' * x)
            row = 1
            [
                self.options.layout().addWidget(o, x, y, h, w)
                for o, x, y, h, w in (
                    #separator(120),Qt.QLabel("Options: "),separator(5),
                    (Qt.QLabel("Server: "), row, 0, 1, 1),
                    (self.ServerFilter, row, 1, 1, 4),
                    (Qt.QLabel(''), row, 2, 1, 11))
            ]
            #self.panel = generate_table(load_all_thermocouples('SR14')[-1])
            self.optiontab = Qt.QTabWidget()
            self.optiontab.addTab(self.searchbar, 'Filters')
            self.optiontab.addTab(self.options, 'Options')
            self.optiontab.setMaximumHeight(100)
            self.optiontab.setTabPosition(self.optiontab.North)
            self.browser.layout().addWidget(self.optiontab)

        else:
            self.browser.layout().addWidget(self.searchbar)

        self.toppan = Qt.QWidget(self)
        self.toppan.setLayout(Qt.QVBoxLayout())

        if USE_SCROLL:
            print '*' * 30 + ' USE_SCROLL=True ' + '*' * 30
            ## TO USE SCROLL, HEADER HAS BEEN SET AS A SEPARATE WIDGET
            #self.header = QGridTable(self.toppan)
            #self.header.setHorizontalHeaderLabels(self.LABELS)
            #self.header.setColumnWidth(0,350)
            self.headers = []
            self.header = Qt.QWidget(self.toppan)
            self.header.setLayout(Qt.QHBoxLayout())
            for l, s in zip(self.LABELS, self.SIZES):
                ql = Qt.QLabel(l)
                self.headers.append(ql)
                #if s is not None:
                #ql.setFixedWidth(s)
                #else:
                #ql.setSizePolicy(Qt.QSizePolicy.MinimumExpanding,Qt.QSizePolicy.Fixed)
                self.header.layout().addWidget(ql)

            self.toppan.layout().addWidget(self.header)

            self._scroll = MyScrollArea(self.toppan)  #Qt.QScrollArea(self)
            self._background = AttributesPanel(
                self._scroll
            )  #At least a panel should be kept (never deleted) in background to not crash the worker!
            self.panel = None
            self._scroll.setChildrenPanel(self.panel)
            self._scroll.setWidget(self.panel)
            self._scroll.setMaximumHeight(700)
            self.toppan.layout().addWidget(self._scroll)
            self.attrpanel = self._background
        else:
            self.panel = AttributesPanel(self.toppan)
            self.toppan.layout().addWidget(self.panel)
            self.attrpanel = self.panel

        self.toppan.layout().addWidget(
            Qt.QLabel(
                'Drag any attribute from the first column into the trend or any taurus widget you want:'
            ))

        self.browser.layout().addWidget(self.toppan)
        self.chooser.addTab(self.browser, 'Search ...')

        if USE_TREND:
            self.split = Qt.QSplitter(Qt.Qt.Vertical)
            self.split.setHandleWidth(25)
            self.split.addWidget(self.chooser)

            from taurus.qt.qtgui.plot import TaurusTrend
            from PyTangoArchiving.widget.trend import ArchivingTrend, ArchivingTrendWidget
            self.trend = ArchivingTrendWidget()  #TaurusArchivingTrend()
            self.trend.setUseArchiving(True)
            self.trend.showLegend(True)
            self.attrpanel.trend = self.trend

            if TaurusModelChooser is not None:
                self.treemodel = TaurusModelChooser(parent=self.chooser)
                self.chooser.addTab(self.treemodel, 'Tree')
                self.treemodel.updateModels.connect(self.trend.addModels)
                #self.treemodel.connect(self.treemodel,Qt.SIGNAL('updateModels'),self.trend.addModels)
            else:
                tracer('TaurusModelChooser not available!')

            self.split.addWidget(self.trend)
            self.layout().addWidget(self.split)
        else:
            self.layout().addWidget(self.chooser)
        type(self)._persistent_ = self
    def __init__(self, trend, parent=None, layout=Qt.QVBoxLayout):
        print('DatesWidget(%s)' % trend)
        #parent = parent or trend.legend()
        Qt.QWidget.__init__(self, parent or trend)
        #trend.showLegend(True)
        self._trend = trend
        if not hasattr(trend, '_datesWidget'):
            trend._datesWidget = self

        self.setLayout(layout())
        self.DEFAULT_START = 'YYYY/MM/DD hh:mm:ss'
        self.setTitle("Show Archiving since ...")
        self.xLabelStart = Qt.QLabel('Start')
        self.xEditStart = Qt.QLineEdit(self.DEFAULT_START)
        self.xEditStart.setToolTip("""
            Start date, it can be: 
            <empty>              #apply -range to current date
            YYYY/MM/DD hh:mm:ss  #absolute
            -1d/h/m/s            #relative to current date
            """)
        self.xLabelRange = Qt.QLabel("Range")
        self.xRangeCB = Qt.QComboBox()
        self.xRangeCB.setEditable(True)
        self.xRangeCB.addItems(["", "1 m", "1 h", "1 d", "1 w", "30 d", "1 y"])
        self.xRangeCB.setToolTip("""
            Any range like:
            <empty> show data from Start 'til now
            1m : X minutes
            1h : X hours
            1d : X days
            1w : X weeks
            1y : X years
            """)
        self.xRangeCB.setCurrentIndex(1)
        self.xApply = Qt.QPushButton("Refresh")
        self.layout().addWidget(
            QWidgetWithLayout(self, child=[self.xLabelStart, self.xEditStart]))
        self.layout().addWidget(
            QWidgetWithLayout(self, child=[self.xLabelRange, self.xRangeCB]))
        self.layout().addWidget(QWidgetWithLayout(self, child=[self.xApply]))
        trend.connect(self.xApply, Qt.SIGNAL("clicked()"), self.refreshAction)

        if hasattr(self._trend, 'getArchivedTrendLogger'):
            self.logger = self._trend.getArchivedTrendLogger()
            self.xInfo = Qt.QPushButton("Expert")
            self.layout().addWidget(QWidgetWithLayout(self,
                                                      child=[self.xInfo]))
            trend.connect(self.xInfo, Qt.SIGNAL("clicked()"),
                          self.logger.show_dialog)

        #if parent is trend.legend():

        #trend.legend().setLayout(Qt.QVBoxLayout())
        #trend.legend().layout().setAlignment(Qt.Qt.AlignBottom)
        #self.setMinimumWidth(150)
        #self.setMinimumHeight(15*4)
        #trend.legend().layout().addWidget(self)
        #trend.legend().setMinimumWidth(150)
        #trend.setMinimumHeight(250)
        #try:
        #trend.legend().children()[0].setMinimumWidth(150)
        #trend.legend().children()[0].children()[0].setMinimumWidth(150)
        #except:
        #ms = Qt.QMessageBox.warning(trend,"Error!",traceback.format_exc())

        return
    def show_history(self, attribute):
        TABS = []
        print 'getting archiving readers ...'
        from PyTangoArchiving import Reader
        hdb = Reader(db='hdb', schema='hdb')
        tdb = Reader(db='tdb', schema='tdb')
        tformat = '%Y-%m-%d %H:%M:%S'
        str2epoch = lambda s: time.mktime(time.strptime(s, tformat))
        epoch2str = lambda f: time.strftime(tformat, time.localtime(f))
        attribute = attribute.lower()

        if attribute in hdb.get_attributes(
        ) or attribute in tdb.get_attributes():
            print '%s is being archived' % attribute
            di = Qt.QDialog()
            wi = di  #QtGui.QWidget(di)
            wi.setLayout(Qt.QGridLayout())
            begin = Qt.QLineEdit()
            begin.setText(epoch2str(time.time() - 3600))
            end = Qt.QLineEdit()
            end.setText(epoch2str(time.time()))
            wi.setWindowTitle('Show Archiving')
            wi.layout().addWidget(
                Qt.QLabel('Enter Begin and End dates in %s format' % tformat),
                0, 0, 1, 2)
            wi.layout().addWidget(Qt.QLabel('Begin:'), 1, 0, 1, 1)
            wi.layout().addWidget(Qt.QLabel('End:'), 2, 0, 1, 1)
            wi.layout().addWidget(begin, 1, 1, 1, 1)
            wi.layout().addWidget(end, 2, 1, 1, 1)
            buttons = Qt.QDialogButtonBox(Qt.QDialogButtonBox.Ok
                                          | Qt.QDialogButtonBox.Cancel)
            wi.connect(buttons, Qt.SIGNAL('accepted()'), wi.accept)
            wi.connect(buttons, Qt.SIGNAL('rejected()'), wi.reject)
            wi.layout().addWidget(buttons, 3, 0, 1, 2)

            def check_values():
                di.exec_()
                if di.result():
                    print 'checking result ...'
                    start, stop = str(begin.text()), str(end.text())
                    if not all(
                            re.match(
                                '[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+',
                                str(s).strip()) for s in (start, stop)):
                        print 'dates are wrong ...'
                        Qt.QMessageBox.warning(
                            None, 'Show archiving',
                            'Dates seem not in %s format' % (tformat),
                            Qt.QMessageBox.Ok)
                        return check_values()
                    else:
                        print 'getting values ...'
                        reader = tdb if str2epoch(start) > (
                            time.time() - 5 * 24 * 3600.
                        ) and attribute in tdb.get_attributes() else hdb
                        print 'using %s reader' % reader.schema
                        values = reader.get_attribute_values(
                            attribute, str2epoch(start), str2epoch(stop))
                        if not len(
                                values
                        ) and reader is tdb and attribute in hdb.get_attributes(
                        ):
                            print 'tdb failed, retrying with hdb'
                            values = hdb.get_attribute_values(
                                attribute, str2epoch(start), str2epoch(stop))
                        print 'drawing table from %d values' % len(values)
                        tab = Qt.QTableWidget()
                        tab.setWindowTitle('%s: %s to %s' %
                                           (attribute, start, stop))
                        tab.setRowCount(len(values))
                        tab.setColumnCount(2)
                        tab.setHorizontalHeaderLabels(['TIME', 'VALUE'])
                        for i, tup in enumerate(values):
                            date, value = tup
                            tab.setItem(i, 0,
                                        Qt.QTableWidgetItem(epoch2str(date)))
                            tab.setItem(i, 1, Qt.QTableWidgetItem(str(value)))
                        tab.show()
                        tab.resizeColumnsToContents()
                        tab.horizontalHeader().setStretchLastSection(True)
                        TABS.append(tab)
                        tab.connect(tab,
                                    Qt.SIGNAL('close()'),
                                    lambda o=tab: TABS.remove(o))
                        print 'show_history done ...'
                        return tab
                else:
                    print 'dialog closed'
                    return None

            print 'asking for dates ...'
            return check_values()
        else:
            Qt.QMessageBox.warning(
                None, 'Show archiving',
                'Attribute %s is not being archived' % attribute,
                Qt.QMessageBox.Ok)
    def setupUi(self, Form):
        Form.setObjectName("Form")
        self._Form = Form
        self.font = QtGui.QFont()
        self.font.setBold(True)
        self.gridLayout_2 = QtGui.QGridLayout(Form)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.gridLayout = QtGui.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")

        self.chooseLabel = Qt.QLabel()
        self.chooseLabel.setObjectName("chooseLabel")
        self.chooseLabel.setFont(self.font)
        self.chooseLabel.setAlignment(QtCore.Qt.AlignCenter)
        self.gridLayout.addWidget(self.chooseLabel, 0, 0, 1, 1)

        self.tac = attributeChooser()
        self.tac.setObjectName("taurusAttributeChooser")
        self.gridLayout.addWidget(self.tac, 1, 0, 6, 1)

        self.selectedLabel = Qt.QLabel()
        self.selectedLabel.setObjectName("selectedLabel")
        self.selectedLabel.setFont(self.font)
        self.selectedLabel.setAlignment(QtCore.Qt.AlignCenter)
        self.selectedLabel.hide()
        self.gridLayout.addWidget(self.selectedLabel, 0, 1, 1, 6)

        self.tf = TaurusForm()
        self.tf.setWithButtons(False)
        self.tf.setObjectName("taurusForm")
        self.tf.hide()
        self.gridLayout.addWidget(self.tf, 1, 1, 1, 6)
        self.label = Qt.QLabel()
        self.label.setObjectName("label")
        self.label.setFont(self.font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.gridLayout.addWidget(self.label, 1, 1, 1, 6)

        spacerItem = QtGui.QSpacerItem(1, 1, QtGui.QSizePolicy.Minimum,
                                       QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem, 1, 1, 1, 1)

        self.modepLabel = QtGui.QLabel(Form)
        self.modepLabel.setObjectName("modepLabel")
        self.modepLabel.setText('Period [s]:')
        self.gridLayout.addWidget(self.modepLabel, 2, 1, 1, 1)
        self.modepLineEdit = QtGui.QLineEdit(Form)
        self.modepLineEdit.setObjectName("modepLineEdit")
        self.modepLineEdit.setValidator(Qt.QDoubleValidator(1, 14400, 1, Form))
        self.modepLineEdit.setMaxLength(7)
        self.modepLineEdit.setMaximumWidth(60)
        self.modepLineEdit.setText('60.0')
        self.gridLayout.addWidget(self.modepLineEdit, 2, 2, 1, 1)

        self.modeaLabel = QtGui.QLabel(Form)
        self.modeaLabel.setObjectName("modeaLabel")
        self.modeaLabel.setText('Absolute Period [s]:')
        self.gridLayout.addWidget(self.modeaLabel, 3, 1, 1, 1)
        self.modeaLineEdit = QtGui.QLineEdit(Form)
        self.modeaLineEdit.setObjectName("modeaLineEdit")
        self.modeaLineEdit.setValidator(Qt.QDoubleValidator(1, 14400, 1, Form))
        self.modeaLineEdit.setMaxLength(7)
        self.modeaLineEdit.setMaximumWidth(60)
        self.modeaLineEdit.setText('15.0')
        self.gridLayout.addWidget(self.modeaLineEdit, 3, 2, 1, 1)
        self.modeaLowerLimitLabel = QtGui.QLabel(Form)
        self.modeaLowerLimitLabel.setObjectName("modeaLowerLimitLabel")
        self.modeaLowerLimitLabel.setText('Lower Limit (decr.):')
        self.gridLayout.addWidget(self.modeaLowerLimitLabel, 3, 3, 1, 1)
        self.modeaLowerLimitLineEdit = QtGui.QLineEdit(Form)
        self.modeaLowerLimitLineEdit.setObjectName("modeaLowerLimitLineEdit")
        self.modeaLowerLimitLineEdit.setValidator(
            Qt.QDoubleValidator(1, 14400, 2, Form))
        self.modeaLowerLimitLineEdit.setMaxLength(7)
        self.modeaLowerLimitLineEdit.setMaximumWidth(60)
        self.gridLayout.addWidget(self.modeaLowerLimitLineEdit, 3, 4, 1, 1)
        self.modeaUpperLimitLabel = QtGui.QLabel(Form)
        self.modeaUpperLimitLabel.setObjectName("modeaUpperLimitLabel")
        self.modeaUpperLimitLabel.setText('Upper Limit (incr.):')
        self.gridLayout.addWidget(self.modeaUpperLimitLabel, 3, 5, 1, 1)
        self.modeaUpperLimitLineEdit = QtGui.QLineEdit(Form)
        self.modeaUpperLimitLineEdit.setObjectName("modeaUpperLimitLineEdit")
        self.modeaUpperLimitLineEdit.setValidator(
            Qt.QDoubleValidator(1, 14400, 2, Form))
        self.modeaUpperLimitLineEdit.setMaxLength(7)
        self.modeaUpperLimitLineEdit.setMaximumWidth(60)
        self.gridLayout.addWidget(self.modeaUpperLimitLineEdit, 3, 6, 1, 1)

        self.moderLabel = QtGui.QLabel(Form)
        self.moderLabel.setObjectName("moderLabel")
        self.moderLabel.setText('Relative Period [s]:')
        self.gridLayout.addWidget(self.moderLabel, 4, 1, 1, 1)
        self.moderLineEdit = QtGui.QLineEdit(Form)
        self.moderLineEdit.setObjectName("moderLineEdit")
        self.moderLineEdit.setValidator(Qt.QDoubleValidator(1, 14400, 1, Form))
        self.moderLineEdit.setMaxLength(7)
        self.moderLineEdit.setMaximumWidth(60)
        self.moderLineEdit.setText('15.0')
        self.gridLayout.addWidget(self.moderLineEdit, 4, 2, 1, 1)
        self.moderLowerLimitPercentLabel = QtGui.QLabel(Form)
        self.moderLowerLimitPercentLabel.setObjectName(
            "moderLowerLimitPercentLabel")
        self.moderLowerLimitPercentLabel.setText('Lower % Limit (decr.):')
        self.gridLayout.addWidget(self.moderLowerLimitPercentLabel, 4, 3, 1, 1)
        self.moderLowerLimitPercentLineEdit = QtGui.QLineEdit(Form)
        self.moderLowerLimitPercentLineEdit.setObjectName(
            "moderLowerLimitPercentLineEdit")
        self.moderLowerLimitPercentLineEdit.setValidator(
            QtGui.QDoubleValidator(0, 1, 2, Form))
        self.moderLowerLimitPercentLineEdit.setMaxLength(7)
        self.moderLowerLimitPercentLineEdit.setMaximumWidth(60)
        self.gridLayout.addWidget(self.moderLowerLimitPercentLineEdit, 4, 4, 1,
                                  1)
        self.moderUpperLimitPercentLabel = QtGui.QLabel(Form)
        self.moderUpperLimitPercentLabel.setObjectName(
            "moderUpperLimitPercentLabel")
        self.moderUpperLimitPercentLabel.setText('Upper % Limit (incr.):')
        self.gridLayout.addWidget(self.moderUpperLimitPercentLabel, 4, 5, 1, 1)
        self.moderUpperLimitPercentLineEdit = QtGui.QLineEdit(Form)
        self.moderUpperLimitPercentLineEdit.setObjectName(
            "moderUpperLimitPercentLineEdit")
        self.moderUpperLimitPercentLineEdit.setValidator(
            Qt.QDoubleValidator(0, 1, 2, Form))
        self.moderUpperLimitPercentLineEdit.setMaxLength(7)
        self.moderUpperLimitPercentLineEdit.setMaximumWidth(60)
        self.gridLayout.addWidget(self.moderUpperLimitPercentLineEdit, 4, 6, 1,
                                  1)

        self.gridButtonLayout = QtGui.QGridLayout()
        self.gridButtonLayout.setObjectName("gridButtonLayout")
        spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Minimum)
        self.gridButtonLayout.addItem(spacerItem, 0, 1, 1, 1)
        self.pushButtonStart = QtGui.QPushButton(Form)
        self.pushButtonStart.setObjectName("pushButtonStart")
        self.pushButtonStart.setEnabled(False)
        self.gridButtonLayout.addWidget(self.pushButtonStart, 0, 2, 1, 1)
        self.pushButtonStop = QtGui.QPushButton(Form)
        self.pushButtonStop.setObjectName("pushButtonStop")
        self.pushButtonStop.setEnabled(False)
        self.gridButtonLayout.addWidget(self.pushButtonStop, 0, 3, 1, 1)
        self.pushButtonCancel = QtGui.QPushButton(Form)
        self.pushButtonCancel.setObjectName("pushButtonCancel")
        self.gridButtonLayout.addWidget(self.pushButtonCancel, 0, 4, 1, 1)
        self.gridLayout.addLayout(self.gridButtonLayout, 5, 1, 1, 6)
        self.gridLayout_2.addLayout(self.gridLayout, 1, 0, 1, 1)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
示例#14
0
    def show_new_dialog(klass, attribute, schema='*', parent=None, dates=[]):
        try:
            if not Qt.QApplication.instance(): Qt.QApplication([])
        except:
            pass
        print 'in Vacca.widgets.show_history(%s)'

        print 'getting archiving readers ...'
        from PyTangoArchiving import Reader
        rd = Reader(schema.lower())
        hdb = Reader('hdb')
        tdb = Reader('tdb')
        attribute = str(attribute).lower()

        try:
            dates = dates or klass.get_default_dates()
            if not all(map(fandango.isString, dates)):
                dates = map(epoch2str, dates)
        except:
            traceback.print_exc()
            dates = epoch2str(), epoch2str()

        schemas = rd.is_attribute_archived(attribute, preferent=False)
        if schemas:
            print '%s is being archived' % attribute
            di = Qt.QDialog(parent)
            wi = di  #QtGui.QWidget(di)
            wi.setLayout(Qt.QGridLayout())
            begin = Qt.QLineEdit()
            begin.setText(dates[0])
            end = Qt.QLineEdit()
            end.setText(dates[1])
            tfilter = Qt.QLineEdit()
            vfilter = Qt.QCheckBox()
            wi.setWindowTitle('Show %s Archiving' % attribute)
            wil = wi.layout()
            wi.layout().addWidget(Qt.QLabel(attribute), 0, 0, 1, 2)
            wi.layout().addWidget(Qt.QLabel('Preferred Schema'), 1, 0, 1, 1)
            qschema = Qt.QComboBox()
            qschema.insertItems(0, ['*'] + list(schemas))
            wil.addWidget(qschema, 1, 1, 1, 1)
            #qb = Qt.QPushButton("Save as preferred schema")
            #wil.addWidget(qb,wil.rowCount(),0,1,2)
            #qi.connect(qb,Qt.SIGNAL('pushed()'),save_schema)
            wil.addWidget(
                Qt.QLabel('Enter Begin and End dates in %s format' % tformat),
                2, 0, 1, 2)
            wil.addWidget(Qt.QLabel('Begin:'), 3, 0, 1, 1)
            wil.addWidget(begin, 3, 1, 1, 1)
            wil.addWidget(Qt.QLabel('End:'), 4, 0, 1, 1)
            wil.addWidget(end, 4, 1, 1, 1)
            wil.addWidget(Qt.QLabel('Time Filter:'), 5, 0, 1, 1)
            wil.addWidget(tfilter, 5, 1, 1, 1)
            wil.addWidget(Qt.QLabel('Value Filter:'), 6, 0, 1, 1)
            wil.addWidget(vfilter, 6, 1, 1, 1)
            buttons = Qt.QDialogButtonBox(wi)
            buttons.addButton(Qt.QPushButton("Export"),
                              Qt.QDialogButtonBox.AcceptRole)

            bt = Qt.QPushButton("Apply")
            buttons.addButton(bt, Qt.QDialogButtonBox.ApplyRole)

            def set_schema(r=rd, a=attribute, qs=qschema):
                print 'setting schema ...'
                schema = str(qs.currentText()).strip()
                r.set_preferred_schema(a, schema)

            buttons.connect(bt, Qt.SIGNAL('clicked()'), set_schema)

            buttons.addButton(Qt.QPushButton("Close"),
                              Qt.QDialogButtonBox.RejectRole)

            #  Qt.QDialogButtonBox.Apply\
            #    |Qt.QDialogButtonBox.Open|Qt.QDialogButtonBox.Close)
            wi.connect(buttons, Qt.SIGNAL('accepted()'), wi.accept)
            wi.connect(buttons, Qt.SIGNAL('rejected()'), wi.reject)
            wi.layout().addWidget(buttons, 7, 0, 1, 2)

            def check_values():
                di.exec_()
                print 'checking schema ...'
                schema = str(qschema.currentText()).strip()
                if schema != '*':
                    rd.set_preferred_schema(attribute, schema)
                if di.result():
                    print 'checking result ...'
                    try:
                        start, stop = str(begin.text()), str(end.text())
                        try:
                            tf = int(str(tfilter.text()))
                        except:
                            tf = 0
                        vf = vfilter.isChecked()
                        if not all(
                                re.match(
                                    '[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+',
                                    str(s).strip()) for s in (start, stop)):
                            print 'dates are wrong ...'
                            Qt.QMessageBox.warning(
                                None, 'Show archiving',
                                'Dates seem not in %s format' % (tformat),
                                Qt.QMessageBox.Ok)
                            return check_values()
                        else:
                            print 'getting values ...'
                            print 'using %s reader' % rd.schema
                            values = rd.get_attribute_values(
                                attribute, str2epoch(start), str2epoch(stop))
                            if not len(
                                    values
                            ) and schema == '*' and hdb.is_attribute_archived(
                                    attribute, active=True):
                                print 'tdb failed, retrying with hdb'
                                values = hdb.get_attribute_values(
                                    attribute, str2epoch(start),
                                    str2epoch(stop))
                            if vf:
                                values = fandango.arrays.decimate_array(values)
                            if tf:
                                print 'Filtering %d values (1/%dT)' % (
                                    len(values), tf)
                                values = fandango.arrays.filter_array(
                                    values, window=tf)  #,begin=start,end=stop)

                            twi = klass.setup_table(attribute, start, stop,
                                                    values)
                            klass.set_default_dates(str2epoch(start),
                                                    str2epoch(stop))

                            button = Qt.QPushButton('Save to file')
                            button2 = Qt.QPushButton('Send to email')

                            def save_to_file(var=attribute,
                                             data=values,
                                             parent=twi,
                                             edit=True):
                                try:
                                    options = {
                                        'sep': '\\t',
                                        'arrsep': '\\ ',
                                        'linesep': '\\n'
                                    }
                                    import codecs
                                    dd = QOptionDialog(model=options,
                                                       title='CSV Options')
                                    dd.exec_()
                                    for k, v in options.items():
                                        options[k] = codecs.escape_decode(
                                            str(v))[0]
                                    print options

                                    filename = Qt.QFileDialog.getSaveFileName(
                                        parent, 'File to save',
                                        '/data/' + PyTangoArchiving.files.
                                        get_data_filename(
                                            var, data, 'csv', 'human'),
                                        'CSV files (*.csv)')

                                    PyTangoArchiving.files.save_data_file(
                                        var,
                                        data,
                                        filename,
                                        format='csv',
                                        **options)
                                    if edit:
                                        try:
                                            os.system('gedit %s &' % filename)
                                        except:
                                            pass
                                    return filename
                                except Exception, e:
                                    Qt.QMessageBox.warning(
                                        None, "Warning",
                                        "Unable to save %s\n:%s" %
                                        (filename, e))

                            def send_by_email(var=attribute,
                                              data=values,
                                              parent=twi):
                                #subject,text,receivers,sender='',attachments=None,trace=False):
                                try:
                                    receivers, ok = Qt.QInputDialog.getText(
                                        None, 'Send by email', 'to:')
                                    if ok:
                                        filename = str(
                                            save_to_file(var,
                                                         data,
                                                         parent,
                                                         edit=False))
                                        fandango.linos.sendmail(
                                            filename,
                                            attribute,
                                            receivers=str(receivers),
                                            attachments=[filename])
                                except Exception, e:
                                    Qt.QMessageBox.warning(
                                        None, "Warning",
                                        "Unable to send %s\n:%s" %
                                        (filename, e))

                            #button.setTextAlignment(Qt.Qt.AlignCenter)
                            twi.connect(button, Qt.SIGNAL("pressed ()"),
                                        save_to_file)
                            twi.layout().addWidget(button)
                            twi.connect(button2, Qt.SIGNAL("pressed ()"),
                                        send_by_email)
                            twi.layout().addWidget(button2)
                            twi.show()

                            TABS.append(twi)
                            twi.connect(twi,
                                        Qt.SIGNAL('close()'),
                                        lambda o=twi: TABS.remove(o))
                            print 'show_history done ...'
                            return twi
                    except Exception, e:
                        print traceback.format_exc()
                        Qt.QMessageBox.warning(
                            None, "Warning",
                            "Unable to retrieve the values (%s), sorry" % e)
    def trace(self, msg):
        self.log('trace', msg)

    def debug(self, msg):
        self.log('debug', msg)

    def info(self, msg):
        self.log('info', msg)

    def warning(self, msg):
        self.log('warning', msg)

    def alarm(self, msg):
        self.log('alarm', msg)

    def error(self, msg):
        self.log('error', msg)


if __name__ == '__main__':
    import sys
    app = fqt.getApplication()
    m = Qt.QWidget()
    m.setLayout(Qt.QVBoxLayout())
    w = QArchivingMode._test(*sys.argv[1:])
    m.layout().addWidget(Qt.QLabel(str(sys.argv)))
    m.layout().addWidget(w)
    m.show()
    app.exec_()
 def setupUi(self,USE_SCROLL=False,SHOW_OPTIONS=True,USE_TREND=False):
     self.setWindowTitle('Tango Finder : Search Attributes and Archiving')
     self.setLayout(Qt.QVBoxLayout())
     self.setMinimumWidth(950)#550)
     #self.setMinimumHeight(700)
     self.layout().setAlignment(Qt.Qt.AlignTop)
     self.chooser = Qt.QFrame()
     self.chooser.setLayout(Qt.QHBoxLayout())
     self.combo = Qt.QComboBox() #(self)
     #self.chooser.layout().addWidget(Qt.QLabel('Choose a domain to see temperatures status:'))
     #self.chooser.layout().addWidget(self.combo)
     #self.layout().addWidget(self.chooser)
     if True:
         self.searchbar = Qt.QFrame()
         self.searchbar.setLayout(Qt.QGridLayout()) 
         self.label = Qt.QLabel('Type a part of device name and a part of attribute name, use "*" or " " as wildcards:')
         #self.search = Qt.QLineEdit()
         self.ServerFilter = Qt.QLineEdit()
         self.ServerFilter.setMaximumWidth(250)
         self.DeviceFilter = fandango.qt.Dropable(Qt.QLineEdit)()
         self.DeviceFilter.setSupportedMimeTypes(fandango.qt.TAURUS_DEV_MIME_TYPE)
         self.AttributeFilter = fandango.qt.Dropable(Qt.QLineEdit)()
         self.AttributeFilter.setSupportedMimeTypes([fandango.qt.TAURUS_ATTR_MIME_TYPE,fandango.qt.TEXT_MIME_TYPE])
         self.update = Qt.QPushButton('Update')
         self.archivecheck = Qt.QCheckBox("Show archived attributes only")
         self.archivecheck.setChecked(False)
         self.layout().addWidget(self.label)
         [self.searchbar.layout().addWidget(o,x,y,h,w) for o,x,y,h,w in (
             (Qt.QLabel("Device or Alias:"),0,0,1,1),(self.DeviceFilter,0,1,1,4),
             (Qt.QLabel("Attribute:"),0,5,1,1),(self.AttributeFilter,0,6,1,4),
             (self.update,0,10,1,1),(self.archivecheck,0,11,1,2),
             )]
         self.searchbar.layout().addWidget(Qt.QLabel('Enter Device and Attribute filters using wildcards (e.g. li/ct/plc[0-9]+ / ^stat*$ & !status ) and push Update'),1,0,4,13)
         if SHOW_OPTIONS:
             self.options = Qt.QWidget() #self.searchbar
             self.options.setLayout(Qt.QGridLayout())
             separator = lambda x:Qt.QLabel(' '*x)
             row = 1
             [self.options.layout().addWidget(o,x,y,h,w) for o,x,y,h,w in (
                 #separator(120),Qt.QLabel("Options: "),separator(5),
                 (Qt.QLabel("Server: "),row,0,1,1),(self.ServerFilter,row,1,1,4),(Qt.QLabel(''),row,2,1,11)
                 )]
             #self.panel = generate_table(load_all_thermocouples('SR14')[-1])
             self.optiontab = Qt.QTabWidget()
             self.optiontab.addTab(self.searchbar,'Filters')
             self.optiontab.addTab(self.options,'Options')
             self.optiontab.setMaximumHeight(100)
             self.optiontab.setTabPosition(self.optiontab.North)
             self.layout().addWidget(self.optiontab)
         else: self.layout().addWidget(self.searchbar)
         
     self.toppan = Qt.QWidget(self)
     self.toppan.setLayout(Qt.QVBoxLayout())
     if True:
         self.header = QGridTable(self.toppan)
         self.header.setHorizontalHeaderLabels('Label/Value Device Attribute Alias Archiving'.split())
         self.header.setColumnWidth(0,350)
         self.toppan.layout().addWidget(self.header)
     
     if USE_SCROLL:
         print '*'*30 + ' USE_SCROLL=True '+'*'*30
         self._scroll = MyScrollArea(self.toppan)#Qt.QScrollArea(self)
         self._background = AttributesPanel(self._scroll) #At least a panel should be kept (never deleted) in background to not crash the worker!
         self.panel = None
         self._scroll.setChildrenPanel(self.panel)
         self._scroll.setWidget(self.panel)
         self._scroll.setMaximumHeight(700)
         self.toppan.layout().addWidget(self._scroll)
     else:
         self.panel = AttributesPanel(self.toppan)
         self.toppan.layout().addWidget(self.panel)
         
     self.toppan.layout().addWidget(Qt.QLabel('Drag any attribute from the first column into the trend or any taurus widget you want:'))
     
     if USE_TREND:
         self.split = Qt.QSplitter(Qt.Qt.Vertical)
         self.split.setHandleWidth(10)
         self.split.addWidget(self.toppan)
         
         from taurus.qt.qtgui.plot import TaurusTrend
         from PyTangoArchiving.widget.trend import ArchivingTrend,ArchivingTrendWidget
         self.trend = ArchivingTrendWidget() #TaurusArchivingTrend()
         self.trend.setUseArchiving(True)
         self.trend.showLegend(True)
         self.split.addWidget(self.trend)
         self.layout().addWidget(self.split)
     else:
         self.layout().addWidget(self.toppan)
     type(self)._persistent_ = self