Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/python_poo.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions eleicoes/Interface_Eleicao.py
Original file line number Diff line number Diff line change
@@ -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

101 changes: 101 additions & 0 deletions eleicoes/common.py
Original file line number Diff line number Diff line change
@@ -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()

82 changes: 82 additions & 0 deletions eleicoes/eleicao.py
Original file line number Diff line number Diff line change
@@ -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()
30 changes: 30 additions & 0 deletions eleicoes/gerenciar_urna.py
Original file line number Diff line number Diff line change
@@ -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)

Loading