Exemple #1
0
class TaskEditor(QtGui.QWidget):
    def __init__(self, parent=None, flags=0):
        super(TaskEditor, self).__init__(parent=None)
        self.setWindowTitle(u"BLOB Data Extract Tool")
        self.setWindowIcon(QtGui.QIcon('./blobdata_pump.ico'))
        self.globalLayout = QtGui.QGridLayout()
        self.setLayout(self.globalLayout)
        self.setMinimumSize(500, 700)
        self.globalLayout.setVerticalSpacing(4)
        self.globalLayout.setHorizontalSpacing(4)		
        self.globalLayout.setAlignment(Qt.Qt.AlignTop | Qt.Qt.AlignLeft)
        self.setWindowFlags(Qt.Qt.WindowStaysOnTopHint)

        self.dbConnStatus = False
        self.chooseColumnStatus = False
        self.control = Control()
        self.initUI()

    def initUI(self):
        #数据源
        sourceDBLabel = QtGui.QLabel(u'数据源连接:')
        sourceDBLabel.setFixedWidth(80)
        self.sourceDBText = QtGui.QLineEdit('system/oracle@orcl')
        self.sourceDBText.setMinimumWidth(280)
        self.sourceDBTestButton = QtGui.QPushButton(u'1.测试数据连接')
        self.sourceDBTestButton.clicked.connect(self.on_sourceDBTestButton_clicked)
        self.sourceDBTestLabel = QtGui.QLabel()
        self.sourceDBTestLabel.setFixedHeight(20)

        self.globalLayout.addWidget(sourceDBLabel, 0, 0, 1, 1)
        self.globalLayout.addWidget(self.sourceDBText, 0, 1, 1, 1)
        self.globalLayout.addWidget(self.sourceDBTestButton, 0, 2, 1, 1)
        self.globalLayout.addWidget(self.sourceDBTestLabel, 1, 1, 1, 2)


        #SQL区域
        self.blobIdSQLGroupBox = QtGui.QGroupBox(u"SQL1:填写获取需要抽取的图片的图片ID及其它列的SQL")
        blobIdSQLTipsLabel = QtGui.QLabel(u"图片ID列请指定别名为ImageId;其它列名也最好使用别名,以便程序识别,以下同理。")
        blobIdSQLTipsLabel.setStyleSheet('''QLabel{color:red}''')
        self.blobIdSQLLayout = QtGui.QVBoxLayout()
        self.blobIdSQLGroupBox.setLayout(self.blobIdSQLLayout)
        self.blobIdSQLEditor = QtGui.QTextEdit("select imageid as ImageId,xm from test_base")
        self.blobIdSQLEditor.setFixedHeight(60)
        self.blobIdSQLLayout.addWidget(blobIdSQLTipsLabel, 0, Qt.Qt.AlignTop)
        self.blobIdSQLLayout.addWidget(self.blobIdSQLEditor, 1, Qt.Qt.AlignTop)
        self.globalLayout.addWidget(self.blobIdSQLGroupBox, 2, 0, 1, 3, Qt.Qt.AlignTop)


        self.blobSQLGroupBox = QtGui.QGroupBox(u"SQL2:填写通过图片ID获取唯一图片及其它列的SQL")
        blobSQLTipsLabel = QtGui.QLabel(u"图片列请指定别名Image;同时条件中的图片ID的值请使用'%s'指定,如Where ImageId='%s'。")
        blobSQLTipsLabel.setStyleSheet('''QLabel{color:red}''')
        self.blobSQLLayout = QtGui.QVBoxLayout()
        self.blobSQLGroupBox.setLayout(self.blobSQLLayout)
        self.blobSQLEditor = QtGui.QTextEdit("SELECT zp as Image,sfzhm FROM test_image where imageid='%s'")
        self.blobSQLEditor.setFixedHeight(60)
        self.blobSQLLayout.addWidget(blobSQLTipsLabel, 0, Qt.Qt.AlignTop)
        self.blobSQLLayout.addWidget(self.blobSQLEditor, 1, Qt.Qt.AlignTop)
        self.globalLayout.addWidget(self.blobSQLGroupBox, 3, 0, 1, 3, Qt.Qt.AlignTop)		


        processesLabel = QtGui.QLabel(u"并发进程数:")
        self.processesEditor = QtGui.QLineEdit('6')
        #processesValidator = QtGui.QRegExpValidator(Qt.QRegExp('[0-9]+'))
        self.processesEditor.setValidator(QtGui.QIntValidator(1, 64))

        self.processesEditor.setFixedWidth(110)
        self.sourceTableColumnButton = QtGui.QPushButton(u"2.获取源数据所有列")
        self.sourceTableColumnButton.setEnabled(False)
        self.sourceTableColumnButton.clicked.connect(self.on_sourceTableColumnButton_clicked)
        self.globalLayout.addWidget(processesLabel, 4, 0, 1, 1)
        self.globalLayout.addWidget(self.processesEditor, 4, 1, 1, 1)
        self.globalLayout.addWidget(self.sourceTableColumnButton, 4, 2, 1, 1)

        """选择抽取图片到文件系统还是数据库"""
        self.extractMethodTab = QtGui.QTabWidget()
        self.initBlob2IOTab()
        self.initBlob2DBTab()
        self.globalLayout.addWidget(self.extractMethodTab, 5, 0, 1, 3)

    def initBlob2IOTab(self):
        #第一个TAB页
        self.blob2IOWidget = QtGui.QWidget()
        self.blob2IOLayout = QtGui.QGridLayout()
        self.blob2IOLayout.setVerticalSpacing(20)
        self.blob2IOLayout.setAlignment(Qt.Qt.AlignLeft | Qt.Qt.AlignTop)
        self.blob2IOWidget.setLayout(self.blob2IOLayout)

        #指定图片名称组成列
        blobNameSplitLabel = QtGui.QLabel(u'3.指定图片名分割符:')
        self.blobNameSplitText = QtGui.QLineEdit(u'_')
        self.blobNameSplitText.setFixedWidth(110)
        blobNameColumnLabel = QtGui.QLabel(u'4.指定图片名称列:')
        self.blob2IOLayout.addWidget(blobNameSplitLabel, 0, 0, 1, 1)
        self.blob2IOLayout.addWidget(self.blobNameSplitText, 0, 1, 1, 2)
        self.blob2IOLayout.addWidget(blobNameColumnLabel, 1, 0, 1, 1) 		

        #图片输出位置
        self.ioPathEdit = Qt.QLineEdit("e:\\")
        self.ioPathEdit.setFixedWidth(340)
        self.ioPathEdit.setEnabled(False)
        ioPathButton = Qt.QPushButton(u'5.选择图片输出目录')
        ioPathButton.clicked.connect(self.on_ioPathButton_clicked)
        self.blob2IOLayout.addWidget(ioPathButton, 7, 0, 1, 1)
        self.blob2IOLayout.addWidget(self.ioPathEdit, 7, 1, 1, 3)


        self.runButton1 = QtGui.QPushButton(u"任务开始")
        self.runButton1.setEnabled(False)
        self.runButton1.setObjectName('run1')
        self.runButton1.setFixedSize(110, 40)
        self.runButton1.setStyleSheet('''QPushButton{font-size:12px;font-weight:bold}''')
        self.runButton1.clicked.connect(self.on_runButton_clicked)
        self.blob2IOLayout.addWidget(self.runButton1, 8, 3, 1, 1, Qt.Qt.AlignBottom)


        self.extractMethodTab.addTab(self.blob2IOWidget, u'抽取图片到文件系统')


    def initBlob2DBTab(self):
        self.blob2DBWidget = QtGui.QWidget()
        blob2DBLayout = QtGui.QGridLayout()
        blob2DBLayout.setAlignment(Qt.Qt.AlignLeft | Qt.Qt.AlignTop)
        self.blob2DBWidget.setLayout(blob2DBLayout)

        #目标源
        targetDBLabel = QtGui.QLabel(u'目标库连接:')
        targetDBLabel.setFixedWidth(80)
        self.targetDBText = QtGui.QLineEdit('system/oracle@orcl')
        self.targetDBText.setMinimumWidth(280)
        self.targetDBTestButton = QtGui.QPushButton(u'3、测试目标库连接')
        self.targetDBTestButton.clicked.connect(self.on_targetDBTestButton_clicked)
        self.targetDBTestLabel = QtGui.QLabel()
        self.targetDBTestLabel.setFixedHeight(20)
        blob2DBLayout.addWidget(targetDBLabel, 0, 0, 1, 1)
        blob2DBLayout.addWidget(self.targetDBText, 0, 1, 1, 1)
        blob2DBLayout.addWidget(self.targetDBTestButton, 0, 2, 1, 1)
        blob2DBLayout.addWidget(self.targetDBTestLabel, 1, 1, 1, 2)

        self.extractMethodTab.addTab(self.blob2DBWidget, u'抽取图片到数据库')


        #目标表
        targetTableLabel = QtGui.QLabel(u'目标库表:')
        targetTableLabel.setFixedWidth(80)
        self.targetTableText = QtGui.QLineEdit('test_target')
        self.targetTableText.setMinimumWidth(280)
        self.targetTableColumnButton = QtGui.QPushButton(u'4、获取目标表字段')
        self.targetTableColumnButton.setEnabled(False)
        self.targetTableColumnButton.clicked.connect(self.on_targetTableColumnButton_clicked)
        self.targetTableTestLabel = QtGui.QLabel()
        blob2DBLayout.addWidget(targetTableLabel, 2, 0, 1, 1)
        blob2DBLayout.addWidget(self.targetTableText, 2, 1, 1, 1)
        blob2DBLayout.addWidget(self.targetTableColumnButton, 2, 2, 1, 1)
        blob2DBLayout.addWidget(self.targetTableTestLabel, 3, 1, 1, 2)

        #映射列
        self.mapColumnWidget = QtGui.QGroupBox(u"源表列与目标列映射关系")
        self.mapColumnWidget.setMaximumWidth(365)
        self.mapColumnLayout = QtGui.QGridLayout()
        self.mapColumnLayout.setAlignment(Qt.Qt.AlignLeft | Qt.Qt.AlignCenter)
        self.mapColumnWidget.setLayout(self.mapColumnLayout)
        self.mapColumnLayout.addWidget(QtGui.QLabel(u'源表列'), 0, 0, 1, 1, Qt.Qt.AlignCenter)
        self.mapColumnLayout.addWidget(QtGui.QLabel(u'目标表列'), 0, 1, 1, 1, Qt.Qt.AlignCenter)
        self.mapColumnLayout.setColumnStretch(0, 1)
        self.mapColumnLayout.setColumnStretch(1, 1)
        blob2DBLayout.addWidget(self.mapColumnWidget, 4, 0, 3, 3)

        
        self.runButton2 = QtGui.QPushButton(u"任务开始")
        self.runButton2.setEnabled(False)
        self.runButton2.setObjectName('run2')
        self.runButton2.setFixedSize(110, 40)
        self.runButton2.setStyleSheet('''QPushButton{font-size:12px;font-weight:bold}''')
        self.runButton2.clicked.connect(self.on_runButton_clicked)
        self.mapColumnTipLabel = QtGui.QLabel()
        self.mapColumnTipLabel.setWordWrap(True)
        self.mapColumnTipLabel.setStyleSheet('''QLabel{color:red}''')
        blob2DBLayout.addWidget(self.runButton2, 4, 2, 1, 1, Qt.Qt.AlignTop)
        blob2DBLayout.addWidget(self.mapColumnTipLabel, 5, 2, 2, 1, Qt.Qt.AlignTop)


    def on_sourceDBTestButton_clicked(self):
        dbConnStr = self.sourceDBText.text()
        if not dbConnStr:
            return
        testResult = self.control.getDBConnStatus(str(dbConnStr))

        if testResult:
            self.dbConnStatus = True
            self.sourceDBTestLabel.setText(u"* 源数据库连接成功")
            self.sourceDBTestLabel.setStyleSheet('''QLabel{color:green}''')
            self.sourceTableColumnButton.setEnabled(True)
        else:
            self.dbConnStatus = False
            self.sourceDBTestLabel.setText(u"* 源数据库数据失败")
            self.sourceDBTestLabel.setStyleSheet('''QLabel{color:red}''')
            self.sourceTableColumnButton.setEnabled(False)


    def on_ioPathButton_clicked(self):
        filename = QtGui.QFileDialog.getExistingDirectory(self, u'选择图片输出目录', 'e:\\')
        if filename:
            self.ioPathEdit.setText(filename)

    def on_targetDBTestButton_clicked(self):
        dbConnStr = str(self.targetDBText.text())
        if not dbConnStr:
            return
        testResult = self.control.getDBConnStatus(dbConnStr, 'targetDB')


        if testResult:
            self.dbConnStatus = True
            self.targetDBTestLabel.setText(u"* 源数据库连接成功")
            self.targetDBTestLabel.setStyleSheet('''QLabel{color:green}''')
            self.targetTableColumnButton.setEnabled(True)
        else:
            self.dbConnStatus = False
            self.targetDBTestLabel.setText(u"* 源数据库连接失败")
            self.targetDBTestLabel.setStyleSheet('''QLabel{color:red}''')

    def on_targetTableColumnButton_clicked(self):
        tableName = str(self.targetTableText.text())
        if self.dbConnStatus:
            result = self.control.getTargetTableColumn(tableName)
            self.showMapColumnGrid(result, 'right')
            self.targetTableTestLabel.setText(u"* 获取列信息成功")
            self.targetTableTestLabel.setStyleSheet('''QLabel{color:green}''')
            self.runButton2.setEnabled(True)
        else:
            self.targetTableTestLabel.setText(u"* 获取列信息失败")
            self.targetTableTestLabel.setStyleSheet('''QLabel{color:red}''')



    def showMapColumnGrid(self, columnList, location = 'left'):
        for w in self.mapColumnWidget.findChildren(Qt.QWidget, Qt.QRegExp('.*' + location + '.*')):
            w.deleteLater()
        self.mapColumnWidget.update()
        
        if location == 'right':
            columnList.append('')

        for i in range(len(columnList) - 1):
            mapColumnComboBox = QtGui.QComboBox()
            mapColumnComboBox.setFixedSize(110, 20)
            mapColumnComboBox.setObjectName('mapColumnComboBox-' + location + '-' + str(i))
            for cName in columnList:
                mapColumnComboBox.addItem(Qt.QString(cName), Qt.QVariant(cName))
            if location == 'left':
                self.mapColumnLayout.addWidget(mapColumnComboBox, i + 1, 0, 1, 1, Qt.Qt.AlignCenter)
            else:
                self.mapColumnLayout.addWidget(mapColumnComboBox, i + 1, 1, 1, 1, Qt.Qt.AlignCenter)


    def on_sourceTableColumnButton_clicked(self):
        blobIdSQL = self.blobIdSQLEditor.toPlainText()
        blobSQL = self.blobSQLEditor.toPlainText()
        
        columnList = self.control.getSourceTableColumnName(str(blobIdSQL), str(blobSQL))
        columnList.append('')
        for w in self.blob2IOWidget.findChildren(Qt.QComboBox, Qt.QRegExp('blobNameColumnComboBox.*')):
            w.deleteLater()

        for i in range(len(columnList) - 2):
            blobNameColumnComboBox = QtGui.QComboBox()
            blobNameColumnComboBox.setFixedWidth(110)
            blobNameColumnComboBox.setObjectName("blobNameColumnComboBox-" + str(i + 1))
            
            for c in columnList:
                if c.endswith('.Image'):
                    continue
                blobNameColumnComboBox.addItem(Qt.QString(c), Qt.QVariant(c))
            self.blob2IOLayout.addWidget(blobNameColumnComboBox, i / 4 + 2, i % 4, 1, 1)			

        self.showMapColumnGrid(columnList, 'left')

        self.runButton1.setEnabled(True)


    def genFetchBlobSQL(self):
        BlobSQLText = QtGui.QTextEdit()
        targetTableName = str(self.targetDBText.text())
        targetTableColumn = []
        for w in self.mapColumnWidget.findChildren(Qt.QWidget, Qt.QRegExp('.*right.*')):
            targetTableColumn.append(w.currentText())

        sourceTableColumn = []
        for w in self.mapColumnWidget.findChildren(Qt.QWidget, Qt.QRegExp('.*left.*')):
            sourceTableColumn.append(w.currentText())

    def on_runButton_clicked(self):
        objName = self.sender().objectName()
        processes = str(self.processesEditor.text())
        processes = 0 if not processes else int(processes)        
        blobNameColumn = []
        if objName == 'run1':
            spliter = str(self.blobNameSplitText.text())
            for comboBox in self.blob2IOWidget.findChildren(Qt.QComboBox, Qt.QRegExp('blobNameColumnComboBox.*')):
                columnName = str(comboBox.currentText())
                if columnName:
                    blobNameColumn.append(columnName)
            filePath = str(self.ioPathEdit.text())
            self.control.runBlob2IO(spliter, blobNameColumn, filePath, processes)
        else:            
            mapColumnList = []
            for comboBox in self.blob2DBWidget.findChildren(Qt.QComboBox, Qt.QRegExp('mapColumnComboBox.*')):
                comboBoxName = str(comboBox.objectName())
                comboxNamePre, comboBoxDirec, comboBoxIndex = comboBoxName.split('-')
                comboBoxDirec = 0 if comboBoxDirec == 'left' else 1
                comboBoxIndex = int(comboBoxIndex)
                columnName = str(comboBox.currentText()) \
                    if comboBoxDirec == 0 else str(comboBox.currentText()).split(' ')[0]
                if len(mapColumnList) >= comboBoxIndex + 1:
                    mapColumnList[comboBoxIndex][comboBoxDirec] = columnName
                else:
                    mapColumnList.append([columnName, ''] if comboBoxDirec == 0 else ['', columnName])
             
            newMapColumn = []    
            if [i[0].upper() for i in mapColumnList].count('SQL2.IMAGE') == 0:
                self.mapColumnTipLabel.setText(u"* 请指定图片列的映射关系")
                return
            
            sourceColumn = [i[0] for i in mapColumnList]
            for l, r in mapColumnList:
                if not l or not r:
                    continue
                if mapColumnList.count([l, r]) > 1:
                    self.mapColumnTipLabel.setText(u"* 存在相同的列映射关系")
                    return
                if sourceColumn.count(l) > 1:
                    self.mapColumnTipLabel.setText(u"* 源表列中存在相同的列,请在SQL中使用不同的别名,以便区分")
                    print(mapColumnList, sourceColumn)
                    return

                
                newMapColumn.append([l, r])
            self.mapColumnTipLabel.setText(u"")
            self.control.runBlob2DB(newMapColumn, processes)