class CRBServiceComboBoxPopup(QtGui.QFrame, Ui_RBServiceComboBoxPopup): __pyqtSignals__ = ('serviceSelected(int)', ) def __init__(self, parent): QtGui.QFrame.__init__(self, parent, Qt.Popup) self.setupUi(self) self._parent = parent self._model = parent._model self._selectionModel = CRBSelectionModel(self._model) self.tblService.setModel(self._model) self._addNone = True self._staticFilter = None self._order = '' self.id = None self._filter = '' self.tblService.setSelectionModel(self._selectionModel) self.cmbSection.setTable('rbServiceSection') self.cmbSection.setFilter(order='id') self.cmbType.setTable('rbServiceType') self.cmbClass.setTable('rbServiceClass') self.table = QtGui.qApp.db.table('rbService') self.edtBegDate.canBeEmpty(True) self.edtEndDate.canBeEmpty(True) self.edtCode.setFocus(Qt.ShortcutFocusReason) self.resetEdits() self.cmbSection.installEventFilter(self) self.cmbType.installEventFilter(self) self.cmbClass.installEventFilter(self) self.edtCode.installEventFilter(self) self.edtName.installEventFilter(self) self.edtBegDate.installEventFilter(self) self.edtEndDate.installEventFilter(self) self.tblServiceSettings() self.updateTypesClasses() self.chkIsFilterServiceByCurrentCode.setVisible( False ) # Логика проверки кода изменена, данный чекбокс более не применим. Если не будет отката - удалить совсем после середины 2015 года. def tblServiceSettings(self): pass def setTableFocus(self): self.tblService.setFocus() def resetEdits(self): self.cmbSection.setValue(0) self.cmbType.setValue(0) self.cmbClass.setValue(0) self.edtCode.setText('') self.edtName.setText('') self.chkEIS.setCheckState(Qt.PartiallyChecked) self.chkNomenclature.setCheckState(Qt.PartiallyChecked) self.edtBegDate.setDate(QDate()) self.edtEndDate.setDate(QDate()) def hideColumn(self, index): self.tblService.hideColumn(index) def show(self): scrollBar = self.tblService.horizontalScrollBar() scrollBar.setValue(0) QtGui.QFrame.show(self) def rowCount(self, index=None): return self._model.rowCount() def searchCodeEx(self, searchString): return self._model.searchCodeEx(searchString) def setCurrentIndex(self, rowIndex): index = self._model.index(rowIndex, 0) self.tblService.setCurrentIndex(index) def currentIndex(self): return self.tblService.currentIndex() def setSelectionCurrentIndex(self, index, selectionFlags): self._selectionModel.setCurrentIndex(index, selectionFlags) def model(self): return self.tblService.model() def setViewFocus(self): self.tblService.setFocus() def view(self): return self.tblService def loadData(self, addNone=True, filter='', order=None): self._addNone = addNone self._filter = filter self._order = order self._model.loadData(addNone, filter, order) def setFilter(self, filter='', order=None): self._filter = filter self._order = order self.loadData(self._addNone, filter, order) def reloadData(self): self._model.loadData(self._addNone, self._filter, self._order) def setModel(self, model): self._model = model self.tblService.setModel(model) def on_buttonBox_apply(self): table = self.table db = QtGui.qApp.db cond = [] properties = {} properties['section'] = forceRef(self.cmbSection.value()) properties['type'] = forceRef(self.cmbType.value()) properties['class'] = forceRef(self.cmbClass.value()) properties['code'] = forceStringEx(self.edtCode.text()) properties['name'] = forceStringEx(self.edtName.text()) properties['EIS'] = self.chkEIS.checkState() properties['nomenclature'] = self.chkNomenclature.checkState() properties['begDate'] = forceDate(self.edtBegDate.date()) properties['endDate'] = forceDate(self.edtEndDate.date()) section = properties.get('section', 0) if section: cond.append("""(select code from rbServiceSection where id = %s) = left(rbService.code, 1)""" % section) type = properties.get('type', 0) if type: cond.append("""(select code from rbServiceType where id = %s) = substr(rbService.code from 2 for 2)""" % type) class_ = properties.get('class', 0) if class_: cond.append("""rbService.code like concat("___.", (select code from rbServiceClass where id = %s), "%%") """ % class_) code = properties.get('code', '') if code: cond.append(table['code'].like(addDots(code))) name = properties.get('name', '') if name: cond.append(table['name'].like(addDotsEx(name))) flagEIS = properties.get('EIS', Qt.PartiallyChecked) if flagEIS != Qt.PartiallyChecked: cond.append(table['eisLegacy'].eq( \ flagEIS != Qt.Unchecked)) flagNomenclature = properties.get('nomenclature', Qt.PartiallyChecked) if flagNomenclature != Qt.PartiallyChecked: cond.append(table['nomenclatureLegacy'].eq( \ flagNomenclature!= Qt.Unchecked)) begDate = properties.get('begDate', QDate()) if not begDate.isNull(): cond.append(table['begDate'].dateGe(begDate)) endDate = properties.get('endDate', QDate()) if not endDate.isNull(): cond.append(table['endDate'].dateLe(endDate)) f = db.joinAnd(cond) self.setFilter(f) if self.rowCount(): self.tabWidget.setCurrentIndex(0) def on_buttonBox_reset(self): self.resetEdits() self.setFilter('') def selectItemByIndex(self, index): row = index.row() self.emit(SIGNAL('serviceSelected(int)'), row) self.hide() def callWithIdSave(self, func): rowIndex = self.currentIndex().row() id = self._model.getId(rowIndex) func() self.id = id rowIndex = self._model.searchId(id) if rowIndex > -1 and rowIndex < self._model.rowCount(): self.emit(SIGNAL('serviceSelected(int)'), rowIndex) @pyqtSlot(QtGui.QAbstractButton) def on_buttonBox_clicked(self, button): rowIndex = self.currentIndex().row() id = self._model.getId(rowIndex) if not self.id: self.id = id buttonCode = self.buttonBox.standardButton(button) if buttonCode == QtGui.QDialogButtonBox.Apply or button == 'enter': self.on_buttonBox_apply() rowIndex = self._model.searchId(id) self.id = id elif buttonCode == QtGui.QDialogButtonBox.Reset: self.on_buttonBox_reset() rowIndex = self._model.searchId(self.id) if rowIndex > -1 and rowIndex < self._model.rowCount(): self.emit(SIGNAL('serviceSelected(int)'), rowIndex) @pyqtSlot(QModelIndex) def on_tblService_clicked(self, index): self.selectItemByIndex(index) def updateTypesClasses(self): code = self.cmbSection.code() if code and code != "0": self.edtCode.setText(code) self.cmbType.setEnabled(True) self.cmbType.setFilter('section="%s"' % code) if code in (u'А', u'В'): self.cmbClass.setEnabled(True) self.cmbClass.setFilter('section="%s"' % code) else: self.cmbClass.setEnabled(False) else: self.cmbType.setValue(0) self.cmbType.setEnabled(False) self.cmbClass.setValue(0) self.cmbClass.setEnabled(False) @pyqtSlot(int) def on_cmbSection_currentIndexChanged(self, val): self.updateTypesClasses() def eventFilter(self, obj, event): if event.type() == QEvent.KeyPress: key = event.key() if key in [Qt.Key_Return, Qt.Key_Enter, Qt.Key_E, Qt.Key_G]: if key == Qt.Key_E: obj.keyPressEvent(event) if key in [Qt.Key_Return, Qt.Key_Enter]: return False self.keyPressEvent(event) return False if key == Qt.Key_Tab: self.focusNextPrevChild(True) return True return False def keyPressEvent(self, event): if event.key() in [Qt.Key_Return, Qt.Key_Enter]: if self.tabWidget.currentIndex(): self.callWithIdSave(self.on_buttonBox_applied) else: index = self.tblService.selectedIndexes() if index: self.selectItemByIndex(index[0]) if (event.modifiers() == Qt.ControlModifier and event.key() == Qt.Key_E): self.tabWidget.setCurrentIndex(0) if (event.modifiers() == Qt.ControlModifier and event.key() == Qt.Key_G): self.tabWidget.setCurrentIndex(1) QtGui.QFrame.keyPressEvent(self, event)
class CQuotaTypeComboBoxPopup(QtGui.QFrame, Ui_RBQuotaTypeComboBoxPopup): __pyqtSignals__ = ('quotaTypeSelected(int)', ) quotaTypeClassList = None def __init__(self, parent, tableName=''): QtGui.QFrame.__init__(self, parent, QtCore.Qt.Popup) self._mapClassName2Class = {} self._clientId = None self.clientBegDate = None self.clientEegDate = None self._addNone = True self._tableName = tableName self._filier = '' self._order = '' self.id = None self.table = QtGui.qApp.db.table('QuotaType') self.setupUi(self) self._applyQuotaTypeClassCombobox() self._model = parent._model self._selectionModel = CRBSelectionModel(self._model) self.tblQuotaType.setModel(self._model) self.tblQuotaType.setSelectionModel(self._selectionModel) self.edtDate.setDate(QtCore.QDate().currentDate()) self.buttonBox.button(QtGui.QDialogButtonBox.Apply).setShortcut( QtCore.Qt.Key_Return) def _applyQuotaTypeClassCombobox(self): for name, _class in getQuotaTypeClassItemsByExists(): self._mapClassName2Class[name] = _class self.cmbVTMPClass.addItem(name) def setBegDate(self, date): self.clientBegDate = date def setEndDate(self, date): self.clientEndDate = date def setClientId(self, clientId): self._clientId = clientId self.setTable(self._tableName) def hideColumn(self, index): self.tblQuotaType.hideColumn(index) def rowCount(self, index): return self._model.rowCount() def searchCodeEx(self, searchString): return self._model.searchCodeEx(self._searchString) def setCurrentIndex(self, rowIndex): index = self._model.index(rowIndex, 1) self.tblQuotaType.setCurrentIndex(index) def currentIndex(self): return self.tblQuotaType.currentIndex() def setSelectionCurrentIndex(self, index, selectionFlags): self._selectionModel.setCurrentIndex(index, selectionFlags) def model(self): return self.tblQuotaType.model() def setViewFocus(self): self.tblQuotaType.setFocus() def view(self): return self.tblQuotaType def setTable(self, tableName, addNone=True, filter='', order=None): self._tableName = tableName self._addNone = addNone self._filier = filter self._order = order cond = [self.table['isObsolete'].eq(0)] db = QtGui.qApp.db if self._clientId: condClient = [] tableClientQuoting = db.table('Client_Quoting') tableQuotaType = db.table('QuotaType') queryTable = tableClientQuoting.innerJoin( tableQuotaType, tableQuotaType['id'].eq(tableClientQuoting['quotaType_id'])) condClient = [tableClientQuoting['deleted'].eq(0)] condClient.append(tableClientQuoting['master_id'].eq( self._clientId)) if self.clientEndDate.isValid(): condClient.append( tableClientQuoting['dateRegistration'].dateLe( self.clientEndDate)) if self.clientBegDate.isValid(): condClient.append( db.joinOr([ tableClientQuoting['dateEnd'].dateGe( self.clientBegDate), tableClientQuoting['dateEnd'].dateGe( self.clientBegDate), 'DATE(' + tableClientQuoting['dateEnd'].name() + ')=' + 'DATE(0000-00-00)' ])) idList = db.getIdList(queryTable, 'QuotaType.id', condClient) idList += self.getChildrenIdList(idList) cond.append(self.table['id'].inlist(idList)) if self.chkVTMPClass.isChecked(): className = unicode(self.cmbVTMPClass.currentText()) if className: _class = self._mapClassName2Class[className] cond.append(self.table['class'].eq(_class)) if self.chkLimits.isChecked(): tableQuoting = db.table('Quoting') checkedDate = self.edtDate.date() c = [tableQuoting['beginDate'].le(checkedDate)] c.append(tableQuoting['endDate'].ge(checkedDate)) idList = db.getIdList(tableQuoting, 'quotaType_id', c) idList += self.getChildrenIdList(idList) index = self.cmbLimits.currentIndex() if index == 0: cond.append(self.table['id'].inlist(idList)) elif index == 1: cond.append(self.table['id'].notInlist(idList)) filter = db.joinAnd(cond) self._model.setTable(tableName, addNone, filter, order) def getChildrenIdList(self, idList): db = QtGui.qApp.db resume = [] for id in idList: code = forceString(db.translate(self.table, 'id', id, 'code')) cond = [self.table['group_code'].eq(code)] resume += db.getIdList(self.table, 'id', cond) if resume: resume += self.getChildrenIdList(resume) return resume def setFilter(self, filter='', order=None): self._filier = filter self._order = order self.setTable(self._tableName, self._addNone, filter, order) def reloadData(self): self._model.setTable(self._tableName, self._addNone, self._filier, self._order) def setModel(self, model): self._model = model self.tblQuotaType.setModel(model) def selectItemByIndex(self, index): row = index.row() self.emit(QtCore.SIGNAL('quotaTypeSelected(int)'), row) self.hide() def _resize(self): parent = self.parent() pos = parent.rect().bottomLeft() pos2 = parent.rect().topLeft() pos = parent.mapToGlobal(pos) pos2 = parent.mapToGlobal(pos2) size = self.sizeHint() hHeaderSize = 0 for column in [0, 1]: hHeaderSize += self.view().columnWidth(column) screen = QtGui.QApplication.desktop().availableGeometry(pos) width = max(size.width(), parent.width(), hHeaderSize) size.setWidth(width) pos.setX( max(min(pos.x(), screen.right() - size.width()), screen.left())) pos.setY( max(min(pos.y(), screen.bottom() - size.height()), screen.top())) self.move(pos) self.resize(size) self.view().resizeColumnToContents(0) scrollBar = self.view().horizontalScrollBar() scrollBar.setValue(0) def on_buttonBox_apply(self): self.setTable(self._tableName, self._addNone, self._filier, self._order) if self._model.rowCount() > 1: self.view().resizeColumnToContents(0) self.tabWidget.setCurrentIndex(0) def on_buttonBox_reset(self): self.chkVTMPClass.setChecked(True) self.chkLimits.setChecked(True) self.edtDate.setDate(QtCore.QDate().currentDate()) self.cmbVTMPClass.setCurrentIndex(0) self.cmbLimits.setCurrentIndex(0) self.cmbVTMPClass.setEnabled(True) self.cmbLimits.setEnabled(True) self.setTable(self._tableName, self._addNone, self._filier, self._order) @QtCore.pyqtSlot(QtGui.QAbstractButton) def on_buttonBox_clicked(self, button): buttonCode = self.buttonBox.standardButton(button) if buttonCode == QtGui.QDialogButtonBox.Apply or button == 'enter': self.on_buttonBox_apply() elif buttonCode == QtGui.QDialogButtonBox.Reset: self.on_buttonBox_reset() @QtCore.pyqtSlot(QtCore.QModelIndex) def on_tblQuotaType_clicked(self, index): self.selectItemByIndex(index)