from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QTableWidget, QTableWidgetItem, QHeaderView, QFileDialog, QMessageBox, QProgressDialog) from PySide6.QtCore import Qt, Signal import os from database import get_session from models import Document from document_form import DocumentForm class BatchUploadWidget(QWidget): upload_completed = Signal() def __init__(self, parent=None): super().__init__(parent) self.files_to_upload = [] self.folder_id = None self.setup_ui() def setup_ui(self): layout = QVBoxLayout(self) # Buttons button_layout = QHBoxLayout() self.add_files_btn = QPushButton("Adicionar Arquivos") self.add_files_btn.clicked.connect(self.add_files) self.remove_files_btn = QPushButton("Remover Selecionados") self.remove_files_btn.clicked.connect(self.remove_selected_files) self.upload_all_btn = QPushButton("Upload em Lote") self.upload_all_btn.clicked.connect(self.upload_all) button_layout.addWidget(self.add_files_btn) button_layout.addWidget(self.remove_files_btn) button_layout.addWidget(self.upload_all_btn) layout.addLayout(button_layout) # Files table self.files_table = QTableWidget() self.files_table.setColumnCount(2) self.files_table.setHorizontalHeaderLabels(["Nome do Arquivo", "Caminho"]) self.files_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) layout.addWidget(self.files_table) # Create document form for metadata self.doc_form = DocumentForm() layout.addWidget(self.doc_form) def add_files(self): files, _ = QFileDialog.getOpenFileNames( self, "Selecionar Arquivos", "", "Todos os Arquivos (*);;PDF (*.pdf);;Imagens (*.png *.jpg);;Documentos (*.doc *.docx)" ) for file_path in files: if file_path not in [self.files_table.item(row, 1).text() for row in range(self.files_table.rowCount())]: row = self.files_table.rowCount() self.files_table.insertRow(row) self.files_table.setItem(row, 0, QTableWidgetItem(os.path.basename(file_path))) self.files_table.setItem(row, 1, QTableWidgetItem(file_path)) def remove_selected_files(self): rows = set(item.row() for item in self.files_table.selectedItems()) for row in sorted(rows, reverse=True): self.files_table.removeRow(row) def upload_all(self): if not self.validate_form(): return progress = QProgressDialog( "Fazendo upload dos arquivos...", "Cancelar", 0, self.files_table.rowCount(), self ) progress.setWindowModality(Qt.WindowModal) try: session = get_session() for row in range(self.files_table.rowCount()): if progress.wasCanceled(): break file_path = self.files_table.item(row, 1).text() # Create new document with metadata new_doc = Document( file_path=file_path, file_name=os.path.basename(file_path), marca=self.doc_form.marca_edit.text(), modelo=self.doc_form.modelo_edit.text(), ano=self.doc_form.ano_spin.value(), cilindrada=self.doc_form.cilindrada_edit.text(), codigo_motor=self.doc_form.codigo_motor_edit.text(), tipo_documento=self.doc_form.tipo_combo.currentText(), variante=self.doc_form.variante_combo.currentText(), observacoes=self.doc_form.observacoes_edit.toPlainText(), folder_id=self.folder_id ) session.add(new_doc) progress.setValue(row + 1) session.commit() session.close() QMessageBox.information(self, "Sucesso", "Upload em lote concluído com sucesso!") self.clear_form() self.upload_completed.emit() except Exception as e: QMessageBox.critical(self, "Erro", f"Erro durante o upload em lote: {str(e)}") session.rollback() session.close() progress.close() def validate_form(self): if self.files_table.rowCount() == 0: QMessageBox.warning(self, "Validação", "Adicione pelo menos um arquivo.") return False if not self.doc_form.marca_edit.text(): QMessageBox.warning(self, "Validação", "Por favor, preencha a marca.") return False if not self.doc_form.modelo_edit.text(): QMessageBox.warning(self, "Validação", "Por favor, preencha o modelo.") return False return True def clear_form(self): self.files_table.setRowCount(0) self.doc_form.clear_form()