145 lines
5.2 KiB
Python
145 lines
5.2 KiB
Python
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()
|