229 lines
8.7 KiB
Python
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()
|