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