From: Stas Shtin Date: Mon, 12 Apr 2010 20:39:51 +0000 (+0400) Subject: Add/edit all tables. Data gets save to DB at last\! X-Git-Url: http://git.maemo.org/git/?p=ipypbx;a=commitdiff_plain;h=37a217cb0f8b14d42e77a8423f02b5d6dac145f3 Add/edit all tables. Data gets save to DB at last\! --- diff --git a/src/ipypbx/controllers.py b/src/ipypbx/controllers.py index de4674e..6f7f173 100644 --- a/src/ipypbx/controllers.py +++ b/src/ipypbx/controllers.py @@ -50,6 +50,7 @@ class BaseController(QtCore.QObject): 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): @@ -93,11 +94,7 @@ class BaseController(QtCore.QObject): 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: @@ -126,19 +123,29 @@ class BaseController(QtCore.QObject): 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. - 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()', - self.save), - ) + self.save)] def add(self): """ @@ -155,23 +162,15 @@ class BaseController(QtCore.QObject): # 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. """ - # 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) - def update(self): - pass - 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' - - 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. """ @@ -213,7 +242,7 @@ class SipProfileController(BaseController): view_list_fields = 'Name', 'SIP IP', 'SIP Port' -class DomainController(BaseController): +class DomainController(ConnectionChangeListenerController): """ 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')) - 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. """ @@ -246,7 +275,7 @@ class GatewayController(BaseController): view_list_fields = 'SIP Profile ID', 'Name' -class EndpointController(BaseController): +class EndpointController(ConnectionChangeListenerController): """ 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')) - view_list_fields = 'User ID', 'Password', 'Domain ID' + view_list_fields = 'User ID', 'Domain ID' -class ExtensionController(BaseController): +class ExtensionController(ConnectionChangeListenerController): """ 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')) - view_list_fields = 'Destination Match', 'Domain ID', 'Endpoint ID' + view_list_fields = 'Destination Match', diff --git a/src/ipypbx/main.py b/src/ipypbx/main.py index a99a34d..c847ad4 100644 --- a/src/ipypbx/main.py +++ b/src/ipypbx/main.py @@ -79,11 +79,25 @@ if __name__ == '__main__': 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_())