Tratamento de erros

This commit is contained in:
Emersonjsc 2025-07-07 00:19:26 -03:00
parent 46e0ad6374
commit 053304f559
5 changed files with 143 additions and 28 deletions

View File

@ -78,3 +78,27 @@ class DialogoEditarAdocao(tk.Toplevel):
if self.adocao_atual.itens: if self.adocao_atual.itens:
self.entry_data.insert(0, self.adocao_atual.itens[0].data) self.entry_data.insert(0, self.adocao_atual.itens[0].data)
def _on_ok(self):
idx_pessoa = self.combo_pessoas.current()
if idx_pessoa == -1:
messagebox.showerror("Erro", "Por favor, selecione um adotante.", parent=self)
return
indices_pets = self.listbox_pets.curselection()
if not indices_pets:
messagebox.showerror("Erro", "Por favor, selecione pelo menos um pet.", parent=self)
return
data_str = self.entry_data.get()
try:
datetime.strptime(data_str, "%d-%m-%Y")
except ValueError:
messagebox.showerror("Erro de Formato", "A data deve estar no formato DD/MM/AAAA.", parent=self)
return
pessoa_selecionada = self.pessoas[idx_pessoa]
pets_selecionados = [self.pets[i] for i in indices_pets]
self.result = {"pessoa": pessoa_selecionada, "pets": pets_selecionados, "data": data_str}
self.destroy()

View File

@ -50,9 +50,9 @@ class DialogoNovaAdocao(tk.Toplevel):
scrollbar.pack(side="right", fill="y") scrollbar.pack(side="right", fill="y")
# Data # Data
tk.Label(main_frame, text="Data da Adoção (DD-MM-AAAA):", bg="#1e1e1e", fg="white").pack(anchor="w") tk.Label(main_frame, text="Data da Adoção (DD/MM/AAAA):", bg="#1e1e1e", fg="white").pack(anchor="w")
self.entry_data = tk.Entry(main_frame, bg="#2c2c2c", fg="white", insertbackground="white") self.entry_data = tk.Entry(main_frame, bg="#2c2c2c", fg="white", insertbackground="white")
self.entry_data.insert(0, datetime.now().strftime("%d-%m-%Y")) self.entry_data.insert(0, datetime.now().strftime("%d/%m/%Y"))
self.entry_data.pack(fill="x", pady=(0, 20)) self.entry_data.pack(fill="x", pady=(0, 20))
# Botões # Botões
@ -76,10 +76,15 @@ class DialogoNovaAdocao(tk.Toplevel):
messagebox.showerror("Erro", "Por favor, selecione pelo menos um pet.", parent=self) messagebox.showerror("Erro", "Por favor, selecione pelo menos um pet.", parent=self)
return return
data = self.entry_data.get() data_str = self.entry_data.get()
try:
datetime.strptime(data_str, "%d-%m-%Y")
except ValueError:
messagebox.showerror("Erro de Formato", "A data deve estar no formato DD-MM-AAAA.", parent=self)
return
pessoa_selecionada = self.pessoas[idx_pessoa] pessoa_selecionada = self.pessoas[idx_pessoa]
pets_selecionados = [self.pets[i] for i in indices_pets] pets_selecionados = [self.pets[i] for i in indices_pets]
self.result = {"pessoa": pessoa_selecionada, "pets": pets_selecionados, "data": data} self.result = {"pessoa": pessoa_selecionada, "pets": pets_selecionados, "data": data_str}
self.destroy() self.destroy()

View File

@ -1,9 +1,10 @@
import tkinter as tk import tkinter as tk
from tkinter import ttk, messagebox from tkinter import ttk, messagebox
from persistencia.excecoes import EntidadeNaoEncontradaException
from modelo.adocao import Adocao from modelo.adocao import Adocao
from modelo.item_adocao import ItemAdocao from modelo.item_adocao import ItemAdocao
from visao.componentes.dialogo_nova_adocao import DialogoNovaAdocao from visao.componentes.dialogo_nova_adocao import DialogoNovaAdocao
from visao.componentes.dialogo_editar_adocao import DialogoEditarAdocao
class FrameAdocao(tk.Frame): class FrameAdocao(tk.Frame):
@ -14,6 +15,7 @@ class FrameAdocao(tk.Frame):
self.popular_treeview() self.popular_treeview()
def _criar_layout(self): def _criar_layout(self):
# Título da seção
titulo_label = tk.Label( titulo_label = tk.Label(
self, self,
text="GERENCIAR ADOÇÕES", text="GERENCIAR ADOÇÕES",
@ -23,6 +25,7 @@ class FrameAdocao(tk.Frame):
) )
titulo_label.pack(pady=20) titulo_label.pack(pady=20)
# Frame de busca
busca_frame = tk.Frame(self, bg="#1e1e1e") busca_frame = tk.Frame(self, bg="#1e1e1e")
busca_frame.pack(pady=5, padx=20, fill="x") busca_frame.pack(pady=5, padx=20, fill="x")
@ -60,8 +63,10 @@ class FrameAdocao(tk.Frame):
tree_container = tk.Frame(self, bg="#1e1e1e") tree_container = tk.Frame(self, bg="#1e1e1e")
tree_container.pack(pady=10, padx=20, fill="both", expand=True) tree_container.pack(pady=10, padx=20, fill="both", expand=True)
# Configuração da Treeview para um modo hierárquico
self.tree = ttk.Treeview(tree_container, columns=("data",), show="tree headings") self.tree = ttk.Treeview(tree_container, columns=("data",), show="tree headings")
# Coluna #0 (a árvore)
self.tree.heading("#0", text="Detalhes da Adoção", anchor="w") self.tree.heading("#0", text="Detalhes da Adoção", anchor="w")
self.tree.column("#0", anchor="w", stretch=tk.YES, minwidth=250) self.tree.column("#0", anchor="w", stretch=tk.YES, minwidth=250)
@ -79,6 +84,7 @@ class FrameAdocao(tk.Frame):
botoes_frame = tk.Frame(self, bg="#1e1e1e") botoes_frame = tk.Frame(self, bg="#1e1e1e")
botoes_frame.pack(pady=10, padx=20, fill="x") botoes_frame.pack(pady=10, padx=20, fill="x")
# Botão Nova Adoção
btn_adicionar = tk.Button( btn_adicionar = tk.Button(
botoes_frame, botoes_frame,
text="Nova Adoção", text="Nova Adoção",
@ -92,13 +98,29 @@ class FrameAdocao(tk.Frame):
) )
btn_adicionar.pack(side="left", padx=5) btn_adicionar.pack(side="left", padx=5)
btn_alterar = tk.Button(
botoes_frame,
text="Alterar",
command=self.alterar_adocao,
bg="#ffc107",
fg="white",
font=("Arial", 12),
relief="flat",
padx=10,
pady=5
)
btn_alterar.pack(side="left", padx=5)
def popular_treeview(self, lista_adocoes=None): def popular_treeview(self, lista_adocoes=None):
# Limpa a árvore
for i in self.tree.get_children(): for i in self.tree.get_children():
self.tree.delete(i) self.tree.delete(i)
if lista_adocoes is None: if lista_adocoes is None:
lista_adocoes = self.bd.adocoes.listar_todos() lista_adocoes = self.bd.adocoes.listar_todos()
# Popula com os dados de adoções do banco de dados
for adocao in lista_adocoes: for adocao in lista_adocoes:
# Nó pai para a adoção # Nó pai para a adoção
adocao_node = self.tree.insert( adocao_node = self.tree.insert(
@ -108,10 +130,13 @@ class FrameAdocao(tk.Frame):
open=True open=True
) )
# Nó filho para o adotante
self.tree.insert(adocao_node, "end", text=f"Adotante: {adocao.adotante.nome}") self.tree.insert(adocao_node, "end", text=f"Adotante: {adocao.adotante.nome}")
# Nó "pasta" para os pets
pets_node = self.tree.insert(adocao_node, "end", text="Pets Adotados", open=True) pets_node = self.tree.insert(adocao_node, "end", text="Pets Adotados", open=True)
# Nós filhos para cada pet adotado
for item in adocao.itens: for item in adocao.itens:
self.tree.insert( self.tree.insert(
pets_node, "end", pets_node, "end",
@ -142,6 +167,51 @@ class FrameAdocao(tk.Frame):
except Exception as e: except Exception as e:
messagebox.showerror("Erro", f"Ocorreu um erro ao registrar a adoção:\n{e}") messagebox.showerror("Erro", f"Ocorreu um erro ao registrar a adoção:\n{e}")
def _obter_id_adocao_selecionada(self):
"""Obtém o ID da adoção a partir do item selecionado na Treeview."""
selecionado = self.tree.selection()
if not selecionado:
messagebox.showwarning("Aviso", "Por favor, selecione uma adoção.")
return None
item_id = selecionado[0]
# O iid do nó pai da adoção é 'adocao_ID'
if not item_id.startswith("adocao_"):
# Se um item filho for selecionado, encontra o pai
item_id = self.tree.parent(item_id)
if not item_id.startswith("adocao_"):
item_id = self.tree.parent(item_id)
try:
return int(item_id.split('_')[1])
except (IndexError, ValueError):
return None
def alterar_adocao(self):
id_adocao = self._obter_id_adocao_selecionada()
if id_adocao is None:
return
try:
adocao_atual = self.bd.adocoes.buscar_por_id(id_adocao)
dialog = DialogoEditarAdocao(self, self.bd, adocao_atual)
self.wait_window(dialog)
if dialog.result:
# Atualiza os dados da adoção
adocao_atual.adotante = dialog.result["pessoa"]
adocao_atual.itens.clear() # Limpa os pets antigos
for pet in dialog.result["pets"]:
item = ItemAdocao(pet, dialog.result["data"])
adocao_atual.adicionar_item(item)
self.bd.adocoes.alterar(adocao_atual.id, adocao_atual)
self.popular_treeview()
messagebox.showinfo("Sucesso", "Adoção alterada com sucesso.")
except EntidadeNaoEncontradaException as e:
messagebox.showerror("Erro", f"Não foi possível alterar: {e}\nA lista será atualizada.")
self.popular_treeview()
def _realizar_busca(self): def _realizar_busca(self):
termo_busca = self.entry_busca.get().strip().lower() termo_busca = self.entry_busca.get().strip().lower()
if not termo_busca: if not termo_busca:

View File

@ -152,12 +152,16 @@ class FramePessoas(tk.Frame):
) )
if novo_nome and novo_nome.strip() and novo_nome.strip() != nome_atual: if novo_nome and novo_nome.strip() and novo_nome.strip() != nome_atual:
pessoa = self.bd.pessoas.buscar_por_id(id_pessoa) try:
if pessoa: pessoa = self.bd.pessoas.buscar_por_id(id_pessoa)
pessoa.nome = novo_nome.strip() if pessoa:
self.bd.pessoas.alterar(pessoa.id, pessoa) pessoa.nome = novo_nome.strip()
self.bd.pessoas.alterar(pessoa.id, pessoa)
self.popular_treeview()
messagebox.showinfo("Sucesso", "Pessoa alterada com sucesso.")
except EntidadeNaoEncontradaException as e:
messagebox.showerror("Erro", f"Não foi possível alterar: {e}\nA lista será atualizada.")
self.popular_treeview() self.popular_treeview()
messagebox.showinfo("Sucesso", "Pessoa alterada com sucesso.")
def apagar_pessoa(self): def apagar_pessoa(self):
selecionado = self.tree.selection() selecionado = self.tree.selection()
@ -168,9 +172,13 @@ class FramePessoas(tk.Frame):
item = self.tree.item(selecionado[0]) item = self.tree.item(selecionado[0])
id_pessoa, nome_pessoa = item['values'] id_pessoa, nome_pessoa = item['values']
if messagebox.askyesno("Confirmar", f"Tem certeza que deseja apagar '{nome_pessoa}'?"): if messagebox.askyesno("Confirmar", f"Tem certeza que deseja apagar '{nome_pessoa}'?"):
self.bd.pessoas.remover(id_pessoa) try:
self.popular_treeview() self.bd.pessoas.remover(id_pessoa)
messagebox.showinfo("Sucesso", "Pessoa apagada com sucesso.") self.popular_treeview()
messagebox.showinfo("Sucesso", "Pessoa apagada com sucesso.")
except EntidadeNaoEncontradaException as e:
messagebox.showerror("Erro", f"Não foi possível apagar: {e}\nA lista será atualizada.")
self.popular_treeview()
def _realizar_busca(self): def _realizar_busca(self):
termo_busca = self.entry_busca.get().strip().lower() termo_busca = self.entry_busca.get().strip().lower()

View File

@ -152,20 +152,24 @@ class FramePet(tk.Frame):
item = self.tree.item(selecionado[0]) item = self.tree.item(selecionado[0])
id_pet, _, _ = item['values'] id_pet, _, _ = item['values']
pet_atual = self.bd.pets.buscar_por_id(id_pet) try:
if not pet_atual: pet_atual = self.bd.pets.buscar_por_id(id_pet)
messagebox.showerror("Erro", "Pet não encontrado no banco de dados.") if not pet_atual:
return messagebox.showerror("Erro", "Pet não encontrado no banco de dados.")
return
dialog = DialogoEditarPet(self, pet_atual) dialog = DialogoEditarPet(self, pet_atual)
self.wait_window(dialog) self.wait_window(dialog)
if dialog.result: if dialog.result:
pet_atual.nome = dialog.result["nome"] pet_atual.nome = dialog.result["nome"]
pet_atual.especie = dialog.result["especie"] pet_atual.especie = dialog.result["especie"]
self.bd.pets.alterar(pet_atual.id, pet_atual) self.bd.pets.alterar(pet_atual.id, pet_atual)
self.popular_treeview()
messagebox.showinfo("Sucesso", "Pet alterado com sucesso.")
except EntidadeNaoEncontradaException as e:
messagebox.showerror("Erro", f"Não foi possível alterar: {e}\nA lista será atualizada.")
self.popular_treeview() self.popular_treeview()
messagebox.showinfo("Sucesso", "Pet alterado com sucesso.")
def apagar_pet(self): def apagar_pet(self):
selecionado = self.tree.selection() selecionado = self.tree.selection()
@ -176,9 +180,13 @@ class FramePet(tk.Frame):
item = self.tree.item(selecionado[0]) item = self.tree.item(selecionado[0])
id_pet, nome_pet, _ = item['values'] # Ignora a espécie, que agora está na treeview id_pet, nome_pet, _ = item['values'] # Ignora a espécie, que agora está na treeview
if messagebox.askyesno("Confirmar", f"Tem certeza que deseja apagar '{nome_pet}'?"): if messagebox.askyesno("Confirmar", f"Tem certeza que deseja apagar '{nome_pet}'?"):
self.bd.pets.remover(id_pet) try:
self.popular_treeview() self.bd.pets.remover(id_pet)
messagebox.showinfo("Sucesso", "Pet apagada com sucesso.") self.popular_treeview()
messagebox.showinfo("Sucesso", "Pet apagada com sucesso.")
except EntidadeNaoEncontradaException as e:
messagebox.showerror("Erro", f"Não foi possível apagar: {e}\nA lista será atualizada.")
self.popular_treeview()
def _realizar_busca(self): def _realizar_busca(self):
termo_busca = self.entry_busca.get().strip().lower() termo_busca = self.entry_busca.get().strip().lower()