From e87916d729756f67329e41c9963f3277de564a53 Mon Sep 17 00:00:00 2001 From: Stas Shtin Date: Tue, 13 Apr 2010 17:37:04 +0400 Subject: [PATCH] Foreign keys are working in object display views --- src/ipypbx/controllers.py | 39 ++++++++++++++++++++++++++++++++++----- src/ipypbx/main.py | 23 ++++++++++++++--------- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/src/ipypbx/controllers.py b/src/ipypbx/controllers.py index 6f7f173..132b7db 100644 --- a/src/ipypbx/controllers.py +++ b/src/ipypbx/controllers.py @@ -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'),) diff --git a/src/ipypbx/main.py b/src/ipypbx/main.py index c847ad4..7d25b49 100644 --- a/src/ipypbx/main.py +++ b/src/ipypbx/main.py @@ -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_()) -- 1.7.9.5