Carregar ficheiros para "/"
This commit is contained in:
228
document_form.py
Normal file
228
document_form.py
Normal file
@ -0,0 +1,228 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user