IDs por categoria e remoção de ID adotado

This commit is contained in:
RinBa 2025-07-07 18:50:23 -03:00
parent e21068bdcb
commit 0347c95581
4 changed files with 53 additions and 14 deletions

View File

@ -9,10 +9,39 @@ class BancoDeDados:
self.pets = Persistente() self.pets = Persistente()
self.adocoes = Persistente() self.adocoes = Persistente()
def obter_proximo_id(self): def obter_proximo_id_pessoa(self):
ids_pessoas = [p.id for p in self.pessoas.listar_todos()] ids_pessoas = [p.id for p in self.pessoas.listar_todos()]
ids_pets = [p.id for p in self.pets.listar_todos()] return max(ids_pessoas) + 1 if ids_pessoas else 1
ids_adocoes = [a.id for a in self.adocoes.listar_todos()]
todos_ids = ids_pessoas + ids_pets + ids_adocoes def obter_proximo_id_pet(self):
return max(todos_ids) + 1 if todos_ids else 1 ids_pets = [p.id for p in self.pets.listar_todos()]
return max(ids_pets) + 1 if ids_pets else 1
def obter_proximo_id_adocao(self):
ids_adocoes = [a.id for a in self.adocoes.listar_todos()]
return max(ids_adocoes) + 1 if ids_adocoes else 1
def remover_pessoa(self, id_pessoa: int):
adocoes_para_remover = [
adocao for adocao in self.adocoes.listar_todos()
if adocao.adotante.id == id_pessoa
]
for adocao in adocoes_para_remover:
self.adocoes.remover(adocao.id)
self.pessoas.remover(id_pessoa)
def remover_pet(self, id_pet: int):
adocoes_para_remover = []
for adocao in self.adocoes.listar_todos():
itens_para_manter = [item for item in adocao.itens if item.pet.id != id_pet]
if len(itens_para_manter) < len(adocao.itens):
adocao.itens = itens_para_manter
if not adocao.itens:
adocoes_para_remover.append(adocao.id)
for adocao_id in adocoes_para_remover:
self.adocoes.remover(adocao_id)
self.pets.remover(id_pet)

View File

@ -154,7 +154,7 @@ class FrameAdocao(tk.Frame):
data = dialog.result["data"] data = dialog.result["data"]
try: try:
proximo_id = self.bd.obter_proximo_id() proximo_id = self.bd.obter_proximo_id_adocao()
nova_adocao = Adocao(proximo_id, pessoa) nova_adocao = Adocao(proximo_id, pessoa)
for pet in pets: for pet in pets:

View File

@ -1,5 +1,6 @@
import tkinter as tk import tkinter as tk
from tkinter import ttk, messagebox, simpledialog from tkinter import ttk, messagebox, simpledialog
from persistencia.excecoes import EntidadeNaoEncontradaException
from modelo.pessoa import Pessoa from modelo.pessoa import Pessoa
@ -129,7 +130,7 @@ class FramePessoas(tk.Frame):
def adicionar_pessoa(self): def adicionar_pessoa(self):
nome = simpledialog.askstring("Adicionar Pessoa", "Digite o nome da nova pessoa:", parent=self) nome = simpledialog.askstring("Adicionar Pessoa", "Digite o nome da nova pessoa:", parent=self)
if nome: if nome:
proximo_id = self.bd.obter_proximo_id() proximo_id = self.bd.obter_proximo_id_pessoa()
nova_pessoa = Pessoa(proximo_id, nome) nova_pessoa = Pessoa(proximo_id, nome)
self.bd.pessoas.inserir(nova_pessoa) self.bd.pessoas.inserir(nova_pessoa)
self.popular_treeview() self.popular_treeview()
@ -171,11 +172,15 @@ 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}'?"):
msg = (f"Tem certeza que deseja apagar '{nome_pessoa}'?\n"
"AVISO: Todas as adoções associadas a esta pessoa também serão removidas.")
if messagebox.askyesno("Confirmar Exclusão", msg, icon='warning'):
try: try:
self.bd.pessoas.remover(id_pessoa) self.bd.remover_pessoa(id_pessoa)
self.popular_treeview() self.popular_treeview()
messagebox.showinfo("Sucesso", "Pessoa apagada com sucesso.") messagebox.showinfo("Sucesso", "Pessoa e suas adoções foram apagadas com sucesso.")
except EntidadeNaoEncontradaException as e: except EntidadeNaoEncontradaException as e:
messagebox.showerror("Erro", f"Não foi possível apagar: {e}\nA lista será atualizada.") messagebox.showerror("Erro", f"Não foi possível apagar: {e}\nA lista será atualizada.")
self.popular_treeview() self.popular_treeview()

View File

@ -1,5 +1,6 @@
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.pet import Pet from modelo.pet import Pet
from visao.componentes.dialogo_adicionar_pet import DialogoAdicionarPet, DialogoEditarPet from visao.componentes.dialogo_adicionar_pet import DialogoAdicionarPet, DialogoEditarPet
@ -137,7 +138,7 @@ class FramePet(tk.Frame):
if dialog.result: if dialog.result:
nome = dialog.result["nome"] nome = dialog.result["nome"]
especie = dialog.result["especie"] especie = dialog.result["especie"]
proximo_id = self.bd.obter_proximo_id() proximo_id = self.bd.obter_proximo_id_pet()
novo_pet = Pet(proximo_id, nome, especie) novo_pet = Pet(proximo_id, nome, especie)
self.bd.pets.inserir(novo_pet) self.bd.pets.inserir(novo_pet)
self.popular_treeview() self.popular_treeview()
@ -179,11 +180,15 @@ 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}'?"):
msg = (f"Tem certeza que deseja apagar '{nome_pet}'?\n"
"AVISO: O pet será removido de todas as adoções existentes.")
if messagebox.askyesno("Confirmar Exclusão", msg, icon='warning'):
try: try:
self.bd.pets.remover(id_pet) self.bd.remover_pet(id_pet)
self.popular_treeview() self.popular_treeview()
messagebox.showinfo("Sucesso", "Pet apagada com sucesso.") messagebox.showinfo("Sucesso", "Pet apagado com sucesso.")
except EntidadeNaoEncontradaException as e: except EntidadeNaoEncontradaException as e:
messagebox.showerror("Erro", f"Não foi possível apagar: {e}\nA lista será atualizada.") messagebox.showerror("Erro", f"Não foi possível apagar: {e}\nA lista será atualizada.")
self.popular_treeview() self.popular_treeview()