RadarParlamentar-MES2017-1/radar

View on GitHub
radar_parlamentar/exportadores/exportador_csv.py

Summary

Maintainability
A
3 hrs
Test Coverage
# !/usr/bin/python
# coding=utf8

# Copyright (C) 2016, Leonardo Leite
#
# This file is part of Radar Parlamentar.
#
# Radar Parlamentar is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Radar Parlamentar is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Radar Parlamentar.  If not, see <http://www.gnu.org/licenses/>.

"""Exportação para CSV com o objetivo de criar uma base de dados com
schema simplificado para análises ad-hoc."""


import os
import csv
import logging
from modelagem import models
from django.utils.dateparse import parse_datetime

logger = logging.getLogger("radar")

MODULE_DIR = os.path.abspath(os.path.dirname(__file__))

NORTE = 'Norte'
NORDESTE = 'Nordeste'
CENTRO_OESTE = 'CentroOeste'
SUDESTE = 'Sudeste'
SUL = 'Sul'

REGIAO_POR_UF = {
    'AC': NORTE,
    'AL': NORDESTE,
    'AP': NORTE,
    'AM': NORTE,
    'BA': NORDESTE,
    'CE': NORDESTE,
    'DF': CENTRO_OESTE,
    'ES': SUDESTE,
    'GO': CENTRO_OESTE,
    'MA': NORTE,
    'MT': CENTRO_OESTE,
    'MS': CENTRO_OESTE,
    'MG': SUDESTE,
    'PA': NORTE,
    'PB': NORDESTE,
    'PR': SUL,
    'PE': NORDESTE,
    'PI': NORDESTE,
    'RJ': SUDESTE,
    'RN': NORTE,
    'RS': SUL,
    'RO': NORTE,
    'RR': NORTE,
    'SC': NORTE,
    'SP': SUDESTE,
    'SE': NORDESTE,
    'TO': NORTE
}

PROPOSICAO = 'PROPOSICAO'
VOTACAO = 'VOTACAO'
PARLAMENTAR_ID = 'PARLAMENTAR_ID'
PARLAMENTAR_NOME = 'PARLAMENTAR_NOME'
PARTIDO = 'PARTIDO'
UF = 'UF'
REGIAO = 'REGIAO'
VOTO = 'VOTO'

LABELS = [
    PROPOSICAO, VOTACAO, PARLAMENTAR_ID,
    PARLAMENTAR_NOME, PARTIDO, UF, REGIAO, VOTO]

CSV_FILE = 'votacoes.csv'


class ExportadorCSV(object):

    def __init__(self, votacoes):
        self.votacoes = votacoes
        self.csv_rows = []

    #
    def exportar_csv(self):
        self.transform_data()
        self.write_csv()

    def transform_data(self):
        self.csv_rows.append(LABELS)
        for votacao in self.votacoes:
            votos = votacao.votos()
            for voto in votos:
                parlamentar = voto.parlamentar
                partido = parlamentar.partido
                csv_row = []
                csv_row.append(votacao.proposicao.nome())
                csv_row.append(votacao.id)
                csv_row.append(parlamentar.id)
                csv_row.append(parlamentar.nome.encode('UTF-8'))
                csv_row.append(partido.nome)
                csv_row.append(parlamentar.localidade)
                csv_row.append(REGIAO_POR_UF[parlamentar.localidade])
                csv_row.append(voto.opcao)
                self.csv_rows.append(csv_row)

    def write_csv(self):
        filepath = os.path.join(MODULE_DIR, 'saida', CSV_FILE)
        with open(filepath, 'w') as f:
            writer = csv.writer(f, delimiter=',')
            writer.writerows(self.csv_rows)


def main():
    try:
        cdep = models.CasaLegislativa.objects.get(nome_curto='cdep')
    except models.CasaLegislativa.DoesNotExist:
        cdep = None
    try:
        sen = models.CasaLegislativa.objects.get(nome_curto='sen')
    except models.CasaLegislativa.DoesNotExist:
        sen = None
    vs1 = models.Votacao.objects.filter(
        proposicao__casa_legislativa=cdep, proposicao__sigla='PL',
        proposicao__numero='1876', proposicao__ano='1999')
    vs2 = models.Votacao.objects.filter(
        proposicao__casa_legislativa=sen, proposicao__sigla='PLC',
        proposicao__numero='00007', proposicao__ano='2010')
    vs3 = models.Votacao.objects.filter(
        proposicao__casa_legislativa=sen, proposicao__sigla='PEC',
        proposicao__numero='00007', proposicao__ano='2015')
    votacoes = vs1 | vs2 | vs3
    exportador = ExportadorCSV(votacoes)
    exportador.exportar_csv()