Foreign keys are working in object display views
authorStas Shtin <antisvin@gmail.com>
Tue, 13 Apr 2010 13:37:04 +0000 (17:37 +0400)
committerStas Shtin <antisvin@gmail.com>
Tue, 13 Apr 2010 13:37:04 +0000 (17:37 +0400)
src/ipypbx/controllers.py
src/ipypbx/main.py

index 6f7f173..132b7db 100644 (file)
@@ -30,6 +30,8 @@ class BaseController(QtCore.QObject):
     view_display_fields = ()
     view_display_fields_hidden = 'ID', 'Connection ID'
     is_bound_to_connection = True
+    relations = ()
+    delegate = None
     
     def __init__(self, model=None, view_list=None, view_display=None, parent=None, views=None):
         super(BaseController, self).__init__(parent=parent)
@@ -48,7 +50,7 @@ class BaseController(QtCore.QObject):
             self.model = model
         # Otherwise initialize a new model.
         else:
-            self.model = QtSql.QSqlTableModel(parent)
+            self.model = QtSql.QSqlRelationalTableModel(parent)
             self.model.setTable('ipypbxweb_%s' % self.basename.lower())
             self.model.setEditStrategy(self.model.OnRowChange)
 
@@ -93,6 +95,8 @@ class BaseController(QtCore.QObject):
         else:
             self.view_display = QtGui.QDataWidgetMapper(parent)
             self.view_display.setModel(self.model)
+            if self.delegate:
+                self.view_display.setItemDelegate(QtSql.QSqlRelationalDelegate(self))
 
             display_fields = self.getDisplayFields()
             
@@ -101,6 +105,26 @@ class BaseController(QtCore.QObject):
                     field_widget = self.getFieldWidget(field)
                     self.view_display.addMapping(field_widget, i)
 
+        # Set relations for model & view display.
+        if self.relations:
+            self.delegate = QtSql.QSqlRelationalDelegate(self)
+            self.view_display.setItemDelegate(self.delegate)
+
+            for data in self.relations:
+                column, name, table, display = data                
+                column_id = self.model.fieldIndex(column)
+
+                # SetRelation screws table data filtering?
+#                self.model.setRelation(
+#                    column_id,
+#                    QtSql.QSqlRelation('ipypbxweb_%s' % table, 'id', display))
+
+#                rel = self.model.relationModel(column_id)
+
+                widget = self.getFieldWidget(name)
+                widget.setModel(self.parent().controllers[table].model)
+                widget.setItemDelegate(self.delegate)
+
         # Select first row in the view list.
         self.view_display.toFirst()
         
@@ -194,7 +218,7 @@ class ConnectionChangeListenerController(BaseController):
         """
         Listen to connection change signal.
         """
-        connection_controller = self.parent().controllers[0]
+        connection_controller = self.parent().controllers['connection']
 
         signals = [
             (connection_controller.view_list.selectionModel(),
@@ -218,6 +242,7 @@ class ConnectionChangeListenerController(BaseController):
                 index.sibling(index.row(), 0)).toInt()
             self.connection_id = connection_id
             self.model.setFilter('connection_id = %i' % connection_id)
+            self.model.index(0, 0)
 
     def setConnectionId(self, row, record):
         record.setValue('connection_id', self.connection_id)
@@ -252,8 +277,9 @@ class DomainController(ConnectionChangeListenerController):
         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', 'Host Name'
-
+    view_list_fields = 'SIP Profile ID', 'Host Name'
+    relations = (('sip_profile_id', 'SIP Profile ID', 'sipprofile', 'Name'),)
+    
 
 class GatewayController(ConnectionChangeListenerController):
     """
@@ -273,7 +299,8 @@ class GatewayController(ConnectionChangeListenerController):
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Caller ID In From Field'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Is Active'))
     view_list_fields = 'SIP Profile ID', 'Name'
-
+    relations = (('sip_profile_id', 'SIP Profile ID', 'sipprofile', 'Name'),)
+    
 
 class EndpointController(ConnectionChangeListenerController):
     """
@@ -287,6 +314,7 @@ class EndpointController(ConnectionChangeListenerController):
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Domain ID'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Is Active'))
     view_list_fields = 'User ID', 'Domain ID'
+    relations = (('domain_id', 'Domain ID', 'domain', 'Host Name'),)
     
 
 class ExtensionController(ConnectionChangeListenerController):
@@ -303,4 +331,5 @@ class ExtensionController(ConnectionChangeListenerController):
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Authenticate Calls'),
         QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Is Active'))
     view_list_fields = 'Destination Match',
+    relations = (('domain_id', 'Domain ID', 'domain', 'Host Name'),)
         
index c847ad4..7d25b49 100644 (file)
@@ -67,37 +67,42 @@ def setupDb(prefix=PREFIX, dbname=DB_NAME):
 if __name__ == '__main__':
     app = QtGui.QApplication(sys.argv)
 
+    # Localize UI.
     locale = QtCore.QLocale.system().name()
     translator = QtCore.QTranslator()
     
     if translator.load("ipypbx_%s" % locale.toLower(), "ipypbx/locale"):
         QtGui.QApplication.installTranslator(translator)
 
+    # Initialize main window.
     setupDb()
     main = QtGui.QMainWindow()
     views = ui.Ui_MainWindow()
     views.setupUi(main)
     main.show()
 
-    main.controllers = []
+    # Setup controllers.
+    main.controllers = {}
     for basename in ('Connection', 'SipProfile', 'Domain', 'Gateway',
                      'Endpoint', 'Extension'):
-        main.controllers.append(getattr(
+        main.controllers[basename.lower()] = getattr(
             controllers, basename + 'Controller'
-            )(parent=main, views=views))
+            )(parent=main, views=views)
 
-    connection_model = main.controllers[0].model
+    # Select first row.
+    connection_model = main.controllers['connection'].model
     connection_index = connection_model.index(0, 0)
+
+    # Get first row index.
     first_row_id, ok = connection_model.data(
         connection_index.sibling(0, 0)).toInt()
-
-    if ok:        
+    if ok:
+        # We have to explicitly emit row selection signal since previous state
+        # was unselected.
         QtCore.QObject.emit(
-            main.controllers[0].view_list.selectionModel(),
+            main.controllers['connection'].view_list.selectionModel(),
             QtCore.SIGNAL('currentRowChanged(QModelIndex, QModelIndex)'),
             connection_index, connection_index)
-    
-
 
     sys.exit(app.exec_())