def _prop_from_xml(self, prop_xml, id_prop): """Recebe XML representando proposição (objeto etree) e devolve objeto do tipo Proposicao, que é salvo no banco de dados. Caso proposição já exista no banco, é retornada a proposição que já estava no banco. """ try: query = models.Proposicao.objects.filter( id_prop=id_prop, casa_legislativa=self.camara_dos_deputados) except DatabaseError: # try again time.sleep(1) query = models.Proposicao.objects.filter( id_prop=id_prop, casa_legislativa=self.camara_dos_deputados) if query: prop = query[0] else: prop = models.Proposicao() prop.id_prop = id_prop prop.sigla = prop_xml.get('tipo').strip() prop.numero = prop_xml.get('numero').strip() prop.ano = prop_xml.get('ano').strip() prop.ementa = prop_xml.find('Ementa').text.strip() prop.descricao = prop_xml.find('ExplicacaoEmenta').text.strip() prop.indexacao = prop_xml.find('Indexacao').text.strip() #prop.autores = prop_xml.find('Autor').text.strip() date_str = prop_xml.find('DataApresentacao').text.strip() prop.data_apresentacao = self._converte_data(date_str) prop.situacao = prop_xml.find('Situacao').text.strip() prop.casa_legislativa = self.camara_dos_deputados prop.save() return prop
def _from_xml_to_bd(self, xml_file): """Salva no banco de dados do Django e retorna lista das votações""" f = open(xml_file, 'r') xml = f.read() f.close() tree = etree.fromstring(xml) proposicoes = { } # chave é string (ex: 'pl 127/2004'); valor é objeto do tipo Proposicao votacoes = [] for vot_tree in tree.getchildren(): if vot_tree.tag == 'Votacao' and vot_tree.get( 'TipoVotacao') == 'Nominal': # se é votação nominal resumo = '%s -- %s' % (vot_tree.get('Materia'), vot_tree.get('Ementa')) # Prop_nome eh como se identificam internamente por ora as propostas. # Queremos saber a que proposicao estah associada a votacao analisanda. prop_nome = self._prop_nome( resumo ) # vai retornar prop_nome se votação for de proposição # se a votacao for associavel a uma proposicao, entao.. if (prop_nome): # a proposicao aa qual a votacao sob analise se refere jah estava no dicionario (eba!) if proposicoes.has_key(prop_nome): prop = proposicoes[prop_nome] # a prop. nao estava ainda, entao devemo-la tanto criar qnt cadastrar no dicionario. else: prop = models.Proposicao() prop.sigla, prop.numero, prop.ano = self.tipo_num_anoDePropNome( prop_nome) prop.casa_legislativa = self.cmsp proposicoes[prop_nome] = prop if self.verbose: print 'Proposição %s salva' % prop prop.save() vot = models.Votacao() vot.save( ) # só pra criar a chave primária e poder atribuir o votos vot.id_vot = vot_tree.get('VotacaoID') vot.descricao = resumo vot.data = self._converte_data( vot_tree.get('DataDaSessao')) vot.resultado = vot_tree.get('Resultado') self._votos_from_tree(vot_tree, vot) vot.proposicao = prop if self.verbose: print 'Votação %s salva' % vot else: self.progresso() vot.save() votacoes.append(vot) return votacoes
def test_recupera_votacoes_da_proposicao(self): proposicao = models.Proposicao() proposicao.id = 1 votacoes = models.Votacao.objects.all() filtro_votacao = filtro.FiltroVotacao() votacoes_da_proposicao = filtro_votacao._recupera_votacoes_da_proposicao( proposicao, votacoes) self.assertEquals(1, len(votacoes_da_proposicao))
def create_proposition(self, proposicoes, prop_nome,vot_tree): proposicao = models.Proposicao() proposicao.sigla, proposicao.numero, proposicao.ano = self. \ tipo_num_anoDePropNome(prop_nome) proposicao.ementa = vot_tree.get('Ementa') proposicao.casa_legislativa = self.cmsp proposicoes[prop_nome] = proposicao return proposicao
def setUpClass(cls): '''Metodo responsavel por setar o que for necessario para rodar os testes. No nosso a criacao dos objetos no banco de testes''' partidoTest1 = models.Partido(nome='PMDB', numero='40') partidoTest2 = models.Partido(nome='PT', numero='13') partidoTest3 = models.Partido(nome='PSDB', numero='23') partidoTest1.save() partidoTest2.save() partidoTest3.save() parlamentarTest1 = models.Parlamentar( id_parlamentar='', nome='Ivandro Cunha Lima', genero='') parlamentarTest2 = models.Parlamentar( id_parlamentar='', nome='Fernando Ferro', genero='') parlamentarTest3 = models.Parlamentar( id_parlamentar='', nome='Humberto Costa', genero='') parlamentarTest1.save() parlamentarTest2.save() parlamentarTest3.save() casa_legislativaTest1 = models.CasaLegislativa( nome='Camara dos Deputados', nome_curto='cdep', esfera='FEDERAL', local='', atualizacao='2012-06-01') casa_legislativaTest2 = models.CasaLegislativa( nome='Camara Municipal de Sao Paulo', nome_curto='cmsp', esfera='MUNICIPAL', local='Sao Paulo - SP', atualizacao='2012-12-31') casa_legislativaTest1.save() casa_legislativaTest2.save() legislaturaTest1 = models.Legislatura( parlamentar=parlamentarTest1, casa_legislativa=casa_legislativaTest1, inicio='2004-01-01', fim='2012-07-01', partido=partidoTest1, localidade='PB') legislaturaTest1.save() proposicaoTest1 = models.Proposicao() proposicaoTest1.id_prop = '5555' proposicaoTest1.sigla = 'PL' proposicaoTest1.numero = '4520' proposicaoTest1.casa_legislativa = casa_legislativaTest1 proposicaoTest1.save() votacaoTest1 = models.Votacao( id_vot=' 12345', descricao='Teste da votacao', data='1900-12-05', resultado='Teste', proposicao=proposicaoTest1) votacaoTest1.save() votoTest1 = models.Voto( votacao=votacaoTest1, legislatura=legislaturaTest1, opcao='TESTE') votoTest1.save() exportar.main()
def get_votings_from_tree(self, proposicoes, votacoes, vot_tree): # If the votation is nominal, vot_tree gets the subject and the menu # Gets the type of voting from 'vot_tree'. type_of_votating = vot_tree.get('TipoVotacao') if vot_tree.tag == 'Votacao' and type_of_votating == 'Nominal': # Receive 'Materia' and 'Ementa' from 'vot_tree'. abstract = '%s -- %s' % (vot_tree.get('Materia'), vot_tree.get('Ementa')) # Prop_nome is as internally identifies the proposals # We want to know which proposition the analyzed voting is associated # Will return if search_propostition_by_name vote for Proposition proposition_name = self.search_propostition_by_name(abstract) # If the voting was associable to a proposition, so.. if (proposition_name): id_vote = vot_tree.get('VotacaoID') voting_blank = models.Votacao.objects.filter(id_vot=id_vote) if voting_blank: vot = voting_blank[0] else: if proposition_name in proposicoes: proposition = proposicoes[proposition_name] # The propositon was not in dictionary yet, so we have to create and # register it on dictionary else: proposition = models.Proposicao() proposition.sigla, proposition.numero, proposition.ano = self.extract_year_from_num_and_year( proposition_name) proposition.casa_legislativa = self.cmsp proposicoes[proposition_name] = proposition if self.verbose: print 'Proposicao %s salva' % proposition proposition.save() vot = models.Votacao() # To create de primary key and assign the votes vot.save() vot.id_vot = id_vote vot.descricao = abstract vot.data = self.convert_data(vot_tree.get('DataDaSessao')) vot.resultado = vot_tree.get('Resultado') self.get_votes_from_tree(vot_tree, vot) vot.proposicao = proposition if self.verbose: print 'Votacao %s salva' % vot else: self.show_progress() vot.save() votacoes.append(vot)
def _gera_proposicao(self, num, descricao): prop = models.Proposicao() prop.id_prop = num prop.sigla = 'PL' prop.numero = num prop.ementa = descricao prop.descricao = descricao prop.casa_legislativa = self.casa prop.save() return prop
def test_filtro_proposicao1(self): lista_teste = [] lista_teste2 = [] palavra_proposicao = models.Proposicao() obj_filtro = filtro.Filtro_Proposicao() obj_filtro1 = filtro.Filtro_Proposicao() palavra_proposicao1 = models.Proposicao() palavra_proposicao.sigla = 'PTB' sigla = 'PTB' palavra_proposicao.descricao = 'Discussao da legalizacao do aborto' palavra_proposicao1.descricao = 'Estudo de caso para viabilidade do VLP' palavra_proposicao1.sigla = 'PM' sigla1 = 'PM' palavra_proposicao.save() palavra_proposicao1.save() self.assertFalse(palavra_proposicao.descricao in obj_filtro.filtra_proposicao([sigla], ['musica'])) self.assertFalse(palavra_proposicao1.descricao in obj_filtro1.filtra_proposicao([sigla1], ['futebol']))
def votacao_from_tree(self, proposicoes, votacoes, vot_tree): # se é votação nominal votacao_TipoVotacao = vot_tree.get('TipoVotacao') if vot_tree.tag == 'Votacao' and votacao_TipoVotacao == 'Nominal': # Prop_nome eh como se identifica internamente as propostas. # Queremos saber a que proposicao estah associada a votacao # analisanda. # vai retornar prop_nome se votação for de proposição prop_nome = self.prop_nome(vot_tree.get('Materia')) # se a votacao for associavel a uma proposicao, entao.. if prop_nome: id_vot = vot_tree.get('VotacaoID') votacoes_em_banco = models.Votacao.objects.filter( proposicao__casa_legislativa__nome_curto='cmsp', id_vot=id_vot) if votacoes_em_banco: vot = votacoes_em_banco[0] else: # a proposicao a qual a votacao sob analise se refere jah # estava no dicionario (eba!) if prop_nome in proposicoes: prop = proposicoes[prop_nome] # a prop. nao estava ainda, entao devemo-la tanto criar # qnt cadastrar no dicionario. else: prop = models.Proposicao() prop.sigla, prop.numero, prop.ano = self. \ tipo_num_anoDePropNome(prop_nome) prop.ementa = vot_tree.get('Ementa') prop.casa_legislativa = self.cmsp proposicoes[prop_nome] = prop if self.verbose: logger.info('Proposicao %s salva' % prop) prop.save() vot = models.Votacao() # só pra criar a chave primária e poder atribuir o votos vot.save() vot.id_vot = id_vot vot.descricao = vot_tree.get('Materia') + ' - ' + vot_tree.get('NotasRodape') vot.data = self.data_da_sessao vot.resultado = vot_tree.get('Resultado') self.votos_from_tree(vot_tree, vot) vot.proposicao = prop if self.verbose: logger.info('Votacao %s salva' % vot) else: self.progresso() vot.save() votacoes.append(vot)
def _proposicao_from_tree(self, votacao_tree): prop_nome = self._nome_prop_from_tree(votacao_tree) if prop_nome in self.proposicoes: prop = self.proposicoes[prop_nome] else: prop = models.Proposicao() prop.sigla = votacao_tree.find('SiglaMateria').text prop.numero = votacao_tree.find('NumeroMateria').text prop.ano = votacao_tree.find('AnoMateria').text prop.casa_legislativa = self.senado prop.save() self.proposicoes[prop_nome] = prop return prop
def get_proposition_from_tree(self, votacao_tree): # Receive proposition's name. proposition_name = self.get_proposition_data(votacao_tree) if proposition_name in self.proposicoes: proposition = self.proposicoes[proposition_name] else: # Get 'Proposicao' from 'models'. proposition = models.Proposicao() proposition.sigla = votacao_tree.find_legislature( 'SiglaMateria').text proposition.numero = votacao_tree.find_legislature( 'NumeroMateria').text proposition.ano = votacao_tree.find_legislature('AnoMateria').text proposition.casa_legislativa = self.senado proposition.save() self.proposicoes[proposition_name] = proposition return proposition
def votacao_from_tree(self, proposicoes, votacoes, vot_tree): if vot_tree.tag == 'Votacao' and vot_tree.get( 'TipoVotacao') == 'Nominal': # se é votação nominal resumo = '%s -- %s' % (vot_tree.get('Materia'), vot_tree.get('Ementa')) # Prop_nome eh como se identificam internamente por ora as propostas. # Queremos saber a que proposicao estah associada a votacao analisanda. prop_nome = self.prop_nome( resumo) # vai retornar prop_nome se votação for de proposição # se a votacao for associavel a uma proposicao, entao.. if (prop_nome): # a proposicao a qual a votacao sob analise se refere jah estava no dicionario (eba!) if proposicoes.has_key(prop_nome): prop = proposicoes[prop_nome] # a prop. nao estava ainda, entao devemo-la tanto criar qnt cadastrar no dicionario. else: prop = models.Proposicao() prop.sigla, prop.numero, prop.ano = self.tipo_num_anoDePropNome( prop_nome) prop.casa_legislativa = self.cmsp proposicoes[prop_nome] = prop if self.verbose: print 'Proposicao %s salva' % prop prop.save() vot = models.Votacao() vot.save( ) # só pra criar a chave primária e poder atribuir o votos vot.id_vot = vot_tree.get('VotacaoID') vot.descricao = resumo vot.data = self.converte_data(vot_tree.get('DataDaSessao')) vot.resultado = vot_tree.get('Resultado') self.votos_from_tree(vot_tree, vot) vot.proposicao = prop if self.verbose: print 'Votacao %s salva' % vot else: self.progresso() vot.save() votacoes.append(vot)
def _new_votation8(self): NUM = '8' DESCRICAO = 'Guerra contra a Inglaterra' prop = models.Proposicao() prop.id_prop = NUM prop.sigla = 'PL' prop.numero = NUM prop.ementa = 'o uso proibido de armas químicas' prop.descricao = 'descricao da guerra' prop.casa_legislativa = self.casa prop.indexacao = 'bombas, efeitos, destruições' prop.save() votacao = self._new_votation(NUM, DESCRICAO, BEGIN_SECOND_SEMESTER, prop) self.girondine_votes2(votacao) self.jacobine_votes8(votacao) self.monarquist_votes7(votacao)
def _gera_votacao8(self): NUM = '8' DESCRICAO = 'Guerra contra a Inglaterra' prop = models.Proposicao() prop.id_prop = NUM prop.sigla = 'PL' prop.numero = NUM prop.ementa = 'o uso proibido de armas químicas' prop.descricao = 'descricao da guerra' prop.casa_legislativa = self.casa prop.indexacao = 'bombas, efeitos, destruições' prop.save() votacao = self._gera_votacao(NUM, DESCRICAO, DATA_NO_SEGUNDO_SEMESTRE, prop) votos_girondinos = [models.NAO, models.NAO, models.NAO] self._gera_votos(votacao, GIRONDINOS, votos_girondinos) votos_jacobinos = [models.ABSTENCAO, models.NAO, models.NAO] self._gera_votos(votacao, JACOBINOS, votos_jacobinos) votos_monarquistas = [models.SIM, models.AUSENTE, models.SIM] self._gera_votos(votacao, MONARQUISTAS, votos_monarquistas)
def _prop_from_xml(self, prop_xml): """prop_xml -- tipo etree Retorna proposicao """ id_prop = prop_xml.find('idProposicao').text.strip() prop = models.Proposicao() prop.id_prop = id_prop prop.sigla = prop_xml.get('tipo').strip() prop.numero = prop_xml.get('numero').strip() prop.ano = prop_xml.get('ano').strip() logger.info("Importando %s %s/%s" % (prop.sigla, prop.numero, prop.ano)) prop.ementa = prop_xml.find('Ementa').text.strip() prop.descricao = prop_xml.find('ExplicacaoEmenta').text.strip() prop.indexacao = prop_xml.find('Indexacao').text.strip() prop.autor_principal = prop_xml.find('Autor').text.strip() date_str = prop_xml.find('DataApresentacao').text.strip() prop.data_apresentacao = _converte_data(date_str) prop.situacao = prop_xml.find('Situacao').text.strip() prop.casa_legislativa = self.camara_dos_deputados prop.save() self.proposicoes[id_prop] = prop return prop
def setUpClass(cls): """Method to set responsible for what is needed to run the tests. In this case, the creation of objects in the test bank.""" testParty1 = models.Partido(nome='PMDB', numero='40') testParty2 = models.Partido(nome='PT', numero='13') partyTest3 = models.Partido(nome='PSDB', numero='23') testParty1.save() testParty2.save() partyTest3.save() parliamentaryTest1 = models.Parlamentar(id_parlamentar='', nome='Ivandro Cunha Lima', genero='') parliamentaryTest2 = models.Parlamentar(id_parlamentar='', nome='Fernando Ferro', genero='') parliamentaryTest3 = models.Parlamentar(id_parlamentar='', nome='Humberto Costa', genero='') parliamentaryTest1.save() parliamentaryTest2.save() parliamentaryTest3.save() legislative_houseTest1 = models.CasaLegislativa( nome='Camara dos Deputados', nome_curto='cdep', esfera='FEDERAL', local='', atualizacao='2012-06-01') legislative_houseTest2 = models.CasaLegislativa( nome='Camara Municipal de Sao Paulo', nome_curto='cmsp', esfera='MUNICIPAL', local='Sao Paulo - SP', atualizacao='2012-12-31') legislative_houseTest1.save() legislative_houseTest2.save() legislatureTest1 = models.Legislatura( parlamentar=parliamentaryTest1, casa_legislativa=legislative_houseTest1, inicio='2004-01-01', fim='2012-07-01', partido=testParty1, localidade='PB') legislatureTest1.save() propositionTest1 = models.Proposicao() propositionTest1.id_prop = '5555' propositionTest1.sigla = 'PL' propositionTest1.numero = '4520' propositionTest1.casa_legislativa = legislative_houseTest1 propositionTest1.save() votingTest1 = models.Votacao(id_vot=' 12345', descricao='Teste da votacao', data='1900-12-05', resultado='Teste', proposicao=propositionTest1) votingTest1.save() voteTest1 = models.Voto(votacao=votingTest1, legislatura=legislatureTest1, opcao='TESTE') voteTest1.save() exportar.main()
class ImportadorCamara: """Saves the data of the web services of the Chamber of Deputies in the database.""" def __init__(self, voted, verbose=False): """verbose (booleano) -- enables / disables the screen prints.""" self.verbose = verbose # id/sigla/num/ano das proposições que tiveram votações self.votadas = voted self.total = len(self.votadas) # Indicate progress: self.importadas = 0 self.partidos = {} # Political partidos cache (key is name, and value is object Partido) self.parlamentares = {} # Parliamentary cache (key is 'nome-search_political_party', and value é object Parlamentar def _converte_data(self, data_string, hour_string='00:00'): """Convert string 'd/m/a' to object datetime. Returns None if data_str is invalid. can also receive time: hora_str likes 'h:m'.""" DATA_REGEX = '(\d\d?)/(\d\d?)/(\d{4})' HORA_REGEX = '(\d\d?):(\d\d?)' date_regex_variable = re.match(DATA_REGEX, data_string) hour_regex_variable = re.match(HORA_REGEX, hour_string) if date_regex_variable and hour_regex_variable: new_str = '%s-%s-%s %s:%s:0' % ( date_regex_variable.group(3), date_regex_variable.group(2), date_regex_variable.group(1), hour_regex_variable.group(1), hour_regex_variable.group(2)) return parse_datetime(new_str) else: return None def _gera_casa_legislativa(self): """Creates object likes CasaLegislativa, Chamber of Deputies and save in database. If cdep already exists in the database, returns the existing object.""" LOCK_TO_CREATE_CASA.acquire() count_cdep = models.CasaLegislativa.objects.filter( nome_curto='cdep').count() no_records = 0 if (count_cdep == no_records): deputies_chamber = models.CasaLegislativa() deputies_chamber.nome = 'Câmara dos Deputados' deputies_chamber.nome_curto = 'cdep' deputies_chamber.esfera = models.FEDERAL deputies_chamber.atualizacao = LAST_UPDATE deputies_chamber.save() LOCK_TO_CREATE_CASA.release() return deputies_chamber else: LOCK_TO_CREATE_CASA.release() return models.CasaLegislativa.objects.get(nome_curto='cdep') def _prop_from_xml(self, proposition_xml, id_proposition): """Receive XML representing proposition (object etree) and returns objects like Proposicao, which is saved in database. If proposition already exists in the database, it returned the proposition that was already in the bank.""" try: query = models.Proposicao.objects.filter( id_prop=id_proposition, casa_legislativa=self.camara_dos_deputados) except DatabaseError, error: logger.error("DatabaseError: %s" % error) # try again time.sleep(1) query = models.Proposicao.objects.filter( id_prop=id_proposition, casa_legislativa=self.camara_dos_deputados) if query: proposition = query[0] else: proposition = models.Proposicao() proposition.id_prop = id_proposition proposition.sigla = proposition_xml.get('tipo').strip() proposition.numero = proposition_xml.get('numero').strip() proposition.ano = proposition_xml.get('ano').strip() proposition.ementa = proposition_xml.find_legislature('Ementa').text.strip() proposition.descricao = proposition_xml.find_legislature('ExplicacaoEmenta').text.strip() proposition.indexacao = proposition_xml.find_legislature('Indexacao').text.strip() proposition.autor_principal = proposition_xml.find_legislature('Autor').text.strip() date_str = proposition_xml.find_legislature('DataApresentacao').text.strip() proposition.data_apresentacao = self._converte_data(date_str) proposition.situacao = proposition_xml.find_legislature('Situacao').text.strip() proposition.casa_legislativa = self.camara_dos_deputados proposition.save() return proposition
def setUpClass(cls): #Criando dados ficticios no mock partidoTest1 = models.Partido(nome='PMDB', numero='40') partidoTest2 = models.Partido(nome='PT', numero='13') partidoTest3 = models.Partido(nome='PSDB', numero='23') partidoTest1.save() partidoTest2.save() partidoTest3.save() parlamentarTest1 = models.Parlamentar(id_parlamentar='', nome='Ivandro Cunha Lima', genero='') parlamentarTest2 = models.Parlamentar(id_parlamentar='', nome='Fernando Ferro', genero='') parlamentarTest3 = models.Parlamentar(id_parlamentar='', nome='Humberto Costa', genero='') parlamentarTest1.save() parlamentarTest2.save() parlamentarTest3.save() casa_legislativaTest1 = models.CasaLegislativa( nome='Camara dos Deputados', nome_curto='cdep', esfera='FEDERAL', local='', atualizacao='2012-06-01') casa_legislativaTest2 = models.CasaLegislativa( nome='Camara Municipal de Sao Paulo', nome_curto='cmsp', esfera='MUNICIPAL', local='Sao Paulo - SP', atualizacao='2012-12-31') casa_legislativaTest1.save() casa_legislativaTest2.save() legislaturaTest1 = models.Legislatura( parlamentar=parlamentarTest1, casa_legislativa=casa_legislativaTest1, inicio='2004-01-01', fim='2012-07-01', partido=partidoTest1, localidade='PB') legislaturaTest1.save() proposicaoTest1 = models.Proposicao() proposicaoTest1.id_prop = '5555' proposicaoTest1.sigla = 'PL' proposicaoTest1.numero = '4520' proposicaoTest1.casa_legislativa = casa_legislativaTest1 proposicaoTest1.save() votacaoTest1 = models.Votacao(id_vot=' 12345', descricao='Teste da votacao', data='1900-12-05', resultado='Teste', proposicao=proposicaoTest1) votacaoTest1.save() votoTest1 = models.Voto(votacao=votacaoTest1, legislatura=legislaturaTest1, opcao='TESTE') votoTest1.save() #Exportando dados do mock para os xml exportar.serialize_partido() exportar.serialize_parlamentar() exportar.serialize_casa_legislativa() exportar.serialize_legislatura() exportar.serialize_proposicao() exportar.serialize_votacao() exportar.serialize_voto() #Deletando os registros do mock partidoTest1.delete() partidoTest2.delete() partidoTest3.delete() parlamentarTest1.delete() parlamentarTest2.delete() parlamentarTest3.delete() casa_legislativaTest1.delete() casa_legislativaTest2.delete() legislaturaTest1.delete() proposicaoTest1.delete() votacaoTest1.delete() votoTest1.delete()
def carrega_xml(self, nome_curto): diretorio = RESOURCES_FOLDER + nome_curto + '.xml' try: tree = etree.parse(diretorio) root = tree.getroot() except Exception: print "Xml não encontrado" return None models.CasaLegislativa.deleta_casa(nome_curto) print "Voltei" casaLegislativa = models.CasaLegislativa() casaLegislativa.nome_curto = root.attrib.get("nome_curto") #if(models.CasaLegislativa.objects.get(nome_curto = casaLegislativa.nome_curto)): #models.deleta_casa(casaLegislativa.nome_curto) casaLegislativa.nome = root.attrib.get("nome") casaLegislativa.esfera = root.attrib.get("esfera") casaLegislativa.local = root.attrib.get("local") casaLegislativa.atualizacao = root.attrib.get("atualizacao") casaLegislativa.save() for child_proposicao in root.iter("Proposicao"): proposicao = models.Proposicao() proposicao.casa_legislativa = casaLegislativa proposicao.id_prop = child_proposicao.attrib.get("id_prop") proposicao.sigla = child_proposicao.attrib.get("sigla") proposicao.numero = child_proposicao.attrib.get("numero") proposicao.ano = child_proposicao.attrib.get("ano") proposicao.ementa = child_proposicao.attrib.get("ementa") proposicao.descricao = child_proposicao.attrib.get("descricao") proposicao.indexacao = child_proposicao.attrib.get("indexacao") if (child_proposicao.attrib.get("data_apresentacao") == "None"): #Valor default caso a data venha em branco proposicao.data_apresentacao = "1900-01-01" proposicao.save() else: proposicao.data_apresentacao = child_proposicao.attrib.get( "data_apresentacao") proposicao.save() #Pega a filha da subarvore que está sendo percorrida. for child_votacao in child_proposicao.findall("Votacao"): votacao = models.Votacao() votacao.proposicao = proposicao votacao.id_votacao = child_votacao.attrib.get("id_votacao") votacao.id_vot = child_votacao.attrib.get("id_vot") votacao.descricao = child_votacao.attrib.get("descricao") votacao.data = child_votacao.attrib.get("data") votacao.resultado = child_votacao.attrib.get("resultado") votacao.save() #self.verifica_votacao = True for child_voto in child_votacao.findall("Voto"): partido = models.Partido() partido.numero = child_voto.attrib.get("numero") partido.nome = child_voto.attrib.get("partido") partido_existente = models.Partido.objects.filter( numero=partido.numero, nome=partido.nome) if len(partido_existente) > 0: partido = partido_existente[0] else: partido.save() parlamentar = models.Parlamentar() parlamentar.nome = child_voto.attrib.get("nome") parlamentar.id_parlamentar = child_voto.attrib.get( "id_parlamentar") parlamentar.genero = child_voto.attrib.get("genero") parlamentar_existente = models.Parlamentar.objects.filter( nome=parlamentar.nome, id_parlamentar=parlamentar.id_parlamentar, genero=parlamentar.genero) if len(parlamentar_existente) > 0: parlamentar = parlamentar_existente[0] else: parlamentar.save() legislatura = models.Legislatura() legislatura.partido = partido legislatura.parlamentar = parlamentar legislatura.casa_legislativa = casaLegislativa legislatura.inicio = child_voto.attrib.get("inicio") legislatura.fim = child_voto.attrib.get("fim") legislatura.localidade = child_voto.attrib.get( "localidade") if legislatura.localidade == None: legislatura.localidade = "" else: legislatura.localidade = "" + legislatura.localidade legislatura_existente = models.Legislatura.objects.filter( partido=legislatura.partido, parlamentar=legislatura.parlamentar, casa_legislativa=legislatura.casa_legislativa, inicio=legislatura.inicio, fim=legislatura.fim) if len(legislatura_existente) > 0: legislatura = legislatura_existente[0] else: legislatura.save() voto = models.Voto() voto.votacao = votacao voto.legislatura = legislatura voto.opcao = child_voto.attrib.get("opcao") voto.save()
def setUpClass(cls): # Creating dummy data in mock: partyTest1 = models.Partido(nome='PMDB', numero='40') partyTest2 = models.Partido(nome='PT', numero='13') partyTest3 = models.Partido(nome='PSDB', numero='23') partyTest1.save() partyTest2.save() partyTest3.save() parliamentarianTest1 = models.Parlamentar(id_parlamentar='', nome='Ivandro Cunha Lima', genero='') parliamentarianTest2 = models.Parlamentar(id_parlamentar='', nome='Fernando Ferro', genero='') parliamentarianTest3 = models.Parlamentar(id_parlamentar='', nome='Humberto Costa', genero='') parliamentarianTest1.save() parliamentarianTest2.save() parliamentarianTest3.save() legislative_houseTest1 = models.CasaLegislativa( nome='Camara dos Deputados', nome_curto='cdep', esfera='FEDERAL', local='', atualizacao='2012-06-01') legislative_houseTest2 = models.CasaLegislativa( nome='Camara Municipal de Sao Paulo', nome_curto='cmsp', esfera='MUNICIPAL', local='Sao Paulo - SP', atualizacao='2012-12-31') legislative_houseTest1.save() legislative_houseTest2.save() legislatureTest1 = models.Legislatura( parlamentar=parliamentarianTest1, casa_legislativa=legislative_houseTest1, inicio='2004-01-01', fim='2012-07-01', partido=partyTest1, localidade='PB') legislatureTest1.save() propositionTest1 = models.Proposicao() propositionTest1.id_prop = '5555' propositionTest1.sigla = 'PL' propositionTest1.numero = '4520' propositionTest1.casa_legislativa = legislative_houseTest1 propositionTest1.save() votingTest1 = models.Votacao(id_vot=' 12345', descricao='Teste da votacao', data='1900-12-05', resultado='Teste', proposicao=propositionTest1) votingTest1.save() voteTest1 = models.Voto(votacao=votingTest1, legislatura=legislatureTest1, opcao='TESTE') voteTest1.save() # Exporting the mocks's data to XMLs: exportar.serialize_partido() exportar.serialize_parlamentar() exportar.serialize_casa_legislativa() exportar.serialize_legislatura() exportar.serialize_proposicao() exportar.serialize_votacao() exportar.serialize_voto() # Deleting records of mock: partyTest1.delete() partyTest2.delete() partyTest3.delete() parliamentarianTest1.delete() parliamentarianTest2.delete() parliamentarianTest3.delete() legislative_houseTest1.delete() legislative_houseTest2.delete() legislatureTest1.delete() propositionTest1.delete() votingTest1.delete() voteTest1.delete()
class ImportadorCamara: """Salva os dados dos web services da Câmara dos Deputados no banco de dados""" def __init__(self, votadas, verbose=False): """verbose (booleano) -- ativa/desativa prints na tela""" self.verbose = verbose # id/sigla/num/ano das proposições que tiveram votações self.votadas = votadas self.total = len(self.votadas) self.importadas = 0 # serve para indicar progresso self.partidos = {} # cache de partidos (chave é nome, e valor é objeto Partido) self.parlamentares = {} # cache de parlamentares (chave é 'nome-partido', e valor é objeto # Parlamentar) def _converte_data(self, data_str, hora_str='00:00'): """Converte string 'd/m/a' para objeto datetime; retona None se data_str é inválido Pode também receber horário: hora_str como 'h:m' """ DATA_REGEX = '(\d\d?)/(\d\d?)/(\d{4})' HORA_REGEX = '(\d\d?):(\d\d?)' dt = re.match(DATA_REGEX, data_str) hr = re.match(HORA_REGEX, hora_str) if dt and hr: new_str = '%s-%s-%s %s:%s:0' % (dt.group(3), dt.group(2), dt.group(1), hr.group(1), hr.group(2)) return parse_datetime(new_str) else: return None def _gera_casa_legislativa(self): """Gera objeto do tipo CasaLegislativa Câmara dos Deputados e o salva no banco de dados. Caso cdep já exista no banco de dados, retorna o objeto já existente. """ LOCK_TO_CREATE_CASA.acquire() count_cdep = models.CasaLegislativa.objects.filter( nome_curto='cdep').count() if (count_cdep == 0): camara_dos_deputados = models.CasaLegislativa() camara_dos_deputados.nome = 'Câmara dos Deputados' camara_dos_deputados.nome_curto = 'cdep' camara_dos_deputados.esfera = models.FEDERAL camara_dos_deputados.atualizacao = ULTIMA_ATUALIZACAO camara_dos_deputados.save() LOCK_TO_CREATE_CASA.release() return camara_dos_deputados else: LOCK_TO_CREATE_CASA.release() return models.CasaLegislativa.objects.get(nome_curto='cdep') def _prop_from_xml(self, prop_xml, id_prop): """Recebe XML representando proposição (objeto etree) e devolve objeto do tipo Proposicao, que é salvo no banco de dados. Caso proposição já exista no banco, é retornada a proposição que já estava no banco. """ try: query = models.Proposicao.objects.filter( id_prop=id_prop, casa_legislativa=self.camara_dos_deputados) except DatabaseError, error: logger.error("DatabaseError: %s" % error) # try again time.sleep(1) query = models.Proposicao.objects.filter( id_prop=id_prop, casa_legislativa=self.camara_dos_deputados) if query: prop = query[0] else: prop = models.Proposicao() prop.id_prop = id_prop prop.sigla = prop_xml.get('tipo').strip() prop.numero = prop_xml.get('numero').strip() prop.ano = prop_xml.get('ano').strip() prop.ementa = prop_xml.find('Ementa').text.strip() prop.descricao = prop_xml.find('ExplicacaoEmenta').text.strip() prop.indexacao = prop_xml.find('Indexacao').text.strip() prop.autor_principal = prop_xml.find('Autor').text.strip() date_str = prop_xml.find('DataApresentacao').text.strip() prop.data_apresentacao = self._converte_data(date_str) prop.situacao = prop_xml.find('Situacao').text.strip() prop.casa_legislativa = self.camara_dos_deputados prop.save() return prop
def carrega_xml(self, short_name): directory = RESOURCES_FOLDER + short_name + '.xml' try: tree = etree.parse(directory) root = tree.getroot() except Exception: logger.error("Arquivo não encontrado: %s.xml" % short_name) print "Xml não encontrado" return None models.CasaLegislativa.remove_house(short_name) print "Voltei" legislativeHouse = models.CasaLegislativa() legislativeHouse.nome_curto = root.attrib.get("short_name") legislativeHouse.nome = root.attrib.get("nome") legislativeHouse.esfera = root.attrib.get("esfera") legislativeHouse.local = root.attrib.get("local") legislativeHouse.atualizacao = root.attrib.get("atualizacao") legislativeHouse.save() for child_proposition in root.iter("Proposicao"): proposition = models.Proposicao() proposition.casa_legislativa = legislativeHouse proposition.id_prop = child_proposition.attrib.get("id_prop") proposition.sigla = child_proposition.attrib.get("sigla") proposition.numero = child_proposition.attrib.get("numero") proposition.ano = child_proposition.attrib.get("ano") proposition.ementa = child_proposition.attrib.get("ementa") proposition.descricao = child_proposition.attrib.get("descricao") proposition.indexacao = child_proposition.attrib.get("indexacao") if (child_proposition.attrib.get("data_apresentacao") == "None"): # Default value if the date comes in white proposition.data_apresentacao = "1900-01-01" proposition.save() else: proposition.data_apresentacao = child_proposition.attrib.get( "data_apresentacao") proposition.save() # Get the daughter of the subtree being traversed. for child_voting in child_proposition.findall("Votacao"): voting = models.Votacao() voting.proposicao = proposition voting.id_votacao = child_voting.attrib.get("id_votacao") voting.id_vot = child_voting.attrib.get("id_vot") voting.descricao = child_voting.attrib.get("descricao") voting.data = child_voting.attrib.get("data") voting.resultado = child_voting.attrib.get("resultado") voting.save() for child_vote in child_voting.findall("Voto"): party = models.Partido() party.numero = child_vote.attrib.get("numero") party.nome = child_vote.attrib.get( "search_political_party") partido_existente = models.Partido.objects.filter( numero=party.numero, nome=party.nome) if len(partido_existente) > 0: party = partido_existente[0] else: party.save() parliamentarian = models.Parlamentar() parliamentarian.nome = child_vote.attrib.get("nome") parliamentarian.id_parlamentar = child_vote.attrib.get( "id_parlamentar") parliamentarian.genero = child_vote.attrib.get("genero") existing_parliamentarian = models.Parlamentar.objects.filter( nome=parliamentarian.nome, id_parlamentar=parliamentarian.id_parlamentar, genero=parliamentarian.genero) if len(existing_parliamentarian) > 0: parliamentarian = existing_parliamentarian[0] else: parliamentarian.save() legislature = models.Legislatura() legislature.partido = party legislature.parlamentar = parliamentarian legislature.casa_legislativa = legislativeHouse legislature.inicio = child_vote.attrib.get("inicio") legislature.fim = child_vote.attrib.get("fim") legislature.localidade = child_vote.attrib.get( "localidade") if legislature.localidade is None: legislature.localidade = "" else: legislature.localidade = "" + legislature.localidade existing_legislature = models.Legislatura.objects.filter( party=legislature.partido, parliamentarian=legislature.parlamentar, legislative_house=legislature.casa_legislativa, init=legislature.inicio, fim=legislature.fim) if len(existing_legislature) > 0: legislature = existing_legislature[0] else: legislature.save() vote = models.Voto() vote.votacao = voting vote.legislatura = legislature vote.opcao = child_vote.attrib.get("opcao") vote.save()