示例#1
0
class Window2(QDialog):
    def __init__(self, model, parent=None):
        super(Window2, self).__init__(parent)

        self.model = model
        self.mainLayout = QGridLayout()
        self.mainLayout.setColumnStretch(0, 1)
        self.mainLayout.setColumnStretch(1, 3)
        self.mainLayout.setColumnStretch(2, 3)

        self.flayout = QFormLayout()
        self.flayout.addRow('title', QLineEdit())
        self.flayout.addRow('author', QLineEdit())
        self.flayout.addRow('abstract', QLineEdit())
        self.comboBox = QComboBox()
        self.comboBox.addItems(Scraper.scrapers)
        self.flayout.addRow('source', self.comboBox)

        self.table = TableWidget()
        self.table.doubleClicked.connect(self.openDocument)

        self.setFixedSize(1000, 600)

        button1 = QPushButton()
        button1.setText("Search")
        button1.clicked.connect(self.search)

        button2 = QPushButton()
        button2.setText("Save")
        button2.clicked.connect(self.save)

        self.button3 = QPushButton()
        self.button3.setText("Next")
        self.button3.clicked.connect(self.next_results)
        self.button3.setVisible(False)

        self.button4 = QPushButton()
        self.button4.setText("Previous")
        self.button4.clicked.connect(self.previous_results)
        self.button4.setVisible(False)

        self.label = QLabel()
        self.label.setVisible(False)

        self.setWindowTitle('Search')
        self.mainLayout.addLayout(self.flayout, 0, 0)
        self.mainLayout.addWidget(self.table, 0, 1, 1, 2)
        self.mainLayout.addWidget(self.label, 1, 0)
        self.mainLayout.addWidget(self.button4, 1, 1)
        self.mainLayout.addWidget(self.button3, 1, 2)
        self.mainLayout.addWidget(button1, 2, 0)
        self.mainLayout.addWidget(button2, 2, 1, 1, 2)

        self.setLayout(self.mainLayout)

    def getInputData(self):
        inputData = {
            self.flayout.itemAt(2 * i).widget().text():
            self.flayout.itemAt(2 * i + 1).widget().text()
            for i in range(int(self.flayout.count() / 2) - 1)
        }
        inputData['source'] = self.comboBox.currentText()
        return inputData

    def search(self):
        inputData = self.getInputData()
        source = inputData.pop('source')
        self.scraper = Scraper(inputData, source)
        logging.info('Scraper search' + str(inputData))
        results = self.scraper.search()
        self.table.fillTable(results)
        if self.scraper.total > 10:
            self.button3.setVisible(True)
        self.update_label()

    def update_label(self):
        self.label.setText('Page {} of {}'.format(
            self.scraper.page,
            int(self.scraper.total / 10) + 1))
        self.label.setVisible(True)

    def next_results(self):
        self.scraper.page += 1
        results = self.scraper.search()
        self.table.fillTable(results)
        self.button4.setVisible(True)
        if self.scraper.total <= 10 * self.scraper.page:
            self.button3.setVisible(False)
        self.update_label()

    def previous_results(self):
        self.scraper.page -= 1
        results = self.scraper.search()
        self.table.fillTable(results)
        self.button3.setVisible(True)
        if self.scraper.page <= 1:
            self.button4.setVisible(False)
        self.update_label()

    def openDocument(self, y):
        if 'http' in y.data():
            webbrowser.open(y.data(), new=2)

    def save(self):
        index = self.table.selectionModel().selectedRows()
        if len(index) > 0:
            new_data = {
                self.table.horizontalHeaderItem(i).text():
                str(self.table.model().index(index[0].row(), i).data())
                for i in range(self.table.columnCount())
            }
            if 'document' in new_data and 'pdf' in new_data['document']:
                new_data = self.save_file(new_data)
            row_index = self.model.rowCount(QModelIndex())
            record = self.model.record()
            record.setGenerated('id', False)
            record.setValue('created', QDateTime.currentDateTime())
            for column in new_data:
                record.setValue(column, new_data[column])
            self.model.insertRecord(-1, record)

    def save_file(self, new_data):
        if 'document' in new_data and len(new_data['document']) > 0:
            author = ', '.join(
                re.findall(r'(\w*)(?:$|,)', new_data.get('author'))[:-1])
            title = re.sub(r"[^a-zA-Z0-9]+", ' ', new_data.get('title'))
            date = new_data.get('date') if new_data.get('date') else ''
            filename = date + ' ' + title + ' - ' + author + '.pdf'
            path = os.path.join(cfg['temp'], filename)
            logging.info('Trying to save file ' + filename)
            if not os.path.exists(path):
                response = requests.get(new_data['document'], headers=_HEADERS)
                if response.ok:
                    try:
                        with open(path, 'wb') as f:
                            f.write(response.content)
                        try:
                            new_data['length'] = PdfFileReader(open(
                                path, 'rb')).getNumPages()
                        except:
                            display_text = 'Corrupted document ' + filename
                        new_data['document'] = filename
                        display_text = 'Saved document ' + filename
                    except:
                        display_text = 'Dowload document successful, but not possible to save.'
                        new_data['document'] = ''
                else:
                    display_text = 'Dowload document not successful.'
                    new_data['document'] = ''
            else:
                display_text = 'File ' + filename + 'already exists.'
        else:
            display_text = 'There is no document to save.'
        msgBox = QMessageBox()
        msgBox.setText(display_text)
        msgBox.exec_()
        logging.info(display_text)
        return new_data