diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..dc9ea49 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..65b5b08 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/python_poo.iml b/.idea/python_poo.iml new file mode 100644 index 0000000..8437fe6 --- /dev/null +++ b/.idea/python_poo.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/eleicoes/Interface_Eleicao.py b/eleicoes/Interface_Eleicao.py new file mode 100644 index 0000000..ff709bd --- /dev/null +++ b/eleicoes/Interface_Eleicao.py @@ -0,0 +1,14 @@ +from abc import ABCMeta, abstractmethod + +class Transparencia(metaclass=ABCMeta): + def __init__(self): + pass + + @abstractmethod + def to_csv(self): + pass + + @abstractmethod + def to_txt(self): + pass + diff --git a/eleicoes/common.py b/eleicoes/common.py new file mode 100644 index 0000000..b8e134e --- /dev/null +++ b/eleicoes/common.py @@ -0,0 +1,101 @@ +from abc import ABC, abstractmethod +import hashlib + +class Pessoa(ABC): + __nome : str + __RG : str + __CPF : str + + def __init__(self, nome, RG, CPF): + self.__nome = nome + self.__RG = RG + self.__CPF = CPF + + def __str__(self): + info = (f'Nome: {self.__nome}\n' + f'RG: {self.__RG}\n' + f'CPF: {self.__CPF}\n') + return info + + def __repr__(self): + return f"Pessoa(nome='{self.__nome}', RG='{self.__RG}', CPF='{self.__CPF}')" + + def get_nome(self): + return self.__nome + + @abstractmethod + def assinatura_eletronica(self): + pass + +class Eleitor(Pessoa): + __titulo : int + secao : int + zona : int + + def __init__(self, nome, RG, CPF, titulo, secao, zona): + super().__init__(nome, RG, CPF) + self.__titulo = titulo + self.secao = secao + self.zona = zona + + def __str__(self): + info = super().__str__() + info += (f'Titulo: {self.__titulo}\n' + f'Seção: {self.secao}\n' + f'Zona: {self.zona}\n') + return info + + def __repr__(self): + return f"Eleitor({super().__repr__()}, titulo='{self.__titulo}', secao='{self.secao}', zona='{self.zona}')" + + def get_titulo(self): + return self.__titulo + + def assinatura_eletronica(self): + dados_para_hash = self.__str__() + dados_em_byte = dados_para_hash.encode('utf-8') + hash = hashlib.sha256(dados_em_byte) + return hash.hexdigest() + +class Candidato(Pessoa): + __numero : int + + def __init__(self, nome, RG, CPF, numero): + super().__init__(nome, RG, CPF) + self.__numero = numero + + def __str__(self): + info = super().__str__() + info += (f'Numero: {self.__numero}\n') + return info + + def __repr__(self): + return f"Candidato({super().__repr__()}, numero='{self.__numero})'" + + def get_numero(self): + return self.__numero + + def assinatura_eletronica(self): + dados_para_hash = self.__str__() + dados_em_byte = dados_para_hash.encode('utf-8') + hash = hashlib.md5(dados_em_byte) + return hash.hexdigest() + +class Juiz(Pessoa): + __registro : int + + def __init__(self, nome : str, RG : str , CPF : str, registro :int): + super().__init__(nome, RG, CPF) + self.__registro = registro + + def __str__(self): + info = super().__str__() + info += f'Registro: {self.__registro}' + return info + + def assinatura_eletronica(self): + dados_para_hash = self.__str__() + dados_em_byte = dados_para_hash.encode('utf-8') + hash = hashlib.sha1(dados_em_byte) + return hash.hexdigest() + diff --git a/eleicoes/eleicao.py b/eleicoes/eleicao.py new file mode 100644 index 0000000..7300049 --- /dev/null +++ b/eleicoes/eleicao.py @@ -0,0 +1,82 @@ +import pickle +from typing import List +from common import * +from Interface_Eleicao import Transparencia +import csv + +class Urna(Transparencia): + mesario : Pessoa + __secao : int + __zona : int + __eleitores_presentes : List[Eleitor] = [] + __votos = {} #dicionario chave = numero do candidato, valor é a quantidade de votos + + def __init__(self, mesario : Pessoa, secao : int, zona : int, + candidatos : List[Candidato], eleitores : List[Eleitor]): + self.mesario = mesario + self.__secao = secao + self.__zona = zona + self.__nome_arquivo = f'{self.__zona}_{self.__secao}' + self.__candidatos = candidatos + self.__eleitores = [] + for eleitor in eleitores: + if eleitor.zona == zona and eleitor.secao == secao: + self.__eleitores.append(eleitor) + + for candidato in self.__candidatos: + self.__votos[candidato.get_numero()] = 0 + self.__votos['BRANCO'] = 0 + self.__votos['NULO'] = 0 + + with open(self.__nome_arquivo+'.pkl', 'wb') as arquivo: + pickle.dump(self.__votos, arquivo) + + def get_eleitor(self, titulo : int): + for eleitor in self.__eleitores: + if eleitor.get_titulo() == titulo: + return eleitor + return False + + def get_zona(self): + return self.__zona + + def get_secao(self): + return self.__secao + + def registrar_voto(self, eleitor : Eleitor, n_cand : int): + self.__eleitores_presentes.append(eleitor) + if n_cand in self.__votos: + self.__votos[n_cand] += 1 + else: + self.__votos['NULO'] += 1 + + with open(self.__nome_arquivo+'.pkl', 'wb') as arquivo: + pickle.dump(self.__votos, arquivo) + + def __str__(self): + info = f'Urna da seção {self.__secao}, zona {self.__zona}\n' + info += f'Mesario {self.mesario}\n' + return info + + def to_csv(self): + with open(self.__nome_arquivo+'.csv', mode='w', newline='') as file: + writer = csv.writer(file) + writer.writerow(['Seção', 'Zona', 'Eleitores Presentes']) + for eleitor in self.__eleitores: + writer.writerow([self.get_secao(), self.get_zona(), eleitor.get_titulo()]) + + def to_txt(self): + with open(self.__nome_arquivo+'.txt', mode='w') as file: + file.write(f'{self.__str__()}\n') + for eleitor in self.__eleitores: + file.write(f'{eleitor.get_titulo()}\n') + +if __name__ == "__main__": + c1 = Candidato("ADADADA", "223", "23123", 1) + c2 = Candidato("xxxxxxx", "333", "444", 2) + e1 = Eleitor("Jorge Pascal", "12389172389", "129837", 123123, 23, 4) + e2 = Eleitor("Olavo de Caralho", "9182738", "02984719", 343434, 23, 4) + mesario = Eleitor("Orasmo Reis", "10298730987123", "1928469", 9889889, 23, 4) + urna = Urna(mesario,23, 4, [c1, c2], [e1, e2]) + urna.to_txt() + urna.to_csv() diff --git a/eleicoes/gerenciar_urna.py b/eleicoes/gerenciar_urna.py new file mode 100644 index 0000000..9bee094 --- /dev/null +++ b/eleicoes/gerenciar_urna.py @@ -0,0 +1,30 @@ +from common import * +from eleicao import Urna + +def iniciar_urna(eleitores, candidatos): + print("Iniciando Urna") + print("==============") + secao = int(input("Número da secao: ")) + zona = int(input("Número da zona: ")) + + nome_mes = input("Nome do Mesario: ") + rg_mes = input("RG do Mesario: ") + cpf_mes = input("CPF do Mesario: ") + + mesario = Pessoa(nome_mes, rg_mes, cpf_mes) + + return Urna(mesario, secao, zona, candidatos, eleitores) + +def votar(urna : Urna): + titulo_eleitor = int(input("Digite o titulo do eleitor: ")) + eleitor = urna.get_eleitor(titulo_eleitor) + + if not eleitor: + raise Exception("Eleitor não é desta Urna") + + print(eleitor) + print("Pode votar!") + print("===========") + voto = int(input("Digite o numero do candidato: ")) + urna.registrar_voto(eleitor, voto) + diff --git a/eleicoes/main.py b/eleicoes/main.py new file mode 100644 index 0000000..ada9874 --- /dev/null +++ b/eleicoes/main.py @@ -0,0 +1,130 @@ +import pickle +import traceback +import gerenciar_urna +from common import * + +FILE_ELEITORES = 'eleitores.pkl' +FILE_CANDIDATOS = 'candidatos.pkl' + +def menu(): + print("1-Novo Eleitor") + print("2-Atualizar Eleitor") + print("3-Inserir Candidato") + print("4-Listar Candidatos") + print("5-Iniciar Urna") + print("6-Testar Urna") + print("7-Sair") + op = int(input("Digite a opcao [1 a 7]? ")) + while op not in range(1, 8): + op = int(input("Digite a opcao [1 a 7]? ")) + return op + +def inserir_eleitor(eleitores): + titulo = int(input("Digite o Títlulo: ")) + + if titulo in eleitores: + raise Exception("Titulo já existente!") + + nome = input("Digite o nome: ") + RG = input("Digite o RG: ") + CPF = input("Digite o CPF: ") + secao = int(input("Digite a secao: ")) + zona = int(input("Digite a zona: ")) + + eleitor = Eleitor(nome, RG, CPF, titulo, secao, zona) + eleitores[eleitor.get_titulo()] = eleitor + + with open(FILE_ELEITORES, 'wb') as arquivo: + pickle.dump(eleitores, arquivo) + + print('Eleitor gravado com sucesso!') + print(eleitor) + +def atualizar_eleitor(eleitores): + titulo = int(input('Digite o titulo do eleitor: ')) + + if titulo in eleitores: + eleitor = eleitores[titulo] + print(eleitor) + secao = int(input("Digite a nova secao: ")) + zona = int(input("Digite a nova zona: ")) + eleitor.secao = secao + eleitor.zona = zona + + with open(FILE_ELEITORES, 'wb') as arquivo: + pickle.dump(eleitores, arquivo) + + print('Atualizados dados do eleitor!') + print(eleitor) + else: + raise Exception('Titulo inexistente') + +def inserir_candidato(candidatos): + numero = int(input("Digite o número do candidato: ")) + + if numero in candidatos: + raise Exception("Candidato já existente!") + + nome = input("Digite o nome: ") + RG = input("Digite o RG: ") + CPF = input("Digite o CPF: ") + + candidato = Candidato(nome, RG, CPF, numero) + candidatos[candidato.get_numero()] = candidato + + with open(FILE_CANDIDATOS, 'wb') as arquivo: + pickle.dump(candidatos, arquivo) + + print('Candidato gravado com sucesso!') + print(candidato) + +def listar_candidatos(candidatos): + for candidato in candidatos.values(): + print(candidato) + +if __name__ == "__main__": + eleitores = {} #dicionário a chave será o titulo + try: + print("Carregando arquivo de eleitores ...") + + with open(FILE_ELEITORES, 'rb') as arquivo: + eleitores = pickle.load(arquivo) + except FileNotFoundError as fnfe: + print(fnfe) + print("Arquivo nao encontrado, nenhum eleitor carregado!") + + candidatos = {} # dicionário a chave será o titulo + try: + print("Carregando arquivo de candidatos ...") + + with open(FILE_CANDIDATOS, 'rb') as arquivo: + candidatos = pickle.load(arquivo) + except FileNotFoundError as fnfe: + print(fnfe) + print("Arquivo nao encontrado, nenhum candidato carregado!") + + opcao = 1 + while opcao in range(1,8): + try: + opcao = menu() + + if opcao == 1: + inserir_eleitor(eleitores) + elif opcao == 2: + atualizar_eleitor(eleitores) + elif opcao == 3: + inserir_candidato(candidatos) + elif opcao == 4: + listar_candidatos(candidatos) + elif opcao == 5: + urna = gerenciar_urna.iniciar_urna(eleitores.values(), + candidatos.values()) + elif opcao == 6: + gerenciar_urna.votar(urna) + elif opcao == 7: + print("Saindo!") + break + except Exception as e: + #traceback.print_exc() + print(e) + diff --git a/eleicoes/tribunal.py b/eleicoes/tribunal.py new file mode 100644 index 0000000..0151a87 --- /dev/null +++ b/eleicoes/tribunal.py @@ -0,0 +1,93 @@ +from Interface_Eleicao import * +from typing import List +from common import * +import csv + +class Denuncia: + __numero : int + __denunciante : Pessoa + __denunciado : Pessoa + __juiz : Juiz + __txt_denuncia : str + __txt_sentenca : str + + def __init__(self, n: int, denunciante : Pessoa, + denunciado : Pessoa, txt_denuncia : str): + self.__numero = n + self.__denunciante = denunciante + self.__denunciado = denunciado + self.__txt_denuncia = txt_denuncia + + def julgar(self, j : Juiz, txt_sentenca : str): + self.__juiz = j + self.__txt_sentenca = txt_sentenca + + def __str__(self): + if self.__txt_sentenca == None: + info = f'Denuncia {self.__numero}. Sentenca não proferida' + else: + info = f'Denuncia {self.__numero}\n' + info += f'Denunciante\n{self.__denunciante}\n' + info += f'Assinatura: {self.__denunciante.assinatura_eletronica()}\n' + info += f'Denunciado\n{self.__denunciado}\n' + info += f'Assinatura: {self.__denunciado.assinatura_eletronica()}\n' + info += f'Denuncia: {self.__txt_denuncia}\n' + info += f'Sentença\n{self.__txt_sentenca}\n' + info += f'Juiz\n{self.__juiz}\n' + info += f'Assinatura: {self.__juiz.assinatura_eletronica()}' + return info + + def get_denunciante(self): + return self.__denunciante + + def get_denunciado(self): + return self.__denunciado + + def get_juiz(self): + return self.__juiz + + def get_txt_sentenca(self): + return self.__txt_sentenca + + def get_txt_denuncia(self): + return self.__txt_denuncia + +class Jurisprudencia(Transparencia): + ano : int + denuncias : List[Denuncia] + + def __init__(self, a:int): + self.ano = a + self.denuncias = [] + + def add_denuncia(self, d: Denuncia): + self.denuncias.append(d) + + def to_csv(self): + with open(f'juris_{self.ano}.csv', mode='w', newline='') as file: + writer = csv.writer(file) + writer.writerow(['Denunciante', 'Denunciado', 'Denuncia', 'Sentença', 'Juiz']) + + for denuncia in self.denuncias: + writer.writerow([denuncia.get_denunciante().get_nome(), denuncia.get_denunciado().get_nome(), + denuncia.get_txt_denuncia(), denuncia.get_txt_sentenca(), + denuncia.get_juiz().get_nome()]) + + def to_txt(self): + with open(f'juris_{self.ano}.txt', mode='w') as file: + for denuncia in self.denuncias: + file.write(denuncia.__str__()) + + +if __name__ == "__main__": + j1 = Juiz("Alex Morales", "12312", 123123, 4456) + #p1 = Pessoa("Jose", 123123, 123123) + c1 = Candidato("ADADADA", "223", "23123", 1) + c2 = Candidato("xxxxxxx", "333", "444", 2) + denun = Denuncia(1, c1, c2, "Fake News!") + denun.julgar(j1, 'O denunciado é obrigado a pagar uma multa ao denunciante!') + juris1 = Jurisprudencia(2024) + juris1.add_denuncia(denun) + juris1.to_csv() + juris1.to_txt() + print(denun) diff --git a/src/frota.py b/exemplo_carro/frota.py similarity index 59% rename from src/frota.py rename to exemplo_carro/frota.py index a4b3891..a77339a 100644 --- a/src/frota.py +++ b/exemplo_carro/frota.py @@ -2,39 +2,42 @@ class Carro: modelo : str marca : str cor : str - odometro : 0.0 - motor_on : False + __odometro = 0.0 + __motor_on = False def __init__(self, modelo : str, marca : str, cor : str, odometro : float, motor : bool): self.modelo = modelo self.marca = marca self.cor = cor - self.odometro = odometro - self.motor_on = motor + self.__odometro = odometro + self.__motor_on = motor def ligar(self): - if not self.motor_on: - self.motor_on = True + if not self.__motor_on: + self.__motor_on = True else: raise Exception("Erro: Motor já ligado!") def acelerar(self, velocidade : float, tempo : float): - if self.motor_on: - self.odometro += velocidade * tempo + if self.__motor_on: + self.__odometro += velocidade * tempo else: raise Exception("Erro: Não é possível acelerar! Motor desligado!") def desligar(self): - if self.motor_on: - self.motor_on = False + if self.__motor_on: + self.__motor_on = False else: raise Exception("Erro: Motor já desligado!") + def get_odometro(self): + return self.__odometro + def __str__(self): info = (f'Carro {self.modelo}, marca {self.marca}, ' - f'cor {self.cor}\n{self.odometro} Km, ' - f'motor {self.motor_on}') + f'cor {self.cor}\n{self.__odometro} Km, ' + f'motor {self.__motor_on}') return info diff --git a/src/main.py b/exemplo_carro/main.py similarity index 96% rename from src/main.py rename to exemplo_carro/main.py index 49c199e..782dc3a 100644 --- a/src/main.py +++ b/exemplo_carro/main.py @@ -13,7 +13,7 @@ ''' Controlando o carro até ele atingir 10000 Km ''' - while carro1.odometro < 10000: + while carro1.get_odometro() < 10000: try: print('1- Ligar motor') print('2- Desligar motor')