Adding support for DB access from unit tests
[ipypbx] / src / ipypbx / controllers.py
index c4e962e..316e329 100644 (file)
@@ -195,7 +195,9 @@ class BaseController(QtCore.QObject):
         """
         Save to database.
         """
+        index = self.view_list.currentIndex()
         self.view_display.submit()
+        self.view_list.setCurrentIndex(index)
         self.getFieldWidget('Add').setEnabled(True)
 
 
@@ -216,59 +218,63 @@ 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 for each row.
-            server = http.FreeswitchConfigServer()
+            server = http.FreeswitchConfigServer(self.parent(), )
             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()
+        """
+        Return socket data for given row number.
+        """
+        record = self.model.record(row)
+        
+        # Local IP address.
+        local_ip_address = record.value('local_ip_address').toString()
+
+        # Local port.
+        local_port, _ok = record.value('local_port').toInt()
         if not _ok:
             local_port = None
-        return local_ip_address, local_port
+
+        # Connection ID.
+        connection_id, _ok = record.value('id').toInt()
+        if not _ok:
+            connection_id = None
+        
+        return local_ip_address, local_port, connection_id
     
     def connectionChange(self, index):
         """
         Restart config server on connection change if necessary.
-        """        
+        """
         current_row = index.row()
         if current_row != -1:
-            self.last_row = current_row
             # Select the new row.
             connection_id, _ok = index.model().data(
-                index.sibling(index.row(), 0)).toInt()
+                index.sibling(current_row, 0)).toInt()
 
-        # Apply new socket location.
-        self.servers[self.last_row].setSocketData(
-            *self.getSocketData(self.last_row))
+            # Apply new socket location.
+            self.servers[current_row].setSocketData(
+                *self.getSocketData(current_row))
         
     def objectAdded(self, row, record):
         """
         New connection added.
         """
-        self.addServer()
+        self.addServer(*self.getSocketData(row))
         
-    def addServer(self, host=None, port=None):
+    def addServer(self, host=None, port=None, connection_id=None):
         """
         Add a new config server.
         """
-        server = http.FreeswitchConfigServer(self)
-        server.setSocketData(host, port)
+        server = http.FreeswitchConfigServer(self.model)
+        server.setSocketData(host, port, connection_id)
         server.startServer()
         self.servers.append(server)
 
-    def save(self):
-        super(ConnectionController, self).save()
-        self.view_list.selectRow(self.last_row)
-
 
 class ConnectionChangeListenerController(BaseController):
     """
@@ -281,17 +287,27 @@ class ConnectionChangeListenerController(BaseController):
         Filters table by a new connection ID and stores last connection ID
         locally.
         """
-        if index.row() != -1:
+        index_row = index.row()
+        if index_row != -1:
+            # Get connection_id field value.
             connection_id, _ok = index.model().data(
                 index.sibling(index.row(), 0)).toInt()
             self.connection_id = connection_id
-            self.model.setFilter(
-                'ipypbxweb_%s.connection_id = %i' %
-                (self.basename, connection_id))
+
+            # Filter is customizable in order to allow ugly hacks :-)
+            self.model.setFilter(self.getFilter(connection_id))
+
+            # Select first row.
             self.view_list.selectRow(0)
+
+            # Create a new object if none exist.
             if not self.model.rowCount():
                 self.add()
 
+    def getFilter(self, connection_id):
+        return 'ipypbxweb_%s.connection_id = %i' % (
+            self.basename, connection_id)        
+
     def objectAdded(self, row, record):
         """
         Set connection_id from currently selected connection.
@@ -383,12 +399,20 @@ class ExtensionController(ConnectionChangeListenerController):
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Authenticate Calls'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Is Active'))
     view_list_fields = 'Destination Match',
+    view_display_fields_hidden = 'ID', 'Connection ID', 'Endpoint ID'
     relations = (
         ('domain_id', 'Domain ID', 'domain', 'host_name'),
-        ('endpoint_id', 'Endpoint ID', 'endpoint', 'user_id'))
+#        ('endpoint_id', 'Endpoint ID', 'endpoint', 'user_id'),
+        )
         
     def objectAdded(self, row, record):
         record.setValue(
             'xml_dialplan', '<action application="echo" data=""/>')
         super(ExtensionController, self).objectAdded(row, record)
         
+    def getFilter(self, connection_id):
+        # Workaround for Qt bug:
+        # http://bugreports.qt.nokia.com/browse/QTBUG-8217 . Apparently they
+        # don't hurry to fix it.
+        return '1 = 1) or (ipypbxweb_%s.connection_id = %i' % (
+            self.basename, connection_id)