Files
Inf_Tec_Auto/document_form.py
2024-12-19 09:03:36 -08:00

229 lines
8.7 KiB
Python

from PySide6.QtWidgets import (QWidget, QFormLayout, QLineEdit, QComboBox,
QTextEdit, QPushButton, QFileDialog, QSpinBox,
QVBoxLayout, QLabel, QMessageBox)
from database import get_session
from models import Document, Folder
import os
import shutil
from datetime import datetime
from preferences import Preferences
class DocumentForm(QWidget):
def __init__(self, folder_id=None, parent=None):
super().__init__(parent)
self.folder_id = folder_id
self.selected_file = None
self.preferences = Preferences()
self.setup_ui()
# Create documents directory if it doesn't exist
self.docs_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), "documentos")
if not os.path.exists(self.docs_dir):
os.makedirs(self.docs_dir)
def setup_ui(self):
layout = QVBoxLayout(self)
form_layout = QFormLayout()
# File selection
self.file_button = QPushButton("Selecionar Arquivo")
self.file_button.clicked.connect(self.select_file)
self.file_label = QLabel("Nenhum arquivo selecionado")
form_layout.addRow("Arquivo:", self.file_button)
form_layout.addRow("", self.file_label)
# Required fields
self.marca_edit = QLineEdit()
self.modelo_edit = QLineEdit()
self.ano_spin = QSpinBox()
self.ano_spin.setRange(1900, 2100)
self.ano_spin.setValue(2024)
form_layout.addRow("Marca*:", self.marca_edit)
form_layout.addRow("Modelo*:", self.modelo_edit)
form_layout.addRow("Ano*:", self.ano_spin)
# Optional fields
self.cilindrada_edit = QLineEdit()
self.codigo_motor_edit = QLineEdit()
form_layout.addRow("Cilindrada:", self.cilindrada_edit)
form_layout.addRow("Código Motor:", self.codigo_motor_edit)
# Document type
self.tipo_combo = QComboBox()
self.tipo_combo.addItems(["Elétrico", "Mecânico"])
form_layout.addRow("Tipo de Documento*:", self.tipo_combo)
# Variant
self.variante_combo = QComboBox()
self.variante_combo.addItems([
"Esquema", "Esquema OEM", "TSB",
"Esquemas Varios", "Documentação de Instruções"
])
form_layout.addRow("Variante*:", self.variante_combo)
# Observations
self.observacoes_edit = QTextEdit()
form_layout.addRow("Observações:", self.observacoes_edit)
layout.addLayout(form_layout)
# Save button
self.save_button = QPushButton("Salvar")
self.save_button.clicked.connect(self.save_document)
layout.addWidget(self.save_button)
def get_save_location(self, filename):
"""Prompt user for save location"""
base_path = self.preferences.get_save_path()
print(f"Base save path from preferences: {base_path}") # Debug print
if not base_path:
QMessageBox.warning(self, "Erro", "Por favor, configure o diretório de salvamento nas preferências primeiro.")
return None
# Get current folder path if folder_id is set
if self.folder_id:
print(f"Getting path for folder ID: {self.folder_id}") # Debug print
session = get_session()
folder = session.query(Folder).get(self.folder_id)
if folder:
print(f"Found folder: {folder.name}") # Debug print
current_folder = folder
path_parts = []
while current_folder:
path_parts.insert(0, current_folder.name)
current_folder = current_folder.parent
suggested_path = os.path.join(base_path, *path_parts, filename)
print(f"Suggested save path: {suggested_path}") # Debug print
else:
print(f"No folder found for ID: {self.folder_id}") # Debug print
suggested_path = os.path.join(base_path, filename)
session.close()
else:
print("No folder ID set") # Debug print
suggested_path = os.path.join(base_path, filename)
save_path, _ = QFileDialog.getSaveFileName(
self,
"Salvar Documento",
suggested_path,
"Todos os arquivos (*.*)"
)
print(f"User selected save path: {save_path}") # Debug print
return save_path
def select_file(self):
file_path, _ = QFileDialog.getOpenFileName(
self,
"Selecionar Documento",
"",
"Todos os arquivos (*.*);;Documentos PDF (*.pdf);;Imagens (*.png *.jpg *.jpeg)"
)
if file_path:
self.selected_file = file_path
self.file_label.setText(os.path.basename(file_path))
def save_document(self):
if not self.selected_file:
QMessageBox.warning(self, "Erro", "Por favor, selecione um arquivo primeiro.")
return
if not self.validate_form():
return
print(f"Starting document save process...") # Debug print
print(f"Current folder ID: {self.folder_id}") # Debug print
print(f"Selected file: {self.selected_file}") # Debug print
# Get save location from user
filename = os.path.basename(self.selected_file)
save_path = self.get_save_location(filename)
if not save_path:
print("Save cancelled - no path selected") # Debug print
return
try:
# Create directory if it doesn't exist
save_dir = os.path.dirname(save_path)
print(f"Creating directory: {save_dir}") # Debug print
os.makedirs(save_dir, exist_ok=True)
# Copy file to new location
print(f"Copying file from {self.selected_file} to {save_path}") # Debug print
shutil.copy2(self.selected_file, save_path)
# Create document record
session = get_session()
# Double check folder exists
if self.folder_id:
folder = session.query(Folder).get(self.folder_id)
print(f"Verified folder: {folder.name if folder else 'Not Found'}") # Debug print
document = Document(
file_path=save_path,
file_name=os.path.basename(save_path),
marca=self.marca_edit.text(),
modelo=self.modelo_edit.text(),
ano=self.ano_spin.value(),
cilindrada=self.cilindrada_edit.text(),
codigo_motor=self.codigo_motor_edit.text(),
tipo_documento=self.tipo_combo.currentText(),
variante=self.variante_combo.currentText(),
observacoes=self.observacoes_edit.toPlainText(),
folder_id=self.folder_id
)
print(f"Created document object with attributes:") # Debug print
print(f" file_path: {document.file_path}")
print(f" file_name: {document.file_name}")
print(f" folder_id: {document.folder_id}")
session.add(document)
session.commit()
print(f"Document saved to database with ID: {document.id}") # Debug print
session.close()
QMessageBox.information(self, "Sucesso", "Documento salvo com sucesso!")
self.clear_form()
except Exception as e:
print(f"Error saving document: {str(e)}") # Debug print
print(f"Error type: {type(e)}") # Debug print
import traceback
print(f"Stack trace: {traceback.format_exc()}") # Debug print
QMessageBox.critical(self, "Erro", f"Erro ao salvar documento: {str(e)}")
def validate_form(self):
if not self.selected_file:
QMessageBox.warning(self, "Validação",
"Por favor, selecione um arquivo.")
return False
if not self.marca_edit.text():
QMessageBox.warning(self, "Validação",
"Por favor, preencha a marca.")
return False
if not self.modelo_edit.text():
QMessageBox.warning(self, "Validação",
"Por favor, preencha o modelo.")
return False
return True
def clear_form(self):
self.selected_file = None
self.file_label.setText("Nenhum arquivo selecionado")
self.marca_edit.clear()
self.modelo_edit.clear()
self.ano_spin.setValue(2024)
self.cilindrada_edit.clear()
self.codigo_motor_edit.clear()
self.tipo_combo.setCurrentIndex(0)
self.variante_combo.setCurrentIndex(0)
self.observacoes_edit.clear()