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