Radar Parlamentar
MES - 1º/2014
Equipe
- Carolina Ramalho
- Cleiton Gomes
- Eduardo Barbosa
- Matheus Souza
Resumo do Semestre
Ao total foram nove sprints, com duração média de uma semana cada, e que foram dispostas entre os dias 01 de abril a 23 de junho.
Onze issues foram realizadas pelo grupo ao longo deste período.
Sprint 0: 01/04 - 07/04
-
Configuração de ambiente
- Treinamento Python + Django
Sprint 1: 08/04 - 14/04
Consolidar Documentação
Eu como desenvolvedor quero reorganizar e consolidar a documentação existente no repositório para facilitar o entendimento do projeto e a configuração do ambiente dos novos colaboradores.
Radar na Mídia
Eu como usuário desejo ver as matérias publicadas sobre o radar.
Consolidar Documentação

Radar na Mídia

Sprint 2: 15/04 - 21/04
Casa Inexistente
Eu como usuário gostaria de receber uma mensagem informando caso tenha selecionado uma casa que não existe.
Caixa Lei de Acesso à Informação
Eu como usuário desejo ler o conteúdo completo da caixa lei de acesso a informação.
Utilização do South no projeto
Eu como desenvolvedor quero utilizar o plugin South no projeto, para facilitar a atualização do BD quando ocorrer alterações nas models.
Caixa Lei de Acesso à Informação
Sprint 3: 22/04 - 29/04
Mudar Nome dos Importadores
Eu como desenvolvedor quero que os importadores tenham como nome os “nomes curtos”
Mudar Nome dos Importadores
Sprint 4: 29/04 - 06/05
Adicionar Exceções no Log
Eu como desenvolvedor quero que as exceções (erros) sejam registrados no arquivo de log.
Adicionar Exceções no Log
import logging
logger = logging.getLogger("radar")
try:
theta = round(ap.theta, 0) % 180 + 90 * idx
except AttributeError, error:
logger.error("AttributeError: %s" % error)
theta = 0
Sprint 5: 07/05 - 13/05
Quebra da Build Usando o South
Eu como desenvolvedor gostaria de investigar a quebra da build quando utiliza-se o South.
Sprint 6: 14/05 - 19/05
Quantidade de Votações com Filtro
Eu como usuário desejo ver a quantidade de votações utilizadas na análise do gráfico.
Quantidade de Votações com Filtro
Sprint 7: 20/05 - 26/05
Filtrar Partidos Existentes
Eu como usuário desejo visualizar apenas os partidos que ainda existem, para não ver informações desnecessárias.
Sprint 8: 03/06 - 10/06
Executar Importador Periodicamente
Eu como desenvolvedor, desejo executar o importador todos os dias, para manter a base de dados sempre atualizada.
Executar Análise Periódicamente
Eu como desenvolvedor, desejo executar a análise todos os dias, para que a mesma seja armazenada em cache.
Sprint 9: 11/06 - 23/06
Issues Individuais
Issues Individuais
Listar Votações Filtradas
Eu como usuário quero visualizar as votações que foram filtradas por palavras chave.
Listar Votações Filtradas
def votacoes_com_filtro(self):
votacao_com_filtro = []
for periodo in self.periodos:
analisadorPeriodo = AnalisadorPeriodo(self.casa_legislativa,
periodo, self.votacoes, self.palavras_chave)
votacao_com_filtro = analisadorPeriodo._inicializa_votacoes()
return votacao_com_filtro
def lista_de_votacoes_filtradas(request, nome_curto_casa_legislativa,
periodicidade=models.BIENIO, palavras_chave=""):
''' Retorna a lista de votações filtradas'''
casa_legislativa = get_object_or_404(
models.CasaLegislativa,nome_curto=nome_curto_casa_legislativa)
lista_de_palavras_chave =
utils.StringUtils.transforma_texto_em_lista_de_string(palavras_chave)
analisador = AnalisadorTemporal(casa_legislativa, periodicidade,
lista_de_palavras_chave)
analise_temporal = analisador.votacoes_com_filtro()
return render_to_response(
'lista_de_votacoes_filtradas.html',
{'casa_legislativa':casa_legislativa,
'lista_de_palavras_chave':lista_de_palavras_chave,
'analise_temporal': analise_temporal,
'periodicidade':periodicidade}
)
Listar Votações Filtradas
{% for votacao in analise_temporal %}
<tr>
<td align="justify">{{votacao.proposicao.sigla}}
{{votacao.proposicao.numero}}/{{votacao.proposicao.ano}}</td>
<td align="justify"><b>{{votacao.data}} </br></b>{{votacao.descricao}}</td>
<td align="justify">{{votacao.proposicao.ementa}}</td>
<td align="justify">{{votacao.proposicao.indexacao}}</td>
<td align="justify">{{votacao.proposicao.descricao}}</td>
</tr>
{% endfor %}
Listar Votações Filtradas
Listar Votações Filtradas
Issues Individuais
Filtrar Partidos Existentes
Eu como usuário quero ver apenas os partido existentes na atualidade em gráficos de comparação de partidos.
Executar Importador Periodicamente
Eu como desenvolvedor, desejo executar o importador todos os dias, para manter a base de dados sempre atualizada.
Executar Análise Periódicamente
Eu como desenvolvedor, desejo executar a análise todos os dias, para que a mesma seja armazenada em cache.
Filtrar Partidos Existentes
Filtrar Partidos Existentes
Cron Jobs
class ImportadorAnaliseCron(CronJobBase):
#Colocar horario para executar o importador
RUN_AT_TIMES= ['01:00']
schedule = Schedule(run_at_times = RUN_AT_TIMES)
code = "cron.ImportadorAnaliseCron"
def do(self):
importador.main(['cdep'])
Issues Individuais
Padronização do Código
Eu como desenvolvedor desejo aplicar os padrões PEP8 para padronizar o código.
PEP8
-
- Pep8 é um guia de estilo de codificação em Python, que contêm normas que vão desde a nomeclatura a quantidade de espaços entre os símbolos.
- Maiores problemas encontrados no Radar:
- Espaçamento
- Identação
- Linhas muito grandes (em sua maioria devido a nome de métodos muito extensos)
- Utilização de recursos obsoletos (!= None -> is not None, == None -> is None)
- Plugin Flake8: mostra quais linhas do arquivo contêm discordâncias com o Pep8.
Issues Individuais
Disponibilizar Dump do BD no Site
Eu como usuário, quero ter acesso ao dump do banco de dados utilizado no radar para poder analisar os dados.
Disponibilizar Dump do BD no Site
def download_dados(request, dado_solicitado):
arquivo = os.path.join(MODULE_DIR, 'dados/' + dado_solicitado + '.xml')
if not os.path.exists(arquivo):
raise Http404()
mimetype, encoding = mimetypes.guess_type(arquivo)
if mimetype is None:
mimetype = 'application/force-download'
dados_arquivo = arquivo.split("/")[-1]
response = HttpResponse(open(arquivo, 'r').read())
response['Content-Type'] = mimetype
response['Pragma'] = 'public'
response['Expires'] = '0'
response['Cache-Control'] = 'must-revalidate, post-check=0, pre-check=0'
response['Content-Disposition'] = 'attachment; filename=%s' % dados_arquivo
response['Content-Transfer-Encoding'] = 'binary'
response['Content-Length'] = str(os.path.getsize(arquivo))
return response
Disponibilizar Dump do BD no Site
Análise Estática
Backlog
Issue #162
Eu como usuário desejo que a fonte utilizada no “controle de períodos” seja renderizada de forma semelhante no Chrome e Firefox.
Eu como desenvolvedor quero verificar o importador da câmera dos deputados, quanto a: se insere na base de dados um dado já inserido, e se insere novas votações.
Dívidas Técnicas
Novas Issues
-
#238: Mostrar palavras chaves utilizadas no gráfico
-
#239: Lista de votações filtradas a ser impressa vir diretamente da análise feita para geração do gráfico
-
#240: Total de votações filtradas em uma casa legislativa não bate com a lista impressa com o filtro