Restart config server when connection settings change
authorStas Shtin <antisvin@gmail.com>
Thu, 15 Apr 2010 14:07:28 +0000 (18:07 +0400)
committerStas Shtin <antisvin@gmail.com>
Thu, 15 Apr 2010 14:07:28 +0000 (18:07 +0400)
src/ipypbx/controllers.py
src/ipypbx/http.py

index 5285e28..78d046a 100644 (file)
@@ -122,13 +122,30 @@ class BaseController(QtCore.QObject):
 
         # Select first row in the view list.
         self.view_display.toFirst()
-        
-        # Register signals for this controller.
-        for data in self.getSignalsData():
+
+        # Signals for this controller.
+        signal_data = (
+            (getattr(self.views, self.basename + 'Add'), 'clicked()',
+             self.add),
+            (self.model, 'primeInsert(int,QSqlRecord&)', self.objectAdded),
+            (self.view_list.selectionModel(),
+             'currentRowChanged(QModelIndex,QModelIndex)',
+             self.view_display, 'setCurrentModelIndex(QModelIndex)'),
+            (self.parent().controllers.get('connection', self
+                                           ).view_list.selectionModel(),
+             'currentRowChanged(QModelIndex,QModelIndex)',
+             self.connectionChange),            
+            (getattr(self.views, self.basename + 'Save'), 'clicked()',
+             self.save))
+
+        # Connect all signals.
+        for data in signal_data:
             if len(data) == 3:
+                # Connect to python function.
                 sender, signal, receiver = data
                 QtCore.QObject.connect(sender, QtCore.SIGNAL(signal), receiver)
             elif len(data) == 4:
+                # Connect to Qt slot.
                 sender, signal, receiver, slot = data
                 QtCore.QObject.connect(
                     sender, QtCore.SIGNAL(signal), receiver, QtCore.SLOT(slot))
@@ -153,21 +170,6 @@ class BaseController(QtCore.QObject):
             field for field in self.fields
             if not field in self.view_display_fields_hidden]        
 
-    def getSignalsData(self):
-        """
-        Default signals built from controller's base name.
-        """
-        # Default signals handle row selection, Add and Save buttons.
-        return [
-            (getattr(self.views, self.basename + 'Add'), 'clicked()', self.add),
-            (self.model, 'primeInsert(int,QSqlRecord&)', self.objectAdded),
-            (self.view_list.selectionModel(),
-             'currentRowChanged(QModelIndex,QModelIndex)',
-             self.view_display, 'setCurrentModelIndex(QModelIndex)'),
-            (getattr(self.views, self.basename + 'Save'), 'clicked()',
-             self.save),
-            ]
-
     def add(self):
         """
         Add new object.
@@ -183,6 +185,12 @@ class BaseController(QtCore.QObject):
         # Focust to the first displayed field.
         self.getFieldWidget(self.getDisplayFields()[0]).setFocus()
 
+    def connectionChange(self, index, row):
+        """
+        Overload to handle connection change.
+        """
+        return NotImplemented
+
     def save(self):
         """
         Save to database.
@@ -207,23 +215,27 @@ class ConnectionController(BaseController):
 
     def __init__(self, parent=None, views=None):
         super(ConnectionController, self).__init__(parent, views)
-        
+
+        # We track last selected row because Qt deselects in on submit.
         self.last_row = -1
 
         for row in range(self.model.rowCount()):
-            # Get local IP address and port from the table.
-            local_ip_address = self.model.record(row).value(
-                'local_ip_address').toString()
-            local_port, _ok = self.model.record(row).value('local_port').toInt()
-            if not _ok:
-                local_port = None
-
+            # Get local IP address and port from the table for each row.
             server = http.FreeswitchConfigServer()
-            server.setSocketData(local_ip_address, local_port)
+            server.setSocketData(*self.getSocketData(row))
             server.startServer()
             self.servers.append(server)
+
+    def getSocketData(self, row):
+        local_ip_address = self.model.record(row).value(
+            'local_ip_address').toString()
+        local_port, _ok = self.model.record(row).value(
+            'local_port').toInt()
+        if not _ok:
+            local_port = None
+        return local_ip_address, local_port
     
-    def connectionEdit(self, index):
+    def connectionChange(self, index):
         """
         Restart config server on connection change if necessary.
         """        
@@ -233,18 +245,18 @@ class ConnectionController(BaseController):
             # Select the new row.
             connection_id, _ok = index.model().data(
                 index.sibling(index.row(), 0)).toInt()
-            #self.connection_id = connection_id
-            #if not self.model.rowCount():
-            #    self.add()
-        
 
+        # Apply new socket location.
+        self.servers[self.last_row].setSocketData(
+            *self.getSocketData(self.last_row))
+        
     def objectAdded(self, row, record):
         """
         New connection added.
         """
-        self.addServer(record.value('host'), record.value('port'))        
+        self.addServer()
         
-    def addServer(self, host, port):
+    def addServer(self, host=None, port=None):
         """
         Add a new config server.
         """
@@ -253,26 +265,15 @@ class ConnectionController(BaseController):
         server.startServer()
         self.servers.append(server)
 
+    def save(self):
+        super(ConnectionController, self).save()
+        self.view_list.selectRow(self.last_row)
+
 
 class ConnectionChangeListenerController(BaseController):
     """
     Mixin class for reacting on connection change.
     """
-    def getSignalsData(self):
-        """
-        Listen to connection change signal.
-        """
-        # Find connection controller in controller registry.
-        connection_controller = self.parent().controllers['connection']
-        
-        signals = [
-            (connection_controller.view_list.selectionModel(),
-             'currentRowChanged(QModelIndex,QModelIndex)',
-             self.connectionChange)]
-        signals.extend(super(
-            ConnectionChangeListenerController, self).getSignalsData())
-        return signals
-        
     def connectionChange(self, index):
         """
         Connection change handler.
index a7426a5..4de39d5 100644 (file)
@@ -35,10 +35,21 @@ class FreeswitchConfigServer(QtNetwork.QTcpServer):
     def setSocketData(self, host, port):
         """
         Set host and port for socket to listen on.
+
+        If the settings differ from previous values, server gets restarted.
         """
+        # Check if restart is needed before new settings are applied.
+        needs_restart = (host, port) != (self.host, self.port)
+
+        # Save new settings.
         self.host = host
         self.port = port
 
+        # Restart server if necessary.
+        if needs_restart:
+            print 'restartin', self.host, self.port
+            self.restartServer()
+
     def startServer(self):
         """
         Start listening on our socket.