class CImportDialog(QtGui.QDialog): InitState = 0 ImportState = 1 def __init__(self, db, parent = None): super(CImportDialog, self).__init__(parent = parent) self._db = db self._pi = CProgressInformer(processEventsFlag=QtCore.QEventLoop.AllEvents) self._engine = CImportR85ERZCentralEngine(db, progressInformer=self._pi) self._engine.setUserConfirmationFunction(self.userConfirmation) self._loggerHandler = CLogHandler(self._engine.logger(), self) self._loggerHandler.setLevel(logging.INFO) self._currentState = self.InitState self.setupUi() self.onStateChanged() def setParams(self, params): if isinstance(params, dict): reqFileName = forceStringEx(getPref(params, 'reqFile', u'')) if os.path.isfile(reqFileName ): self.edtReqFileName.setText(reqFileName ) respFileName = forceStringEx(getPref(params, 'respFile', u'')) if os.path.isfile(respFileName): self.edtRespFileName.setText(respFileName) def engine(self): return self._engine def params(self): params = {} setPref(params, 'reqFile', forceStringEx(self.edtReqFileName.text())) setPref(params, 'respFile', forceStringEx(self.edtRespFileName.text())) return params @property def currentState(self): return self._currentState @currentState.setter def currentState(self, value): if value in [self.InitState, self.ImportState]: self._currentState = value self.onStateChanged() def onStateChanged(self): self.btnNextAction.setText(self._actionNames.get(self.currentState, u'<Error>')) self.btnClose.setEnabled(self.currentState != self.ImportState) self.gbInit.setEnabled(self.currentState == self.InitState) self.gbImport.setEnabled(self.currentState == self.ImportState) # self.btnSave.setEnabled(bool(self._engine.documents)) QtCore.QCoreApplication.processEvents() # noinspection PyAttributeOutsideInit,PyUnresolvedReferences def setupUi(self): layout = QtGui.QVBoxLayout() # init block self.gbInit = QtGui.QGroupBox() gbLayout = QtGui.QVBoxLayout() lineLayout = QtGui.QHBoxLayout() self.edtReqFileName = QtGui.QLineEdit() self.edtReqFileName.setReadOnly(True) lineLayout.addWidget(self.edtReqFileName) self.btnBrowseReqFile = QtGui.QToolButton() self.btnBrowseReqFile.clicked.connect(self.onBrowseReqFileClicked) lineLayout.addWidget(self.btnBrowseReqFile) gbLayout.addLayout(lineLayout) lineLayout = QtGui.QHBoxLayout() self.edtRespFileName = QtGui.QLineEdit() self.edtRespFileName.setReadOnly(True) lineLayout.addWidget(self.edtRespFileName) self.btnBrowseRespFile = QtGui.QToolButton() self.btnBrowseRespFile.clicked.connect(self.onBrowseRespFileClicked) lineLayout.addWidget(self.btnBrowseRespFile) gbLayout.addLayout(lineLayout) self.gbInit.setLayout(gbLayout) layout.addWidget(self.gbInit) # import block self.gbImport = QtGui.QGroupBox() gbLayout = QtGui.QVBoxLayout() self.progressBar = CProgressBar() self.progressBar.setAlignment(QtCore.Qt.AlignCenter) self.progressBar.setRange(0, 0) self.progressBar.setProgressFormat(u'(%v/%m)') self._pi.progressChanged.connect(self.progressBar.setProgress) gbLayout.addWidget(self.progressBar) self.gbImport.setLayout(gbLayout) layout.addWidget(self.gbImport) # log block self.logInfo = QtGui.QTextEdit() layout.addWidget(self.logInfo) self._loggerHandler.logged.connect(self.logInfo.append) # buttons block subLayout = QtGui.QHBoxLayout() self.btnNextAction = QtGui.QPushButton() # noinspection PyUnresolvedReferences self.btnNextAction.clicked.connect(self.onNextActionClicked) subLayout.addStretch() subLayout.addWidget(self.btnNextAction) self.btnClose = QtGui.QPushButton() self.btnClose.clicked.connect(self.onCloseClicked) subLayout.addWidget(self.btnClose) layout.addLayout(subLayout) self.setLayout(layout) self.setMinimumWidth(512) self.retranslateUi() # noinspection PyAttributeOutsideInit def retranslateUi(self): context = unicode(getClassName(self)) self.setWindowTitle(forceTr(u'Импорт. Крым. ЦС ЕРЗ.', context)) self.gbInit.setTitle(forceTr(u'Параметры импорта', context)) self.gbImport.setTitle(forceTr(u'Импорт', context)) self._actionNames = {self.InitState: forceTr(u'Импорт',context), self.ImportState: forceTr(u'Прервать', context)} self.btnClose.setText(forceTr(u'Закрыть', context)) def userConfirmation(self, title, message): # noinspection PyTypeChecker,PyCallByClass return QtGui.QMessageBox.Yes == QtGui.QMessageBox.question(self, title, message, QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No) @QtCore.pyqtSlot() def onNextActionClicked(self): if self.currentState == self.InitState: self.currentState = self.ImportState try: self._engine.process(forceStringEx(self.edtReqFileName.text()), forceStringEx(self.edtRespFileName.text())) except Exception, e: self.currentState = self.InitState raise self.currentState = self.InitState elif self.currentState == self.ImportState: self._engine.abort() self.currentState = self.InitState
class CExportDialog(QtGui.QDialog): InitState = 0 ExportState = 1 SaveState = 2 def __init__(self, db, parent=None): QtGui.QDialog.__init__(self, parent) self.db = db self.pi = CProgressInformer( processEventsFlag=QtCore.QEventLoop.AllEvents) self.currentState = self.InitState self.setupUi() self.engine = CExportR23AttachClientMIACEngine( self.db, self.cmbOrgStructure.value(), self.edtDate.date(), progressInformer=self.pi) self.loggerHandler = CLogHandler(self.engine.getLogger(), self) self.btnMiac.setChecked(True) self.onStateChange() def onStateChange(self): self.btnNextAction.setText( self.actionNames.get(self.currentState, u'<Error>')) self.btnClose.setEnabled(self.currentState != self.ExportState) self.grInit.setEnabled(self.currentState == self.InitState) self.grExport.setEnabled(self.currentState == self.ExportState) self.grSave.setEnabled(self.currentState == self.SaveState) self.btnSave.setEnabled(bool(self.engine.documents)) QtCore.QCoreApplication.processEvents() def setupUi(self): layout = QtGui.QVBoxLayout() self.grInit = QtGui.QGroupBox() grLayout = QtGui.QVBoxLayout() orgStructureLayout = QtGui.QHBoxLayout() self.lblOrgStructure = QtGui.QLabel() orgStructureLayout.addWidget(self.lblOrgStructure) self.cmbOrgStructure = COrgStructureComboBox(None) orgStructureLayout.addWidget(self.cmbOrgStructure) grLayout.addLayout(orgStructureLayout) dateLayout = QtGui.QHBoxLayout() self.lblDate = QtGui.QLabel() dateLayout.addWidget(self.lblDate) self.edtDate = CDateEdit() dateLayout.addWidget(self.edtDate) grLayout.addLayout(dateLayout) modeExportLayout = QtGui.QHBoxLayout() self.btnMiac = QtGui.QRadioButton() modeExportLayout.addWidget(self.btnMiac) self.btnSMO = QtGui.QRadioButton() modeExportLayout.addWidget(self.btnSMO) grLayout.addLayout(modeExportLayout) self.grInit.setLayout(grLayout) layout.addWidget(self.grInit) self.grExport = QtGui.QGroupBox() grLayout = QtGui.QVBoxLayout() self.progressBar = CProgressBar() self.progressBar.setAlignment(QtCore.Qt.AlignCenter) self.progressBar.setRange(0, 0) self.progressBar.setProgressFormat(u'(%v/%m)') self.pi.progressChanged.connect(self.progressBar.setProgress) grLayout.addWidget(self.progressBar) self.grExport.setLayout(grLayout) layout.addWidget(self.grExport) self.grSave = QtGui.QGroupBox() grLayout = QtGui.QVBoxLayout() lineLayout = QtGui.QHBoxLayout() self.edtSaveDir = QtGui.QLineEdit(QtCore.QDir.homePath()) self.edtSaveDir.setReadOnly(True) lineLayout.addWidget(self.edtSaveDir) self.btnBrowseDir = QtGui.QToolButton() self.btnBrowseDir.clicked.connect(self.onBrowseDir) lineLayout.addWidget(self.btnBrowseDir) grLayout.addLayout(lineLayout) lineLayout = QtGui.QHBoxLayout() self.btnSave = QtGui.QPushButton() self.btnSave.clicked.connect(self.onSaveClicked) lineLayout.addWidget(self.btnSave) grLayout.addLayout(lineLayout) self.grSave.setLayout(grLayout) layout.addWidget(self.grSave) self.logInfo = QtGui.QTextEdit() layout.addWidget(self.logInfo) # self.loggerHandler.logged.connect(self.logInfo.append) subLayout = QtGui.QHBoxLayout() self.btnNextAction = QtGui.QPushButton() self.btnNextAction.clicked.connect(self.onNextActionClicked) subLayout.addStretch() subLayout.addWidget(self.btnNextAction) self.btnClose = QtGui.QPushButton() self.btnClose.clicked.connect(self.onCloseClicked) subLayout.addWidget(self.btnClose) layout.addLayout(subLayout) self.setLayout(layout) self.setMinimumWidth(512) self.retranselateUi() def retranselateUi(self): context = unicode(getClassName(self)) self.setWindowTitle( forceTr(u'Экспорт прикрипленного населения. Краснодарский край', context)) self.grInit.setTitle(forceTr(u'Параметры экспорта', context)) self.lblOrgStructure.setText(forceTr(u'Подразделение', context)) self.btnMiac.setText(forceTr(u'Экспорт МИАЦ', context)) self.btnSMO.setText(forceTr(u'Экспорт СМО', context)) self.lblDate.setText(forceTr(u'Отчетная дата', context)) self.grExport.setTitle(forceTr(u'Экспотр', context)) self.grSave.setTitle(forceTr(u'Сохранение результата', context)) self.btnSave.setText(forceTr(u'Сохранить', context)) self.actionNames = { self.InitState: forceTr(u'Экспорт', context), self.ExportState: forceTr(u'Прервать', context), self.SaveState: forceTr(u'Повторить', context) } self.btnClose.setText(forceTr(u'Закрыть', context)) @QtCore.pyqtSlot() def onNextActionClicked(self): if self.currentState == self.InitState: self.currentState = self.ExportState try: result = self.engine.process() except: self.currentState = self.InitState raise self.currentState = self.SaveState if result else self.InitState elif self.currentState == self.ExportState: self.engine.terminate() elif self.currentState == self.SaveState: self.currentState = self.InitState self.onStateChange() def canClose(self): return not ((self.engine.documents) or QtGui.QMessageBox.warning( self, u'Внимание!', u'Остались несохраненные файлы выгрузок\n' u'которые будут утеряны.\n' u'Вы уверены, что хотите покинуть менеджер экспорта?\n', QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes) def closeEvent(self, event): if self.canClose(): event.accept() else: event.ignore() def done(self, result): if self.canClose(): super(CExportDialog, self).done(result) @QtCore.pyqtSlot() def onCloseClicked(self): self.accept() @QtCore.pyqtSlot() def onBrowseDir(self): saveDir = forceStringEx( QtGui.QFileDialog.getExistingDirectory( self, u'Укажите директорию для сохранения файлов выгрузки', self.edtSaveDir.text())) if os.path.isdir(saveDir): self.edtSaveDir.setText(saveDir) @QtCore.pyqtSlot() def onSaveClicked(self): self.btnClose.setEnabled(False) self.engine.save(self.edtSaveDir.text()) self.onStateChange() @QtCore.pyqtSlot(bool) def on_btnMiac_toggled(self, checked): if not checked: self.engine = CExportR23AttachClientSMOEngine( self.db, self.cmbOrgStructure.value(), self.edtDate.date(), progressInformer=self.pi) self.loggerHandler = CLogHandler(self.engine.logger(), self) else: self.engine = CExportR23AttachClientMIACEngine( self.db, self.cmbOrgStructure.value(), self.edtDate.date(), progressInformer=self.pi) self.loggerHandler = CLogHandler(self.engine.logger(), self)
class Ui_ExportToDbfDialog(object): def setupUi(self, ExportToDbfDialog): ExportToDbfDialog.setObjectName(_fromUtf8("ExportToDbfDialog")) ExportToDbfDialog.resize(495, 504) self.gridLayout = QtGui.QGridLayout(ExportToDbfDialog) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.pbFiles = CProgressBar(ExportToDbfDialog) self.pbFiles.setProperty("value", 0) self.pbFiles.setAlignment(QtCore.Qt.AlignCenter) self.pbFiles.setTextVisible(True) self.pbFiles.setTextDirection(QtGui.QProgressBar.TopToBottom) self.pbFiles.setObjectName(_fromUtf8("pbFiles")) self.gridLayout.addWidget(self.pbFiles, 0, 1, 1, 1) self.tabWidget = QtGui.QTabWidget(ExportToDbfDialog) self.tabWidget.setObjectName(_fromUtf8("tabWidget")) self.tabParameters = QtGui.QWidget() self.tabParameters.setObjectName(_fromUtf8("tabParameters")) self.gridLayout_4 = QtGui.QGridLayout(self.tabParameters) self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4")) self.grpOutFileName = QtGui.QGroupBox(self.tabParameters) self.grpOutFileName.setObjectName(_fromUtf8("grpOutFileName")) self.horizontalLayout = QtGui.QHBoxLayout(self.grpOutFileName) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.edtOutPath = QtGui.QLineEdit(self.grpOutFileName) self.edtOutPath.setEnabled(True) self.edtOutPath.setReadOnly(True) self.edtOutPath.setObjectName(_fromUtf8("edtOutPath")) self.horizontalLayout.addWidget(self.edtOutPath) self.btnBrowse = QtGui.QPushButton(self.grpOutFileName) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.btnBrowse.sizePolicy().hasHeightForWidth()) self.btnBrowse.setSizePolicy(sizePolicy) self.btnBrowse.setMaximumSize(QtCore.QSize(27, 27)) self.btnBrowse.setBaseSize(QtCore.QSize(27, 27)) self.btnBrowse.setObjectName(_fromUtf8("btnBrowse")) self.horizontalLayout.addWidget(self.btnBrowse) self.chkMakeArchive = QtGui.QCheckBox(self.grpOutFileName) self.chkMakeArchive.setObjectName(_fromUtf8("chkMakeArchive")) self.horizontalLayout.addWidget(self.chkMakeArchive) self.gridLayout_4.addWidget(self.grpOutFileName, 0, 0, 1, 1) self.gbExportTemplates = QtGui.QGroupBox(self.tabParameters) self.gbExportTemplates.setObjectName(_fromUtf8("gbExportTemplates")) self.gridLayout_2 = QtGui.QGridLayout(self.gbExportTemplates) self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) self.rbTemplateIndividual = QtGui.QRadioButton(self.gbExportTemplates) self.rbTemplateIndividual.setChecked(True) self.rbTemplateIndividual.setObjectName( _fromUtf8("rbTemplateIndividual")) self.gridLayout_2.addWidget(self.rbTemplateIndividual, 0, 0, 1, 1) self.cmbCodec = QtGui.QComboBox(self.gbExportTemplates) self.cmbCodec.setObjectName(_fromUtf8("cmbCodec")) self.cmbCodec.addItem(_fromUtf8("")) self.cmbCodec.addItem(_fromUtf8("")) self.cmbCodec.addItem(_fromUtf8("")) self.gridLayout_2.addWidget(self.cmbCodec, 2, 1, 1, 1) self.lblCodec = QtGui.QLabel(self.gbExportTemplates) self.lblCodec.setObjectName(_fromUtf8("lblCodec")) self.gridLayout_2.addWidget(self.lblCodec, 2, 0, 1, 1) self.cmbExportTemplates = QtGui.QComboBox(self.gbExportTemplates) self.cmbExportTemplates.setObjectName(_fromUtf8("cmbExportTemplates")) self.cmbExportTemplates.addItem(_fromUtf8("")) self.gridLayout_2.addWidget(self.cmbExportTemplates, 1, 0, 1, 2) self.rbTemplateGroups = QtGui.QRadioButton(self.gbExportTemplates) self.rbTemplateGroups.setObjectName(_fromUtf8("rbTemplateGroups")) self.gridLayout_2.addWidget(self.rbTemplateGroups, 0, 1, 1, 1) self.gridLayout_4.addWidget(self.gbExportTemplates, 1, 0, 1, 1) self.groupBox = QtGui.QGroupBox(self.tabParameters) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.verticalLayout_3 = QtGui.QVBoxLayout(self.groupBox) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.saTemplateParams = QtGui.QScrollArea(self.groupBox) self.saTemplateParams.setWidgetResizable(True) self.saTemplateParams.setObjectName(_fromUtf8("saTemplateParams")) self.scrollAreaWidgetContents = QtGui.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 431, 181)) self.scrollAreaWidgetContents.setObjectName( _fromUtf8("scrollAreaWidgetContents")) self.gridLayout_3 = QtGui.QGridLayout(self.scrollAreaWidgetContents) self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) self.paramNamesLayout = QtGui.QVBoxLayout() self.paramNamesLayout.setContentsMargins(-1, -1, 6, -1) self.paramNamesLayout.setObjectName(_fromUtf8("paramNamesLayout")) self.gridLayout_3.addLayout(self.paramNamesLayout, 0, 0, 1, 1) self.paramValuesLayout = QtGui.QVBoxLayout() self.paramValuesLayout.setSizeConstraint( QtGui.QLayout.SetDefaultConstraint) self.paramValuesLayout.setObjectName(_fromUtf8("paramValuesLayout")) self.gridLayout_3.addLayout(self.paramValuesLayout, 0, 1, 1, 1) self.saTemplateParams.setWidget(self.scrollAreaWidgetContents) self.verticalLayout_3.addWidget(self.saTemplateParams) self.gridLayout_4.addWidget(self.groupBox, 2, 0, 1, 1) self.tabWidget.addTab(self.tabParameters, _fromUtf8("")) self.tabLog = QtGui.QWidget() self.tabLog.setObjectName(_fromUtf8("tabLog")) self.gridLayout_5 = QtGui.QGridLayout(self.tabLog) self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) self.textLogs = QtGui.QTextEdit(self.tabLog) self.textLogs.setObjectName(_fromUtf8("textLogs")) self.gridLayout_5.addWidget(self.textLogs, 0, 0, 1, 1) self.tabWidget.addTab(self.tabLog, _fromUtf8("")) self.gridLayout.addWidget(self.tabWidget, 2, 0, 1, 3) self.btnExport = QtGui.QPushButton(ExportToDbfDialog) self.btnExport.setObjectName(_fromUtf8("btnExport")) self.gridLayout.addWidget(self.btnExport, 0, 0, 1, 1) self.btnClose = QtGui.QPushButton(ExportToDbfDialog) self.btnClose.setObjectName(_fromUtf8("btnClose")) self.gridLayout.addWidget(self.btnClose, 0, 2, 1, 1) self.pbRecords = CProgressBar(ExportToDbfDialog) self.pbRecords.setProperty("value", 0) self.pbRecords.setAlignment(QtCore.Qt.AlignCenter) self.pbRecords.setTextVisible(True) self.pbRecords.setObjectName(_fromUtf8("pbRecords")) self.gridLayout.addWidget(self.pbRecords, 1, 0, 1, 3) self.retranslateUi(ExportToDbfDialog) self.tabWidget.setCurrentIndex(0) self.cmbExportTemplates.setCurrentIndex(0) QtCore.QObject.connect(self.btnClose, QtCore.SIGNAL(_fromUtf8("clicked()")), ExportToDbfDialog.reject) QtCore.QMetaObject.connectSlotsByName(ExportToDbfDialog) def retranslateUi(self, ExportToDbfDialog): ExportToDbfDialog.setWindowTitle( _translate("ExportToDbfDialog", "ExportToDbfDialog", None)) self.pbFiles.setFormat( _translate("ExportToDbfDialog", "Обработано шаблонов %v/%m", None)) self.grpOutFileName.setTitle( _translate("ExportToDbfDialog", "Путь выгрузки:", None)) self.edtOutPath.setText( _translate("ExportToDbfDialog", "<Не указан>", None)) self.btnBrowse.setText(_translate("ExportToDbfDialog", "...", None)) self.chkMakeArchive.setText( _translate("ExportToDbfDialog", "создать архив", None)) self.gbExportTemplates.setTitle( _translate("ExportToDbfDialog", "Шаблоны выгрузки", None)) self.rbTemplateIndividual.setText( _translate("ExportToDbfDialog", "Индивидуальные отчеты", None)) self.cmbCodec.setItemText( 0, _translate("ExportToDbfDialog", "utf-8", None)) self.cmbCodec.setItemText( 1, _translate("ExportToDbfDialog", "cp1251", None)) self.cmbCodec.setItemText( 2, _translate("ExportToDbfDialog", "cp866", None)) self.lblCodec.setText( _translate("ExportToDbfDialog", "Кодировка файлов с шаблонами:", None)) self.cmbExportTemplates.setItemText( 0, _translate("ExportToDbfDialog", "<Не задано>", None)) self.rbTemplateGroups.setText( _translate("ExportToDbfDialog", "Группы отчетов", None)) self.groupBox.setTitle( _translate("ExportToDbfDialog", "Параметры шаблона", None)) self.tabWidget.setTabText( self.tabWidget.indexOf(self.tabParameters), _translate("ExportToDbfDialog", "Параметры", None)) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabLog), _translate("ExportToDbfDialog", "Лог", None)) self.btnExport.setText(_translate("ExportToDbfDialog", "Экспорт", None)) self.btnClose.setText(_translate("ExportToDbfDialog", "Закрыть", None)) self.pbRecords.setFormat( _translate("ExportToDbfDialog", "Обработано записей %v/%m", None))
class CImportPayRefuseR85Dialog(QtGui.QDialog): InitState = 0 ImportState = 1 MainEngine = CImportPayRefuseR85Engine # DDEngine = CImportR85DDTFEngine # TODO: Возможно, стоит отсюда выпилить эту разбивку, если принципиальных различий не появится engineByFormat = {'HS': MainEngine, 'HT': MainEngine, 'DP': MainEngine, 'DV': MainEngine, 'DO': MainEngine, 'DS': MainEngine, 'DU': MainEngine, 'DF': MainEngine, 'DD': MainEngine, 'DR': MainEngine, 'TS': MainEngine, 'TT': MainEngine, } def __init__(self, db, orgId, parent = None, isFLC = False): super(CImportPayRefuseR85Dialog, self).__init__(parent) if isFLC: self.MainEngine = CImportPayRefuseR85EngineFLC self._db = db self._orgId = orgId self._pi = CProgressInformer(processEventsFlag=QtCore.QEventLoop.AllEvents) # self._engine = CImportR85TFEngine(db, orgId, progressInformer=self._pi) #TODO? # self._engine.setUserConfirmationFunction(self.userConfirmation) self._lastExceptionHandler = None # self._loggerHandler = CLogHandler(self._engine.logger(), self) # self._loggerHandler.setLevel(logging.INFO) self._currentState = self.InitState self.setupUi() self.onStateChanged() self._engines = {} self._isFLC = isFLC def setLastExceptionHandler(self, handler): self._lastExceptionHandler = handler def setParams(self, params): if isinstance(params, dict): fileName = forceStringEx(getPref(params, 'inputFile', u'')) if os.path.isfile(fileName): self.edtFileName.setText(fileName) def engine(self, format): engine = self._engines.get(format, None) # self._engine if engine is None: engine = self.engineByFormat.get(format, self.MainEngine)(self._db, self._orgId, progressInformer=self._pi, format=format) engine.setLastExceptionHandler(self._lastExceptionHandler) engine.setUserConfirmationFunction(self.userConfirmation) loggerHandler = CLogHandler(engine.logger(), self) loggerHandler.setLevel(logging.INFO) loggerHandler.logged.connect(self.logInfo.append) self._engines[format] = engine return engine def params(self): params = {} setPref(params, 'inputFile', forceStringEx(self.edtFileName.text())) return params @property def currentState(self): return self._currentState @currentState.setter def currentState(self, value): if value in [self.InitState, self.ImportState]: self._currentState = value self.onStateChanged() def onStateChanged(self): self.btnNextAction.setText(self._actionNames.get(self.currentState, u'<Error>')) self.btnClose.setEnabled(self.currentState != self.ImportState) self.gbInit.setEnabled(self.currentState == self.InitState) self.gbImport.setEnabled(self.currentState == self.ImportState) # self.btnSave.setEnabled(bool(self._engine.documents)) QtCore.QCoreApplication.processEvents() # noinspection PyAttributeOutsideInit def setupUi(self): layout = QtGui.QVBoxLayout() # init block self.gbInit = QtGui.QGroupBox() gbLayout = QtGui.QVBoxLayout() lineLayout = QtGui.QHBoxLayout() self.edtFileName = QtGui.QLineEdit() self.edtFileName.setReadOnly(True) self.edtFileName.textChanged.connect(self.onFileNameChanged) lineLayout.addWidget(self.edtFileName) self.btnBrowseFile = QtGui.QToolButton() # noinspection PyUnresolvedReferences self.btnBrowseFile.clicked.connect(self.onBrowseFileClicked) lineLayout.addWidget(self.btnBrowseFile) gbLayout.addLayout(lineLayout) self.gbInit.setLayout(gbLayout) layout.addWidget(self.gbInit) # import block self.gbImport = QtGui.QGroupBox() gbLayout = QtGui.QVBoxLayout() self.progressBar = CProgressBar() self.progressBar.setAlignment(QtCore.Qt.AlignCenter) self.progressBar.setRange(0, 0) self.progressBar.setProgressFormat(u'(%v/%m)') self._pi.progressChanged.connect(self.progressBar.setProgress) gbLayout.addWidget(self.progressBar) self.gbImport.setLayout(gbLayout) layout.addWidget(self.gbImport) # log block self.logInfo = QtGui.QTextEdit() layout.addWidget(self.logInfo) # self._loggerHandler.logged.connect(self.logInfo.append) # buttons block subLayout = QtGui.QHBoxLayout() self.btnNextAction = QtGui.QPushButton() # noinspection PyUnresolvedReferences self.btnNextAction.clicked.connect(self.onNextActionClicked) subLayout.addStretch() subLayout.addWidget(self.btnNextAction) self.btnClose = QtGui.QPushButton() # noinspection PyUnresolvedReferences self.btnClose.clicked.connect(self.onCloseClicked) subLayout.addWidget(self.btnClose) layout.addLayout(subLayout) self.setLayout(layout) self.setMinimumWidth(512) self.retranslateUi() # noinspection PyAttributeOutsideInit def retranslateUi(self): context = unicode(getClassName(self)) self.setWindowTitle(forceTr(u'Импорт отказов. Крым. ТФОМС.', context)) self.gbInit.setTitle(forceTr(u'Параметры импорта', context)) self.gbImport.setTitle(forceTr(u'Импорт', context)) self._actionNames = {self.InitState: forceTr(u'Импорт',context), self.ImportState: forceTr(u'Прервать', context)} self.btnClose.setText(forceTr(u'Закрыть', context)) def userConfirmation(self, title, message): return QtGui.QMessageBox.Yes == QtGui.QMessageBox.question(self, title, message, QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No) @QtCore.pyqtSlot() def onNextActionClicked(self): if self.currentState == self.InitState: self.currentState = self.ImportState try: self.engine(self._currentFormat).process(forceStringEx(self.edtFileName.text())) except Exception, e: self.currentState = self.InitState raise self.currentState = self.InitState elif self.currentState == self.ImportState: self.engine(self._currentFormat).abort() self.currentState = self.InitState
class CMultipleExportDialog(QtGui.QDialog): InitState = 0 ExportState = 1 SaveState = 2 def __init__(self, db, accountIdList, parent=None): super(CMultipleExportDialog, self).__init__(parent=parent) self._db = db self._accountIdList = accountIdList self._engines = [] self._pi = CProgressInformer( processEventsFlag=QtCore.QEventLoop.AllEvents) # self._engine = engine(db, accountRecord, progressInformer=self._pi) # self._loggerHandler = CLogHandler(self._engine.logger(), self) self._currentState = self.InitState self.setupUi() self.onStateChanged() def setParams(self, params): if isinstance(params, dict): outDir = forceStringEx(getPref(params, 'outDir', u'')) if os.path.isdir(outDir): self.edtSaveDir.setText(outDir) def params(self): params = {} setPref(params, 'outDir', forceStringEx(self.edtSaveDir.text())) return params @property def currentState(self): return self._currentState @currentState.setter def currentState(self, value): if value in [self.InitState, self.ExportState, self.SaveState]: self._currentState = value self.onStateChanged() def onStateChanged(self): self.btnNextAction.setText( self._actionNames.get(self.currentState, u'<Error>')) self.btnClose.setEnabled(self.currentState != self.ExportState) # self.gbInit.setEnabled(self.currentState == self.InitState) self.gbExport.setEnabled(self.currentState == self.ExportState) self.gbSave.setEnabled(self.currentState == self.SaveState) self.btnSave.setEnabled(self.hasDocuments()) QtCore.QCoreApplication.processEvents() def setupUi(self): layout = QtGui.QVBoxLayout() # init block # self.gbInit = QtGui.QGroupBox() # gbLayout = QtGui.QVBoxLayout() # self.gbInit.setLayout(gbLayout) # layout.addWidget(self.gbInit) # export block self.gbExport = QtGui.QGroupBox() gbLayout = QtGui.QVBoxLayout() self.progressBar = CProgressBar() self.progressBar.setAlignment(QtCore.Qt.AlignCenter) self.progressBar.setRange(0, 0) self.progressBar.setProgressFormat(u'(%v/%m)') self._pi.progressChanged.connect(self.progressBar.setProgress) gbLayout.addWidget(self.progressBar) self.gbExport.setLayout(gbLayout) layout.addWidget(self.gbExport) # save block self.gbSave = QtGui.QGroupBox() gbLayout = QtGui.QVBoxLayout() lineLayout = QtGui.QHBoxLayout() self.edtSaveDir = QtGui.QLineEdit(QtCore.QDir.homePath()) self.edtSaveDir.setReadOnly(True) lineLayout.addWidget(self.edtSaveDir) self.btnBrowseDir = QtGui.QToolButton() self.btnBrowseDir.clicked.connect(self.onBrowseDir) lineLayout.addWidget(self.btnBrowseDir) gbLayout.addLayout(lineLayout) lineLayout = QtGui.QHBoxLayout() self.btnSave = QtGui.QPushButton() self.btnSave.clicked.connect(self.onSaveClicked) lineLayout.addWidget(self.btnSave) gbLayout.addLayout(lineLayout) self.gbSave.setLayout(gbLayout) layout.addWidget(self.gbSave) # log block self.logInfo = QtGui.QTextEdit() layout.addWidget(self.logInfo) # self._loggerHandler.logged.connect(self.logInfo.append) # buttons block subLayout = QtGui.QHBoxLayout() self.btnNextAction = QtGui.QPushButton() self.btnNextAction.clicked.connect(self.onNextActionClicked) subLayout.addStretch() subLayout.addWidget(self.btnNextAction) self.btnClose = QtGui.QPushButton() self.btnClose.clicked.connect(self.onCloseClicked) subLayout.addWidget(self.btnClose) layout.addLayout(subLayout) self.setLayout(layout) self.setMinimumWidth(512) self.retranslateUi() self.setModal(True) def retranslateUi(self): context = unicode(getClassName(self)) self.setWindowTitle(forceTr(u'Экспорт. Крым. ФЛК', context)) # self.gbInit.setTitle(forceTr(u'Параметры экспорта', context)) self.gbExport.setTitle(forceTr(u'Экспорт', context)) self.gbSave.setTitle(forceTr(u'Сохранение результата', context)) self.btnSave.setText(forceTr(u'Сохранить', context)) self._actionNames = { self.InitState: forceTr(u'Экспорт', context), self.ExportState: forceTr(u'Прервать', context), self.SaveState: forceTr(u'Повторить', context) } self.btnClose.setText(forceTr(u'Закрыть', context)) @QtCore.pyqtSlot() def onNextActionClicked(self): if self.currentState == self.InitState: result = False self.currentState = self.ExportState for accountId in self._accountIdList: engine = None exportInfo = getAccountExportFormat(accountId).split() if exportInfo: exportFormat = exportInfo[0] if exportFormat in ('R85XML'): engine = CExportR85TFEngine(self._db, progressInformer=self._pi, FLC=True) # Крым, выгрузка диспансеризации и профосмотров (МО->Фонд) elif exportFormat == 'R85DDXML': engine = CExportR85DDTFEngine( self._db, progressInformer=self._pi, FLC=True) elif exportFormat == 'R85HTXML': engine = CExportR85HTTFEngine( self._db, progressInformer=self._pi, FLC=True) if engine: # FIXME: может провоцировать падения/ошибки? CLogHandler(engine.logger(), self).logged.connect(self.logInfo.append) self._engines.append(engine) try: result = engine.process(accountId) except: self.currentState = self.InitState raise self.currentState = self.SaveState if result else self.InitState elif self.currentState == self.ExportState: for engine in self._engines: engine.terminate() self._engines = [] elif self.currentState == self.SaveState: self.currentState = self.InitState self.onStateChanged() def canClose(self): ok = self.currentState == self.SaveState return ok or \ QtGui.QMessageBox.warning(self, u'Внимание!', u'Остались несохраненные файлы выгрузок,\n' u'которые будут утеряны.\n' u'Вы уверены, что хотите покинуть менеджер экспорта?\n', QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes def hasDocuments(self): result = False for engine in self._engines: if engine.hDocuments or engine.lDocuments: result = True break return result def closeEvent(self, event): if self.canClose(): event.accept() else: event.ignore() def done(self, result): if self.canClose(): super(CMultipleExportDialog, self).done(result) @QtCore.pyqtSlot() def onCloseClicked(self): self.accept() @QtCore.pyqtSlot() def onBrowseDir(self): saveDir = forceStringEx( QtGui.QFileDialog.getExistingDirectory( self, u'Укажите директорию для сохранения файлов выгрузки', self.edtSaveDir.text())) if os.path.isdir(saveDir): self.edtSaveDir.setText(saveDir) @QtCore.pyqtSlot() def onSaveClicked(self): self.btnClose.setEnabled(False) for engine in self._engines: engine.save(self.edtSaveDir.text()) self.onStateChanged()
class CExport85MTR_Refused(QtGui.QDialog): InitState = 0 ExportState = 1 SaveState = 2 def __init__(self, db, accountId, parent=None): super(CExport85MTR_Refused, self).__init__(parent) self._db = db self._pi = CProgressInformer( processEventsFlag=QtCore.QEventLoop.AllEvents) self._accountId = accountId self._engine = CExportR85MTREngine_Refused(db, progressInformer=self._pi) self._loggerHandler = CLogHandler(self._engine.logger(), self) self._loggerHandler.setLevel(logging.INFO) self._currentState = self.InitState self.setupUi() self.onStateChanged() def engine(self): return self._engine def setParams(self, params): if isinstance(params, dict): outDir = forceStringEx(getPref(params, 'outDir', u'')) if os.path.isdir(outDir): self.edtSaveDir.setText(outDir) accNumber = forceInt(getPref(params, 'accNumber', 0)) + 1 self.spbAccountNumber.setValue(accNumber) def params(self): params = {} setPref(params, 'outDir', forceStringEx(self.edtSaveDir.text())) setPref(params, 'accNumber', self.spbAccountNumber.value()) return params @property def currentState(self): return self._currentState @currentState.setter def currentState(self, value): if value in [self.InitState, self.ExportState, self.SaveState]: self._currentState = value self.onStateChanged() def onStateChanged(self): self.btnNextAction.setText( self._actionNames.get(self.currentState, u'<Error>')) self.btnClose.setEnabled(self.currentState != self.ExportState) self.gbInit.setEnabled(self.currentState == self.InitState) self.gbExport.setEnabled(self.currentState == self.ExportState) self.gbSave.setEnabled(self.currentState == self.SaveState) self.btnSave.setEnabled(bool(self._engine.documents)) QtCore.QCoreApplication.processEvents() # noinspection PyAttributeOutsideInit def setupUi(self): layout = QtGui.QVBoxLayout() # init block self.gbInit = QtGui.QGroupBox() gbLayout = QtGui.QHBoxLayout() self.lblAccountNumber = QtGui.QLabel() gbLayout.addWidget(self.lblAccountNumber) self.spbAccountNumber = QtGui.QSpinBox() self.spbAccountNumber.setRange(1, 9999) gbLayout.addWidget(self.spbAccountNumber) self.gbInit.setLayout(gbLayout) layout.addWidget(self.gbInit) # export block self.gbExport = QtGui.QGroupBox() gbLayout = QtGui.QVBoxLayout() self.progressBar = CProgressBar() self.progressBar.setAlignment(QtCore.Qt.AlignCenter) self.progressBar.setRange(0, 0) self.progressBar.setProgressFormat(u'(%v/%m)') self._pi.progressChanged.connect(self.progressBar.setProgress) gbLayout.addWidget(self.progressBar) self.gbExport.setLayout(gbLayout) layout.addWidget(self.gbExport) # save block self.gbSave = QtGui.QGroupBox() gbLayout = QtGui.QVBoxLayout() lineLayout = QtGui.QHBoxLayout() self.edtSaveDir = QtGui.QLineEdit(QtCore.QDir.homePath()) self.edtSaveDir.setReadOnly(True) lineLayout.addWidget(self.edtSaveDir) self.btnBrowseDir = QtGui.QToolButton() self.btnBrowseDir.clicked.connect(self.onBrowseDirClicked) lineLayout.addWidget(self.btnBrowseDir) gbLayout.addLayout(lineLayout) lineLayout = QtGui.QHBoxLayout() # self.chkZipping = QtGui.QCheckBox() # lineLayout.addWidget(self.chkZipping) self.btnSave = QtGui.QPushButton() self.btnSave.clicked.connect(self.onSaveClicked) lineLayout.addWidget(self.btnSave) gbLayout.addLayout(lineLayout) self.gbSave.setLayout(gbLayout) layout.addWidget(self.gbSave) # log block self.logInfo = QtGui.QTextEdit() layout.addWidget(self.logInfo) self._loggerHandler.logged.connect(self.logInfo.append) # buttons block subLayout = QtGui.QHBoxLayout() self.btnNextAction = QtGui.QPushButton() self.btnNextAction.clicked.connect(self.onNextActionClicked) subLayout.addStretch() subLayout.addWidget(self.btnNextAction) self.btnClose = QtGui.QPushButton() self.btnClose.clicked.connect(self.onCloseClicked) subLayout.addWidget(self.btnClose) layout.addLayout(subLayout) self.setLayout(layout) self.setMinimumWidth(512) self.retranslateUi() # noinspection PyAttributeOutsideInit def retranslateUi(self): context = unicode(getClassName(self)) self.setWindowTitle( forceTr(u'Экспорт. Крым. МежТер. Возврат.', context)) self.gbInit.setTitle(forceTr(u'Параметры экспорта', context)) self.lblAccountNumber.setText( forceTr(u'Номер выгрузки по счету', context)) self.gbExport.setTitle(forceTr(u'Экспорт', context)) self.gbSave.setTitle(forceTr(u'Сохранение результата', context)) self.btnSave.setText(forceTr(u'Сохранить', context)) self._actionNames = { self.InitState: forceTr(u'Экспорт', context), self.ExportState: forceTr(u'Прервать', context), self.SaveState: forceTr(u'Повторить', context) } self.btnClose.setText(forceTr(u'Закрыть', context)) @QtCore.pyqtSlot() def onNextActionClicked(self): if self.currentState == self.InitState: self.currentState = self.ExportState try: result = self._engine.process(self._accountId) except Exception, e: self.currentState = self.InitState raise self.currentState = self.SaveState if result else self.InitState elif self.currentState == self.ExportState: self._engine.abort()