Add/edit all tables. Data gets save to DB at last\!
authorStas Shtin <antisvin@gmail.com>
Mon, 12 Apr 2010 20:39:51 +0000 (00:39 +0400)
committerStas Shtin <antisvin@gmail.com>
Mon, 12 Apr 2010 20:39:51 +0000 (00:39 +0400)
src/ipypbx/controllers.py
src/ipypbx/main.py

index de4674e..6f7f173 100644 (file)
@@ -50,6 +50,7 @@ class BaseController(QtCore.QObject):
         else:
             self.model = QtSql.QSqlTableModel(parent)
             self.model.setTable('ipypbxweb_%s' % self.basename.lower())
         else:
             self.model = QtSql.QSqlTableModel(parent)
             self.model.setTable('ipypbxweb_%s' % self.basename.lower())
+            self.model.setEditStrategy(self.model.OnRowChange)
 
             # Create model header from fields list.
             for i, field in enumerate(self.fields):
 
             # Create model header from fields list.
             for i, field in enumerate(self.fields):
@@ -93,11 +94,7 @@ class BaseController(QtCore.QObject):
             self.view_display = QtGui.QDataWidgetMapper(parent)
             self.view_display.setModel(self.model)
 
             self.view_display = QtGui.QDataWidgetMapper(parent)
             self.view_display.setModel(self.model)
 
-            # If view_display_fields is not send, display all fields except
-            # the first one that is usually the ID.
-            display_fields = [
-                field for field in self.fields if not field in
-                self.view_display_fields_hidden]
+            display_fields = self.getDisplayFields()
             
             for i, field in enumerate(self.fields):
                 if field in display_fields:
             
             for i, field in enumerate(self.fields):
                 if field in display_fields:
@@ -126,19 +123,29 @@ class BaseController(QtCore.QObject):
             self.basename + ''.join(word.capitalize()
                                     for word in field.split(' ')))
 
             self.basename + ''.join(word.capitalize()
                                     for word in field.split(' ')))
 
+    def getDisplayFields(self):
+        """
+        Return list of display fields.
+        
+        If view_display_fields is not send, display all fields except
+        the first one that is usually the ID.
+        """
+        return [
+            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.
     def getSignalsData(self):
         """
         Default signals built from controller's base name.
         """
         # Default signals handle row selection, Add and Save buttons.
-        return (
+        return [
             (getattr(self.views, self.basename + 'Add'), 'clicked()', self.add),
             (self.view_list.selectionModel(),
              'currentRowChanged(QModelIndex,QModelIndex)',
              self.view_display, 'setCurrentModelIndex(QModelIndex)'),
             (getattr(self.views, self.basename + 'Save'), 'clicked()',
             (getattr(self.views, self.basename + 'Add'), 'clicked()', self.add),
             (self.view_list.selectionModel(),
              'currentRowChanged(QModelIndex,QModelIndex)',
              self.view_display, 'setCurrentModelIndex(QModelIndex)'),
             (getattr(self.views, self.basename + 'Save'), 'clicked()',
-             self.save),
-            )
+             self.save)]
 
     def add(self):
         """
 
     def add(self):
         """
@@ -155,23 +162,15 @@ class BaseController(QtCore.QObject):
         # Focust to the first displayed field.
         self.getFieldWidget(self.getDisplayFields()[0]).setFocus()
 
         # Focust to the first displayed field.
         self.getFieldWidget(self.getDisplayFields()[0]).setFocus()
 
-        # Clear all displayed fields.
-        for field in self.getDisplayFields():
-            if hasattr(field, 'clear'):
-                self.getFieldWidget(field).clear()
-        
+        # TODO: set default values?
+
     def save(self):
         """
         Save to database.
         """
     def save(self):
         """
         Save to database.
         """
-        # For now we just submit everything - QT seems to be able to handle it
-        # on its own.
         self.view_display.submit()
         self.getFieldWidget('Add').setEnabled(True)
 
         self.view_display.submit()
         self.getFieldWidget('Add').setEnabled(True)
 
-    def update(self):
-        pass
-
 
 class ConnectionController(BaseController):
     """
 
 class ConnectionController(BaseController):
     """
@@ -185,16 +184,46 @@ class ConnectionController(BaseController):
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Freeswitch IP Address'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Freeswitch Port'))
     view_list_fields = 'Name', 'Freeswitch IP Address', 'Freeswitch Port'
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Freeswitch IP Address'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Freeswitch Port'))
     view_list_fields = 'Name', 'Freeswitch IP Address', 'Freeswitch Port'
-    
-    def clone(self):
+
+
+class ConnectionChangeListenerController(BaseController):
+    """
+    Mixin class for reacting on connection change.
+    """
+    def getSignalsData(self):
+        """
+        Listen to connection change signal.
+        """
+        connection_controller = self.parent().controllers[0]
+
+        signals = [
+            (connection_controller.view_list.selectionModel(),
+             'currentRowChanged(QModelIndex,QModelIndex)',
+             self.connectionChange),
+            (self.model, 'primeInsert(int,QSqlRecord&)',
+             self.setConnectionId)] 
+        signals.extend(super(
+            ConnectionChangeListenerController, self).getSignalsData())
+        return signals
+        
+    def connectionChange(self, index):
         """
         """
-        TODO: Clone an existing connection.
+        Connection change handler.
 
 
-        This creates a new connection with bound data copied from another one.
+        Filters table by a new connection ID and stores last connection ID
+        locally.
         """
         """
+        if index.row() != -1:
+            connection_id, ok = index.model().data(
+                index.sibling(index.row(), 0)).toInt()
+            self.connection_id = connection_id
+            self.model.setFilter('connection_id = %i' % connection_id)
 
 
-    
-class SipProfileController(BaseController):
+    def setConnectionId(self, row, record):
+        record.setValue('connection_id', self.connection_id)
+
+        
+class SipProfileController(ConnectionChangeListenerController):
     """
     SIP Profile controller.
     """
     """
     SIP Profile controller.
     """
@@ -213,7 +242,7 @@ class SipProfileController(BaseController):
     view_list_fields = 'Name', 'SIP IP', 'SIP Port'
     
 
     view_list_fields = 'Name', 'SIP IP', 'SIP Port'
     
 
-class DomainController(BaseController):
+class DomainController(ConnectionChangeListenerController):
     """
     Domain controller.
     """
     """
     Domain controller.
     """
@@ -223,10 +252,10 @@ class DomainController(BaseController):
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'SIP Profile ID'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Host Name'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Is Active'))
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'SIP Profile ID'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Host Name'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Is Active'))
-    view_list_fields = 'SIP Profile ID', 'Host Name', 'Is Active'
+    view_list_fields = 'SIP Profile', 'Host Name'
 
 
 
 
-class GatewayController(BaseController):
+class GatewayController(ConnectionChangeListenerController):
     """
     Gateway controller.
     """
     """
     Gateway controller.
     """
@@ -246,7 +275,7 @@ class GatewayController(BaseController):
     view_list_fields = 'SIP Profile ID', 'Name'
 
 
     view_list_fields = 'SIP Profile ID', 'Name'
 
 
-class EndpointController(BaseController):
+class EndpointController(ConnectionChangeListenerController):
     """
     Endpoint controller.
     """
     """
     Endpoint controller.
     """
@@ -257,10 +286,10 @@ class EndpointController(BaseController):
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Password'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Domain ID'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Is Active'))
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Password'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Domain ID'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Is Active'))
-    view_list_fields = 'User ID', 'Password', 'Domain ID'
+    view_list_fields = 'User ID', 'Domain ID'
     
 
     
 
-class ExtensionController(BaseController):
+class ExtensionController(ConnectionChangeListenerController):
     """
     Extension controller.
     """
     """
     Extension controller.
     """
@@ -273,5 +302,5 @@ class ExtensionController(BaseController):
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Endpoint ID'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Authenticate Calls'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Is Active'))
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Endpoint ID'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Authenticate Calls'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Is Active'))
-    view_list_fields = 'Destination Match', 'Domain ID', 'Endpoint ID'
+    view_list_fields = 'Destination Match',
         
         
index a99a34d..c847ad4 100644 (file)
@@ -79,11 +79,25 @@ if __name__ == '__main__':
     views.setupUi(main)
     main.show()
 
     views.setupUi(main)
     main.show()
 
-    for controllerClass in (
-        controllers.ConnectionController, controllers.SipProfileController,
-        controllers.DomainController, controllers.GatewayController,
-        controllers.EndpointController, controllers.ExtensionController):
-        controllerClass(parent=main, views=views)
+    main.controllers = []
+    for basename in ('Connection', 'SipProfile', 'Domain', 'Gateway',
+                     'Endpoint', 'Extension'):
+        main.controllers.append(getattr(
+            controllers, basename + 'Controller'
+            )(parent=main, views=views))
+
+    connection_model = main.controllers[0].model
+    connection_index = connection_model.index(0, 0)
+    first_row_id, ok = connection_model.data(
+        connection_index.sibling(0, 0)).toInt()
+
+    if ok:        
+        QtCore.QObject.emit(
+            main.controllers[0].view_list.selectionModel(),
+            QtCore.SIGNAL('currentRowChanged(QModelIndex, QModelIndex)'),
+            connection_index, connection_index)
+    
+
 
     sys.exit(app.exec_())
 
 
     sys.exit(app.exec_())