#!/usr/bin/env python # -*- coding: utf-8 -*- """ Script para fazer a migração dos dados do SIGI antigo (Access), exportados para CSV, para o novo SIGI. Conversão dos dados para CSV:: mdb-export -d "|" -D "%Y-%m-%d" .mdb "Assembléias" > assembleias.csv mdb-export -d "|" -D "%Y-%m-%d" .mdb "municipios" > casas.csv mdb-export -d "|" -D "%Y-%m-%d" .mdb "CNPJ DAS CM" > cnpj.csv Coloque os arquivos no diretório deste script e execute ``./migra.py`` para fazer a migração. Nota: é recomendado que o banco de dados esteja em seu estado inicial (de pós-instalação) para a migração dos dados. Este script não foi feito para um banco de dados em produção. """ from django.core.management import setup_environ from sigi import settings setup_environ(settings) import csv from datetime import datetime from sigi.apps.casas.models import * from sigi.apps.contatos.models import * from sigi.apps.convenios.models import * from sigi.apps.inventario.models import * from sigi.apps.parlamentares.models import * ERROR_MSG_0 = (' %s[%s]: erro desconhecido! Possível erro de integridade ' 'do banco de dados. Favor verificar e inserir manualmente caso ' 'necessário.') ERROR_MSG_1 = (' %s[%s]: erro ao inserir item, será necessário inserção ' 'manual.') OBS_CONVENIO = ('Convênio sem termo de adesão') def migra_assembleias(filename): # identificação das colunas nos arquivo CSV UF_COL = 5 NOME_COL = 8 FONE_1_COL = 32 FONE_2_COL = 33 FAX_COL = 34 FONE_PREFEITURA = 35 OBS_COL = 37 PRESIDENTE_COL = 38 ENDERECO_COL = 39 CEP_COL = 40 EMAIL_COL = 41 EMAIL_PRESIDENTE_COL = 42 PAGINA_COL = 43 #REPRESENTANTE_COL = 86 reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) header = reader.next() tipo_casa = TipoOrgao.objects.filter(sigla='AL').get() for line in reader: uf = UnidadeFederativa.objects.get(sigla=line[UF_COL]) municipio = Municipio.objects.get(uf=uf, is_capital=True) aux_end = line[ENDERECO_COL].split('-') bairro = '' if(aux_end.__len__() > 1): bairro = aux_end[1].replace(' ', '', 1) else: bairro = '' casa = Orgao( municipio=municipio, nome=line[NOME_COL], tipo=tipo_casa, logradouro=aux_end[0], bairro=bairro, cep=line[CEP_COL], email=line[EMAIL_COL], pagina_web=line[PAGINA_COL], observacoes=line[OBS_COL], presidente=line[PRESIDENTE_COL], telefone=line[FONE_1_COL] ) if line[UF_COL] == 'DF': casa.tipo = TipoOrgao.objects.filter(sigla='CT').get() casa.save() if line[FONE_2_COL]: fone2 = Telefone(numero=line[FONE_2_COL], tipo='I', content_object=casa) fone2.save() if line[FAX_COL]: fax = Telefone(numero=line[FAX_COL], tipo='X', content_object=casa) fax.save() if line[FONE_PREFEITURA]: fone_prefeitura = Telefone( numero=line[FONE_PREFEITURA], tipo='F', content_object=casa, nota='Telefone da Prefeitura.' ) fone_prefeitura.save() # Presidente será um atributo de casa legislativa # if line[REPRESENTANTE_COL]: # representante = Contato(nome=line[REPRESENTANTE_COL], content_object=casa) # representante.save() # if line[PRESIDENTE_COL]: # mesa = MesaDiretora(casa_legislativa=casa) # mesa.save() # parlamentar = Parlamentar(nome_completo=line[PRESIDENTE_COL], email=line[EMAIL_PRESIDENTE_COL]) # parlamentar.save() # cargo_presidente = Cargo.objects.get(descricao__iexact='presidente') # presidente = MembroMesaDiretora( # parlamentar=parlamentar, # cargo=cargo_presidente, # mesa_diretora=mesa # ) # presidente.save() def migra_casas(filename): # identificação das colunas no arquivo CSV COD_IBGE_COL = 1 COD_TSE_COL = 2 NOME_COL = 8 ENDERECO_COL = 40 CEP_COL = 41 EMAIL_COL = 42 PAGINA_COL = 44 OBS_COL = 38 FONE_1_COL = 33 FONE_2_COL = 34 FAX_COL = 35 FONE_PREFEITURA = 36 PRESIDENTE_COL = 39 EMAIL_PRESIDENTE_COL = 43 REPRESENTANTE_COL = 85 reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) header = reader.next() tipo_casa = TipoOrgao.objects.filter(sigla='CM').get() linenum = 1 for line in reader: linenum += 1 try: municipio = Municipio.objects.get(codigo_ibge=line[COD_IBGE_COL]) except Municipio.DoesNotExist: print "Municipio não existe" print ERROR_MSG_1 % (filename, linenum) continue except ValueError: print ERROR_MSG_1 % (filename, linenum) continue aux_end = line[ENDERECO_COL].split('-') bairro = '' if(aux_end.__len__() > 1): bairro = aux_end[1].replace(' ', '', 1) casa = Orgao( municipio=municipio, nome='Câmara Municipal de ' + line[NOME_COL], tipo=tipo_casa, logradouro=aux_end[0], bairro=bairro, cep=line[CEP_COL], email=line[EMAIL_COL], pagina_web=line[PAGINA_COL], observacoes=line[OBS_COL], presidente=line[PRESIDENTE_COL], telefone=line[FONE_1_COL] ) try: casa.save() except: print "Erro ao inserir casa..." print ERROR_MSG_0 % (filename, linenum) continue if line[FONE_2_COL]: fone2 = Telefone(numero=line[FONE_2_COL], tipo='I', content_object=casa) fone2.save() if line[FAX_COL]: fax = Telefone(numero=line[FAX_COL], tipo='X', content_object=casa) fax.save() if line[FONE_PREFEITURA]: fone_prefeitura = Telefone( numero=line[FONE_PREFEITURA], tipo='F', content_object=casa, nota='Telefone da Prefeitura.' ) fone_prefeitura.save() if line[REPRESENTANTE_COL]: representante = Contato(nome=line[REPRESENTANTE_COL], content_object=casa) representante.save() def migra_cnpj(filename): # identificação das colunas no arquivo CSV COD_TSE_COL = 0 COD_CNPJ1_COL = 3 COD_CNPJ2_COL = 4 reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) header = reader.next() linenum = 1 for line in reader: linenum += 1 try: casa = Orgao.objects.get(municipio__codigo_tse=line[COD_TSE_COL]) except Orgao.DoesNotExist: print ERROR_MSG_1 % (filename, linenum) continue except Orgao.MultipleObjectsReturned: print ERROR_MSG_1 % (filename, linenum) continue except ValueError: print ERROR_MSG_1 % (filename, linenum) continue casa.cnpj = line[COD_CNPJ1_COL] if not 'EM BRANCO' in line[COD_CNPJ1_COL] else line[COD_CNPJ2_COL] casa.save() def migra_convenios_casas(filename): def get_datetime_obj(data): ldata = data.split('-') if len(ldata) != 3: return None return datetime(int(ldata[0]), int(ldata[1]), int(ldata[2])) # identificação das colunas no arquivo CSV # No arquivo CSV colunas que contém _100 são do Programa Interlegis COD_IBGE_COL = 1 DATA_ADESAO_COL = 10 DATA_TERMO_ACEITE_COL = 21 NUM_CONVENIO_COL = 23 DATA_POSTAGEM_CORREIO = 26 NUM_PROCESSO_SF_COL = 27 DATA_RETORNO_ASSINATURA = 28 DATA_PUB_DIARIO = 30 DATA_DEV_VIA_CONV_CM = 32 DATA_ADESAO_100_COL = 11 DATA_TERMO_ACEITE_100_COL = 22 NUM_CONVENIO_100_COL = 24 NUM_PROCESSO_SF_100_COL = 25 DATA_RETORNO_ASSINATURA_100_COL = 29 DATA_PUB_DIARIO_100_COL = 31 # DATA_DEV_VIA_CONV_CM_100 = 32 Não foi registrado para as 100 #DATA_POSTAGEM_CORREIO_100 = 26 reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) header = reader.next() linenum = 1 ###Geração de arquivos para análise### import codecs f1 = codecs.open('file1.txt', 'w', encoding="utf-8") f1.write(u'Casas que não tem Número Processo Senado Federal\n') f2 = codecs.open('file2.txt', 'w', encoding="utf-8") f2.write(u'Casas que não tem data de adesão e não tem convênio mas recebeu equipamentos\n') ###### for line in reader: linenum += 1 try: casa = Orgao.objects.get(municipio__codigo_ibge=line[COD_IBGE_COL]) except Orgao.DoesNotExist: print "Erro ao inserir convênio. Casa não existe" print ERROR_MSG_1 % (filename, linenum) continue except Orgao.MultipleObjectsReturned: print ERROR_MSG_1 % (filename, linenum) continue except ValueError: print ERROR_MSG_1 % (filename, linenum) continue # Se o convênio não tiver data de adesão mas tiver data retorno assinatura copiar essa data para a data de adesão. obs = '' projeto = None convenio1 = None convenio2 = None if line[DATA_ADESAO_COL] == '1001-01-01' and line[DATA_RETORNO_ASSINATURA].__len__() != 0: line[DATA_ADESAO_COL] = line[DATA_RETORNO_ASSINATURA] obs = OBS_CONVENIO if line[DATA_ADESAO_COL] != '1001-01-01': projeto = Projeto.objects.get(id=1) if projeto: convenio1 = Convenio( casa_legislativa=casa, projeto=projeto, num_processo_sf=line[NUM_PROCESSO_SF_COL], num_convenio=line[NUM_CONVENIO_COL], data_adesao=get_datetime_obj(line[DATA_ADESAO_COL]), data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_COL]), data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA]), data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO]), data_devolucao_via=get_datetime_obj(line[DATA_DEV_VIA_CONV_CM]), data_postagem_correio=get_datetime_obj(line[DATA_POSTAGEM_CORREIO]), observacao=obs,) ###Relatório### if((projeto or line[DATA_TERMO_ACEITE_COL]) and line[NUM_PROCESSO_SF_COL].__len__() == 0): f1.write(casa.nome + "," + casa.municipio.uf.sigla + "\n") if(projeto is None and line[DATA_TERMO_ACEITE_COL].__len__() != 0): f2.write(casa.nome + "," + casa.municipio.uf.sigla + "\n") ###### projeto = None obs = '' if line[DATA_ADESAO_100_COL] == '1001-01-01' and line[DATA_RETORNO_ASSINATURA_100_COL].__len__() != 0: line[DATA_ADESAO_100_COL] = line[DATA_RETORNO_ASSINATURA_100_COL] obs = OBS_CONVENIO if line[DATA_ADESAO_100_COL] != '1001-01-01': projeto = Projeto.objects.get(id=2) if projeto: convenio2 = Convenio( casa_legislativa=casa, projeto=projeto, num_processo_sf=line[NUM_PROCESSO_SF_100_COL], num_convenio=line[NUM_CONVENIO_100_COL], data_adesao=get_datetime_obj(line[DATA_ADESAO_100_COL]), data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_100_COL]), data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA_100_COL]), data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO_100_COL]), observacao=obs, ) try: if convenio1: convenio1.save() if convenio2: convenio2.save() except: print "Erro ao inserir convênio" print ERROR_MSG_0 % (filename, linenum) continue f1.close() f2.close() def migra_convenios_assembleias(filename): def get_datetime_obj(data): ldata = data.split('-') if len(ldata) != 3: return None return datetime(int(ldata[0]), int(ldata[1]), int(ldata[2])) # identificação das colunas no arquivo CSV SIGLA_COL = 5 DATA_ADESAO_COL = 10 DATA_TERMO_ACEITE_COL = 21 NUM_CONVENIO_COL = 23 NUM_PROCESSO_SF_COL = 26 DATA_RETORNO_ASSINATURA = 27 DATA_PUB_DIARIO = 29 reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) header = reader.next() linenum = 1 tipo_casa = TipoOrgao.objects.filter(sigla='AL').get() for line in reader: linenum += 1 try: assembleia = Orgao.objects.get(municipio__uf__sigla=line[SIGLA_COL], tipo=tipo_casa) except Orgao.DoesNotExist: print ERROR_MSG_1 % (filename, linenum) continue except Orgao.MultipleObjectsReturned: print ERROR_MSG_1 % (filename, linenum) continue except ValueError: print ERROR_MSG_1 % (filename, linenum) continue projeto = Projeto.objects.get(id=2) convenio = Convenio( casa_legislativa=assembleia, num_processo_sf=line[NUM_PROCESSO_SF_COL], num_convenio=line[NUM_CONVENIO_COL], projeto=projeto, data_adesao=get_datetime_obj(line[DATA_ADESAO_COL]), data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_COL]), data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA]), data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO]), ) try: convenio.save() except: print ERROR_MSG_0 % (filename, linenum) print convenio continue def popula(): """ Será preciso cadastrar no banco os seguintes Projeto: 1 - Projeto Interlegis 2 - Projeto Piloto de Modernização 3 - Projeto Modernização Legislativo """ projeto1 = Projeto(sigla='PI', nome='Projeto Interlegis') projeto1.save() projeto2 = Projeto(sigla='PPM', nome='Projeto Piloto de Modernização') projeto2.save() projeto3 = Projeto(sigla='PML', nome='Projeto Modernização Legislativo') projeto3.save() tipo1 = TipoOrgao(sigla='CM', nome='Câmara Municipal') tipo1.save() tipo2 = TipoOrgao(sigla='AL', nome='Assembléia Legislativa') tipo2.save() tipo3 = TipoOrgao(sigla='CT', nome='Câmara Distrital') tipo3.save() if __name__ == '__main__': popula() print "" migra_assembleias('assembleias.csv') print "" migra_casas('casas.csv') print "" migra_cnpj('cnpj.csv') print "" migra_convenios_casas('casas.csv') print "" migra_convenios_assembleias('assembleias.csv')