185 lines
7.0 KiB
Python
185 lines
7.0 KiB
Python
from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QFormLayout,
|
|
QLineEdit, QComboBox, QPushButton, QTableWidget,
|
|
QTableWidgetItem, QSpinBox, QHeaderView, QMenu,
|
|
QMessageBox)
|
|
from PySide6.QtCore import Qt, Signal
|
|
from database import get_session
|
|
from models import Document
|
|
import os
|
|
from sqlalchemy import or_
|
|
from PySide6.QtGui import QColor
|
|
|
|
class SearchView(QWidget):
|
|
document_selected = Signal(int) # Signal emitted when document is selected
|
|
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent)
|
|
self.setup_ui()
|
|
|
|
def setup_ui(self):
|
|
layout = QVBoxLayout(self)
|
|
|
|
# Search form
|
|
form_layout = QFormLayout()
|
|
|
|
# Search fields
|
|
self.marca_edit = QLineEdit()
|
|
self.modelo_edit = QLineEdit()
|
|
self.ano_spin = QSpinBox()
|
|
self.ano_spin.setRange(1900, 2100)
|
|
self.ano_spin.setSpecialValueText(" ") # Empty string for no filter
|
|
|
|
self.tipo_combo = QComboBox()
|
|
self.tipo_combo.addItems(["", "Elétrico", "Mecânico"])
|
|
|
|
self.variante_combo = QComboBox()
|
|
self.variante_combo.addItems([
|
|
"",
|
|
"Esquema",
|
|
"Esquema OEM",
|
|
"TSB",
|
|
"Esquemas Varios",
|
|
"Documentação de Instruções"
|
|
])
|
|
|
|
self.observacoes_edit = QLineEdit()
|
|
self.observacoes_edit.setPlaceholderText("Digite sua busca...")
|
|
|
|
form_layout.addRow("Marca:", self.marca_edit)
|
|
form_layout.addRow("Modelo:", self.modelo_edit)
|
|
form_layout.addRow("Ano:", self.ano_spin)
|
|
form_layout.addRow("Tipo:", self.tipo_combo)
|
|
form_layout.addRow("Variante:", self.variante_combo)
|
|
form_layout.addRow("Observações:", self.observacoes_edit)
|
|
|
|
# Search button
|
|
button_layout = QHBoxLayout()
|
|
self.search_button = QPushButton("Pesquisar")
|
|
self.search_button.clicked.connect(self.perform_search)
|
|
self.clear_button = QPushButton("Limpar")
|
|
self.clear_button.clicked.connect(self.clear_search)
|
|
button_layout.addWidget(self.search_button)
|
|
button_layout.addWidget(self.clear_button)
|
|
|
|
# Add layouts to main layout
|
|
layout.addLayout(form_layout)
|
|
layout.addLayout(button_layout)
|
|
|
|
# Results table
|
|
self.results_table = QTableWidget()
|
|
self.results_table.setColumnCount(7)
|
|
self.results_table.setHorizontalHeaderLabels([
|
|
"Marca", "Modelo", "Ano", "Tipo", "Variante",
|
|
"Nome do Arquivo", "Observações"
|
|
])
|
|
self.results_table.horizontalHeader().setSectionResizeMode(
|
|
QHeaderView.ResizeToContents)
|
|
self.results_table.setContextMenuPolicy(Qt.CustomContextMenu)
|
|
self.results_table.customContextMenuRequested.connect(
|
|
self.show_context_menu)
|
|
layout.addWidget(self.results_table)
|
|
|
|
def perform_search(self):
|
|
session = get_session()
|
|
query = session.query(Document)
|
|
|
|
# Apply filters
|
|
if self.marca_edit.text():
|
|
query = query.filter(Document.marca.ilike(f"%{self.marca_edit.text()}%"))
|
|
|
|
if self.modelo_edit.text():
|
|
query = query.filter(Document.modelo.ilike(f"%{self.modelo_edit.text()}%"))
|
|
|
|
if self.ano_spin.value() != self.ano_spin.minimum():
|
|
query = query.filter(Document.ano == self.ano_spin.value())
|
|
|
|
if self.tipo_combo.currentText():
|
|
query = query.filter(Document.tipo_documento == self.tipo_combo.currentText())
|
|
|
|
if self.variante_combo.currentText():
|
|
query = query.filter(Document.variante == self.variante_combo.currentText())
|
|
|
|
if self.observacoes_edit.text():
|
|
query = query.filter(Document.observacoes.ilike(f"%{self.observacoes_edit.text()}%"))
|
|
|
|
# Get results
|
|
documents = query.all()
|
|
|
|
# Update table
|
|
valid_documents = []
|
|
for doc in documents:
|
|
if os.path.exists(doc.file_path):
|
|
valid_documents.append(doc)
|
|
else:
|
|
# Optional: Remove documents with missing files
|
|
session.delete(doc)
|
|
|
|
if len(documents) != len(valid_documents):
|
|
session.commit()
|
|
documents = valid_documents
|
|
|
|
self.results_table.setRowCount(len(documents))
|
|
for row, doc in enumerate(documents):
|
|
self.results_table.setItem(row, 0, QTableWidgetItem(doc.marca))
|
|
self.results_table.setItem(row, 1, QTableWidgetItem(doc.modelo))
|
|
self.results_table.setItem(row, 2, QTableWidgetItem(str(doc.ano)))
|
|
self.results_table.setItem(row, 3, QTableWidgetItem(doc.tipo_documento))
|
|
self.results_table.setItem(row, 4, QTableWidgetItem(doc.variante))
|
|
self.results_table.setItem(row, 5, QTableWidgetItem(doc.file_name))
|
|
self.results_table.setItem(row, 6, QTableWidgetItem(doc.observacoes))
|
|
|
|
# Store document ID in the first column
|
|
self.results_table.item(row, 0).setData(Qt.UserRole, doc.id)
|
|
|
|
session.close()
|
|
|
|
def clear_search(self):
|
|
self.marca_edit.clear()
|
|
self.modelo_edit.clear()
|
|
self.ano_spin.setValue(self.ano_spin.minimum())
|
|
self.tipo_combo.setCurrentIndex(0)
|
|
self.variante_combo.setCurrentIndex(0)
|
|
self.observacoes_edit.clear()
|
|
self.results_table.setRowCount(0)
|
|
|
|
def show_context_menu(self, position):
|
|
menu = QMenu()
|
|
open_action = menu.addAction("Abrir Documento")
|
|
open_folder_action = menu.addAction("Abrir Pasta")
|
|
|
|
action = menu.exec_(self.results_table.mapToGlobal(position))
|
|
|
|
current_row = self.results_table.currentRow()
|
|
if current_row >= 0:
|
|
doc_id = self.results_table.item(current_row, 0).data(Qt.UserRole)
|
|
|
|
if action == open_action:
|
|
self.open_document(doc_id)
|
|
elif action == open_folder_action:
|
|
self.open_document_folder(doc_id)
|
|
|
|
def open_document(self, doc_id):
|
|
session = get_session()
|
|
document = session.query(Document).get(doc_id)
|
|
|
|
if document and os.path.exists(document.file_path):
|
|
self.document_selected.emit(doc_id)
|
|
else:
|
|
QMessageBox.warning(self, "Erro",
|
|
"Não foi possível abrir o documento.")
|
|
|
|
session.close()
|
|
|
|
def open_document_folder(self, doc_id):
|
|
session = get_session()
|
|
document = session.query(Document).get(doc_id)
|
|
|
|
if document and os.path.exists(document.file_path):
|
|
folder_path = os.path.dirname(document.file_path)
|
|
os.startfile(folder_path)
|
|
else:
|
|
QMessageBox.warning(self, "Erro",
|
|
"Não foi possível abrir a pasta do documento.")
|
|
|
|
session.close()
|