Esempio n. 1
0
    def create_widget(self, parent):
        from PyQt4.QtGui import QSortFilterProxyModel
        from PyQt4.QtCore import Qt, QTimer
        from lunchinator.table_widget import TableWidget
        from messages_table.messages_table_model import MessagesTableModel

        self.messagesTable = TableWidget(
            parent, "Send Message", self.sendMessageClicked, placeholderText="Enter a message", sortingEnabled=False
        )

        # initialize messages table
        self.messagesModel = MessagesTableModel(parent)
        self.messagesTable.setModel(self.messagesModel)
        self.messagesTable.setColumnWidth(0, 120)
        self.messagesTable.setColumnWidth(1, 90)

        get_notification_center().connectMessagePrepended(self.messagesModel.messagePrepended)
        get_notification_center().connectDisplayedPeerNameChanged(self.messagesModel.updateSenders)

        self._dailyTrigger = QTimer(parent)
        self._dailyTrigger.timeout.connect(self._updateTimes)
        self._dailyTrigger.setSingleShot(True)
        self._updateDailyTrigger()

        return self.messagesTable
Esempio n. 2
0
 def create_widget(self, parent):
     from PyQt4.QtGui import QSortFilterProxyModel
     from lunchinator.table_widget import TableWidget
     self.resultTable = TableWidget(parent, "Execute", self.sendSqlClicked, useTextEdit=self.options['use_textedit'])
     hist = self.specialized_db_conn().get_last_commands()
     if hist:
         self.resultTable.addToHistory(hist)
     return self.resultTable
Esempio n. 3
0
class members_table(iface_gui_plugin):
    def __init__(self):
        super(members_table, self).__init__()
        self.membersTable = None
    
    def activate(self):
        iface_gui_plugin.activate(self)
        
    def deactivate(self):
        iface_gui_plugin.deactivate(self)
        
    def get_displayed_name(self):
        return "Peers"
        
    def addHostClicked(self, text):
        if get_server().controller != None:
            get_server().controller.addHostClicked(text)        
    
    def create_widget(self, parent):
        from PyQt4.QtGui import QSortFilterProxyModel
        from PyQt4.QtCore import QTimer, Qt
        from members_table.members_table_model import MembersTableModel
        from lunchinator.table_widget import TableWidget
        
        class NameSortProxyModel(QSortFilterProxyModel):
            def lessThan(self, left, right):
                # compare by lunch time
                ldata = self.sourceModel().data(left, MembersTableModel.SORT_ROLE)
                rdata = self.sourceModel().data(right, MembersTableModel.SORT_ROLE)
                if ldata != rdata:
                    return super(NameSortProxyModel, self).lessThan(left, right)
                
                # compare by name, case sensitive
                lindex = self.sourceModel().index(left.row(), MembersTableModel.NAME_COL_INDEX)
                rindex = self.sourceModel().index(right.row(), MembersTableModel.NAME_COL_INDEX)
                
                res = super(NameSortProxyModel, self).lessThan(lindex, rindex)
                if res or super(NameSortProxyModel, self).lessThan(rindex, lindex):
                    return res
                
                # compare by name, byte order
                ls = convert_string(self.sourceModel().data(lindex, MembersTableModel.SORT_ROLE).toString())
                rs = convert_string(self.sourceModel().data(rindex, MembersTableModel.SORT_ROLE).toString())
                if ls != rs:
                    return ls < rs
                
                # compare by peer ID 
                return self.sourceModel().keys[left.row()] < self.sourceModel().keys[right.row()]
        
        self.membersTable = TableWidget(parent, "Add Host", self.addHostClicked, sortedColumn=MembersTableModel.LUNCH_TIME_COL_INDEX, placeholderText="Enter hostname")
        self.membersTable.getTable().setContextMenuPolicy(Qt.CustomContextMenu)
        self.membersTable.getTable().customContextMenuRequested.connect(self._showContextMenu)
        
        # initialize members table
        self.membersModel = MembersTableModel(get_peers(), self.logger)
        self.membersProxyModel = NameSortProxyModel(self.membersTable)
        self.membersProxyModel.setSortCaseSensitivity(Qt.CaseInsensitive)
        self.membersProxyModel.setSortRole(MembersTableModel.SORT_ROLE)
        self.membersProxyModel.setDynamicSortFilter(True)
        self.membersProxyModel.setSourceModel(self.membersModel)
        self.membersTable.setModel(self.membersProxyModel)
        
        self.membersTable.setColumnWidth(MembersTableModel.NAME_COL_INDEX, 150)
        self.membersTable.setColumnWidth(MembersTableModel.GROUP_COL_INDEX, 150)
        
        get_notification_center().connectPeerAppended(self.membersModel.externalRowAppended)
        get_notification_center().connectPeerUpdated(self.membersModel.externalRowUpdated)
        get_notification_center().connectPeerRemoved(self.membersModel.externalRowRemoved)
        
        get_notification_center().connectMemberAppended(self._updatePeer)
        get_notification_center().connectMemberRemoved(self._updatePeer)
        
        get_notification_center().connectDisplayedPeerNameChanged(self._displayedNameChanged)
        
        self._lunchTimeColumnTimer = QTimer(self.membersModel)
        self._lunchTimeColumnTimer.timeout.connect(self._startSyncedTimer)
        self._lunchTimeColumnTimer.start(msecUntilNextMinute())
        
        return self.membersTable
    
    @loggingFunc
    def _displayedNameChanged(self, peerID, _newName, infoDict):
        self._updatePeer(peerID, infoDict)

    def _updatePeer(self, peerID, infoDict=None):
        peerID = convert_string(peerID)
        if infoDict == None:
            infoDict = get_peers().getPeerInfo(pID=peerID)
        
        if infoDict == None:
            #this happens when a peer that is also a member is removed 
            #-> the peer is not there anymore when the member removed signal arrives
            return
        
        self.membersModel.externalRowUpdated(peerID, infoDict)
    
    @loggingFunc
    def _startSyncedTimer(self):
        self.membersModel.updateLunchTimeColumn()
        self._lunchTimeColumnTimer.timeout.disconnect(self._startSyncedTimer)
        self._lunchTimeColumnTimer.timeout.connect(self.membersModel.updateLunchTimeColumn)
        self._lunchTimeColumnTimer.start(60000)

    @loggingFunc
    def _showContextMenu(self, point):
        from PyQt4.QtGui import QMenu, QCursor
        index = self.membersTable.getTable().indexAt(point)
        index = self.membersProxyModel.mapToSource(index)
        if index != None:
            peerID = self.membersModel.keyAtIndex(index)
            peer_action_utils.showPeerActionsPopup(peerID, lambda _pluginName, _action : True, self.membersTable.getTable())

    def destroy_widget(self):
        iface_gui_plugin.destroy_widget(self)
        
        get_notification_center().disconnectPeerAppended(self.membersModel.externalRowAppended)
        get_notification_center().disconnectPeerUpdated(self.membersModel.externalRowUpdated)
        get_notification_center().disconnectPeerRemoved(self.membersModel.externalRowRemoved)

        get_notification_center().disconnectMemberAppended(self._updatePeer)
        get_notification_center().disconnectMemberRemoved(self._updatePeer)
        
        get_notification_center().disconnectDisplayedPeerNameChanged(self._displayedNameChanged)
        
        self._lunchTimeColumnTimer.stop()
        self._lunchTimeColumnTimer.deleteLater()

        self.membersTable = None
        self.membersModel = None
        self.membersProxyModel = None
        
    def add_menu(self,menu):
        pass
Esempio n. 4
0
 def create_widget(self, parent):
     from PyQt4.QtGui import QSortFilterProxyModel
     from PyQt4.QtCore import QTimer, Qt
     from members_table.members_table_model import MembersTableModel
     from lunchinator.table_widget import TableWidget
     
     class NameSortProxyModel(QSortFilterProxyModel):
         def lessThan(self, left, right):
             # compare by lunch time
             ldata = self.sourceModel().data(left, MembersTableModel.SORT_ROLE)
             rdata = self.sourceModel().data(right, MembersTableModel.SORT_ROLE)
             if ldata != rdata:
                 return super(NameSortProxyModel, self).lessThan(left, right)
             
             # compare by name, case sensitive
             lindex = self.sourceModel().index(left.row(), MembersTableModel.NAME_COL_INDEX)
             rindex = self.sourceModel().index(right.row(), MembersTableModel.NAME_COL_INDEX)
             
             res = super(NameSortProxyModel, self).lessThan(lindex, rindex)
             if res or super(NameSortProxyModel, self).lessThan(rindex, lindex):
                 return res
             
             # compare by name, byte order
             ls = convert_string(self.sourceModel().data(lindex, MembersTableModel.SORT_ROLE).toString())
             rs = convert_string(self.sourceModel().data(rindex, MembersTableModel.SORT_ROLE).toString())
             if ls != rs:
                 return ls < rs
             
             # compare by peer ID 
             return self.sourceModel().keys[left.row()] < self.sourceModel().keys[right.row()]
     
     self.membersTable = TableWidget(parent, "Add Host", self.addHostClicked, sortedColumn=MembersTableModel.LUNCH_TIME_COL_INDEX, placeholderText="Enter hostname")
     self.membersTable.getTable().setContextMenuPolicy(Qt.CustomContextMenu)
     self.membersTable.getTable().customContextMenuRequested.connect(self._showContextMenu)
     
     # initialize members table
     self.membersModel = MembersTableModel(get_peers(), self.logger)
     self.membersProxyModel = NameSortProxyModel(self.membersTable)
     self.membersProxyModel.setSortCaseSensitivity(Qt.CaseInsensitive)
     self.membersProxyModel.setSortRole(MembersTableModel.SORT_ROLE)
     self.membersProxyModel.setDynamicSortFilter(True)
     self.membersProxyModel.setSourceModel(self.membersModel)
     self.membersTable.setModel(self.membersProxyModel)
     
     self.membersTable.setColumnWidth(MembersTableModel.NAME_COL_INDEX, 150)
     self.membersTable.setColumnWidth(MembersTableModel.GROUP_COL_INDEX, 150)
     
     get_notification_center().connectPeerAppended(self.membersModel.externalRowAppended)
     get_notification_center().connectPeerUpdated(self.membersModel.externalRowUpdated)
     get_notification_center().connectPeerRemoved(self.membersModel.externalRowRemoved)
     
     get_notification_center().connectMemberAppended(self._updatePeer)
     get_notification_center().connectMemberRemoved(self._updatePeer)
     
     get_notification_center().connectDisplayedPeerNameChanged(self._displayedNameChanged)
     
     self._lunchTimeColumnTimer = QTimer(self.membersModel)
     self._lunchTimeColumnTimer.timeout.connect(self._startSyncedTimer)
     self._lunchTimeColumnTimer.start(msecUntilNextMinute())
     
     return self.membersTable
Esempio n. 5
0
class messages_table(iface_gui_plugin):
    def __init__(self):
        super(messages_table, self).__init__()
        self.messagesTable = None
        self._dailyTrigger = None

    def activate(self):
        iface_gui_plugin.activate(self)

    def deactivate(self):
        iface_gui_plugin.deactivate(self)

    def get_displayed_name(self):
        return "Group Messages"

    def sendMessageClicked(self, text):
        if get_server().controller != None:
            get_server().controller.sendMessageClicked(None, text)

    def destroy_widget(self):
        if self._dailyTrigger != None:
            self._dailyTrigger.timeout.disconnect(self._updateTimes)
            self._dailyTrigger.stop()
            self._dailyTrigger.deleteLater()

        get_notification_center().disconnectMessagePrepended(self.messagesModel.messagePrepended)
        get_notification_center().disconnectDisplayedPeerNameChanged(self.messagesModel.updateSenders)

        self.messagesModel = None
        self.messagesTable = None

        iface_gui_plugin.destroy_widget(self)

    def _displayedPeerNameChanged(self, _pid, _newName, _infoDict):
        self.messagesModel.updateSenders()

    def _updateDailyTrigger(self):
        now = datetime.now()
        midnight = (now + timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0)
        delta = midnight - now
        self._dailyTrigger.start((delta.seconds + 1) * 1000 + delta.microseconds / 1000)

    @loggingFunc
    def _updateTimes(self):
        self.logger.debug("It's a new day, update the message times.")
        self.messagesModel.updateTimes()
        self._updateDailyTrigger()

    def create_widget(self, parent):
        from PyQt4.QtGui import QSortFilterProxyModel
        from PyQt4.QtCore import Qt, QTimer
        from lunchinator.table_widget import TableWidget
        from messages_table.messages_table_model import MessagesTableModel

        self.messagesTable = TableWidget(
            parent, "Send Message", self.sendMessageClicked, placeholderText="Enter a message", sortingEnabled=False
        )

        # initialize messages table
        self.messagesModel = MessagesTableModel(parent)
        self.messagesTable.setModel(self.messagesModel)
        self.messagesTable.setColumnWidth(0, 120)
        self.messagesTable.setColumnWidth(1, 90)

        get_notification_center().connectMessagePrepended(self.messagesModel.messagePrepended)
        get_notification_center().connectDisplayedPeerNameChanged(self.messagesModel.updateSenders)

        self._dailyTrigger = QTimer(parent)
        self._dailyTrigger.timeout.connect(self._updateTimes)
        self._dailyTrigger.setSingleShot(True)
        self._updateDailyTrigger()

        return self.messagesTable
Esempio n. 6
0
class sql_interface(iface_gui_plugin, LunchCLIModule):
    def __init__(self):
        LunchCLIModule.__init__(self)
        iface_gui_plugin.__init__(self)
        
        self.sqlResultTable = None
        self.times_called=0
        self.last_key=-1
        self.options = [((u"query_db_connection", u"DB Connection to send statements to", [],
                          self._changeQueryDB),
                         get_settings().get_default_db_connection()),
                        ((u"db_connection", u"DB Connection to store history", [],
                          self._reconnectDB),
                         get_settings().get_default_db_connection()),
                        ((u"use_textedit", u"Use multi-line sql editor"),False)]
        self.db_connection = None
        
        self.add_supported_dbms("SQLite Connection", sql_commands_sqlite)
    
    def _getChoiceOptions(self, o):
        if o == u"query_db_connection":
            return get_settings().get_available_db_connections()
        elif o == u"db_connection":
            return self.get_supported_connections()
        return super(sql_interface, self)._getChoiceOptions(o)
    
    def _changeQueryDB(self, _set, _newVal):
        self.db_connection = None
    
    def _reconnectDB(self, setting, newVal):
        self.reconnect_db(setting, newVal)
        self.resultTable.clearHistory()
        hist = self.specialized_db_conn().get_last_commands()
        if hist:
            self.resultTable.addToHistory(hist)
    
    def activate(self):
        iface_gui_plugin.activate(self)
        
    def deactivate(self):
        iface_gui_plugin.deactivate(self)        
    
    def do_SQL(self, cmd):
        if None==self.db_connection:
            self.db_connection, _ = get_db_connection(self.logger, self.options["query_db_connection"])
        try:
            header, res = self.db_connection.queryWithHeader(cmd)
            self.appendOutput(*header)
            self.appendSeparator()
            for r in res:
                self.appendOutput(*r)
            self.flushOutput()
        except Exception as e:
            print "Error in SQL statement",str(e)
        
    def empty(self,key,data,item):
        if key!=self.last_key:
            self.last_key=key
            self.times_called=0
        item.setText(unicode(data[self.times_called]))
        self.times_called+=1
        
    def sendSqlClicked(self, sql_stat):
        from PyQt4.QtGui import QMessageBox
        from lunchinator.table_models import TableModelBase
        
        self.specialized_db_conn().insert_command(sql_stat)
        
        if None==self.db_connection:        
            self.db_connection, _ = get_db_connection(self.logger, self.options["query_db_connection"])
                    
        try:
            header, res = self.db_connection.queryWithHeader(sql_stat)
        except Exception as e:
            QMessageBox.warning(self.resultTable,"Error in SQL statement",str(e))
#             self.logger.warning("SQL error:")
            return False
        
        columns = []
        for h in header:
            columns.append((h,self.empty))
        mod = TableModelBase(None, columns, self.logger)
        self.times_called = 0
        for i,r in enumerate(res):
            mod.appendContentRow(i, r)
            if i>1000:
                break
        self.resultTable.setModel(mod)
        for c in xrange(mod.columnCount()):
            self.resultTable.getTable().resizeColumnToContents(c)
        return True
        
    def create_widget(self, parent):
        from PyQt4.QtGui import QSortFilterProxyModel
        from lunchinator.table_widget import TableWidget
        self.resultTable = TableWidget(parent, "Execute", self.sendSqlClicked, useTextEdit=self.options['use_textedit'])
        hist = self.specialized_db_conn().get_last_commands()
        if hist:
            self.resultTable.addToHistory(hist)
        return self.resultTable
    
    def add_menu(self,menu):
        pass