import json
from datetime import datetime
from mongoengine import *
[documentos]class Parlamentar(EmbeddedDocument):
id = StringField(required=True)
nome = StringField()
partido = StringField()
uf = StringField()
foto = StringField()
cargo = StringField()
[documentos] def to_dict(self):
return {
'id': self.id,
'nome': self.nome,
'partido': self.partido,
'uf': self.uf,
'cargo': self.cargo,
'foto': self.foto
}
[documentos] def to_json(self):
return json.dumps(self.to_dict(), default=str)
[documentos]class Orgao(EmbeddedDocument):
nome = StringField(required=True)
sigla = StringField()
cargo = StringField()
apelido = StringField()
[documentos] def to_dict(self):
return {
'nome': self.nome,
'sigla': self.sigla,
'cargo': self.cargo,
'apelido': self.apelido
}
[documentos]class Proposicao(EmbeddedDocument):
id = StringField()
tipo = StringField(required=True)
ementa = StringField()
numero = StringField()
url_documento = URLField(db_field='urlDocumento')
url_autores = URLField(db_field='urlAutores')
data_apresentacao = DateTimeField(db_field='dataApresentacao')
voto = StringField()
pauta = StringField()
[documentos] def to_dict(self):
return {
'id': self.id,
'numero': self.numero,
'tipo': self.tipo,
'ementa': self.ementa,
'urlDocumento': self.url_documento,
'urlAutores': self.url_autores,
'dataApresentacao': self.data_apresentacao,
'voto': self.voto,
'pauta': self.pauta
}
[documentos]class Evento(EmbeddedDocument):
id = StringField(required=True)
nome = StringField(required=True)
data_inicial = DateTimeField(db_field='dataInicial')
data_final = DateTimeField(db_field='dataFinal')
url = URLField()
situacao = StringField()
presenca = IntField(default=-1)
pautas = EmbeddedDocumentListField(Proposicao)
orgaos = EmbeddedDocumentListField(Orgao)
[documentos] def set_ausencia_evento_nao_esperado(self):
self.presenca = 1
[documentos] def set_ausencia_evento_esperado(self):
self.presenca = 2
[documentos] def set_ausente_evento_previsto(self):
self.presenca = 3
[documentos] def to_dict(self):
dicionario = {
'id': self.id,
'nome': self.nome,
'dataInicial': self.data_inicial,
'dataFinal': self.data_final,
'url': self.url,
'situacao': self.situacao,
'presenca': self.presenca,
'pautas': [],
'orgaos': []
}
for orgao in self.orgaos:
dicionario['orgaos'].append(orgao.to_dict())
for pauta in self.pautas:
dicionario['pautas'].append(pauta.to_dict())
return dicionario
[documentos]class Relatorio(Document):
idTemp = StringField()
parlamentar = EmbeddedDocumentField(Parlamentar, required=True)
data_inicial = DateTimeField(db_field='dataInicial')
data_final = DateTimeField(db_field='dataFinal')
aviso_dados = StringField(db_field='mensagem', null=True)
orgaos = EmbeddedDocumentListField(Orgao)
proposicoes = EmbeddedDocumentListField(Proposicao)
eventos_presentes = EmbeddedDocumentListField(Evento, db_field='eventosPresentes')
eventos_ausentes = EmbeddedDocumentListField(Evento, db_field='eventosAusentes')
eventos_previstos = EmbeddedDocumentListField(Evento, db_field='eventosPrevistos')
presenca_relativa = FloatField(db_field='presencaRelativa', default=0.0)
presenca_absoluta = FloatField(db_field='presencaTotal', default=0.0)
eventos_ausentes_esperados_total = IntField(db_field='eventosAusentesEsperadosTotal', default=0)
meta = {'collection': 'relatorios'}
def _calcular_presenca_relativa(self):
ausencia_relativa = len([x for x in self.eventos_ausentes if x.presenca > 1])
try:
return 100 * len(self.eventos_presentes) / (ausencia_relativa + len(self.eventos_presentes))
except ZeroDivisionError:
return 0 if len(self.eventos_presentes) == 0 else 100
def _calcular_presenca_absoluta(self):
try:
return 100 * len(self.eventos_presentes) / (len(self.eventos_ausentes) + len(self.eventos_presentes))
except ZeroDivisionError:
return 0 if len(self.eventos_presentes) == 0 else 100
[documentos] def to_dict(self):
relatorio = {
'_id': str(self.pk),
'parlamentar': self.parlamentar.to_dict(),
'mensagem': self.aviso_dados,
'dataInicial': self.data_inicial,
'dataFinal': self.data_final,
'orgaos': [],
'proposicoes': [],
'eventosPresentes': [],
'eventosAusentes': [],
'eventosPrevistos': [],
'presencaRelativa': '{0:.2f}%'.format(self._calcular_presenca_relativa()),
'presencaTotal': '{0:.2f}%'.format(self._calcular_presenca_absoluta()),
'eventosAusentesEsperadosTotal': self.eventos_ausentes_esperados_total
}
for orgao in self.orgaos:
relatorio['orgaos'].append(orgao.to_dict())
for proposicao in self.proposicoes:
relatorio['proposicoes'].append(proposicao.to_dict())
for evento in self.eventos_presentes:
relatorio['eventosPresentes'].append(evento.to_dict())
for evento in self.eventos_ausentes:
relatorio['eventosAusentes'].append(evento.to_dict())
for evento in self.eventos_previstos:
relatorio['eventosPrevistos'].append(evento.to_dict())
return relatorio
[documentos] def to_json(self):
return json.dumps(self.to_dict(), default=str)