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

hospital.png

Listar Votações Filtradas

hospitalcdep.png

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


Análise Estática

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.

      Issue #212

      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

      Radar Parlamentar

      By Matheus Fernandes

      Radar Parlamentar

      • 438