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):
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:
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):
"""
# 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):
"""
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.
"""
view_list_fields = 'Name', 'SIP IP', 'SIP Port'
-class DomainController(BaseController):
+class DomainController(ConnectionChangeListenerController):
"""
Domain controller.
"""
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.
"""
view_list_fields = 'SIP Profile ID', 'Name'
-class EndpointController(BaseController):
+class EndpointController(ConnectionChangeListenerController):
"""
Endpoint controller.
"""
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.
"""
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',
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_())