Files
Inf_Tec_Auto/batch_upload.py
2024-12-19 09:03:07 -08:00

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()