Files
Inf_Tec_Auto/search_view.py
2024-12-19 09:04:35 -08:00

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