mirror of https://github.com/interlegis/sigi.git
Sesostris Vieira
2 years ago
7 changed files with 197 additions and 0 deletions
@ -0,0 +1,197 @@ |
|||
from datetime import datetime |
|||
from django_extensions.management.jobs import MonthlyJob |
|||
from django.conf import settings |
|||
from django.core.mail import mail_admins |
|||
from ibge.localidades import Estados, Municipios |
|||
from sigi.apps.contatos.models import ( |
|||
UnidadeFederativa, |
|||
Mesorregiao, |
|||
Microrregiao, |
|||
Municipio, |
|||
) |
|||
|
|||
|
|||
class Job(MonthlyJob): |
|||
help = ( |
|||
"Atualiza Unidades Federativas, mesorregiões, microrregiões e " |
|||
"municípios com dados do IBGE" |
|||
) |
|||
|
|||
uf_novas = [] |
|||
uf_atualizadas = [] |
|||
municipios_novos = [] |
|||
municipios_atualizados = [] |
|||
meso_novas = [] |
|||
meso_atualizadas = [] |
|||
micro_novas = [] |
|||
micro_atualizadas = [] |
|||
|
|||
def execute(self): |
|||
print( |
|||
"Atualizando dados do IBGE. " |
|||
f"Início: {datetime.now(): %d/%m/%Y %H:%M:%S}" |
|||
) |
|||
self.atualiza_ufs() |
|||
self.atualiza_municipios() |
|||
self.print_report() |
|||
print(f"Término: {datetime.now(): %d/%m/%Y %H:%M:%S}") |
|||
|
|||
def atualiza_ufs(self): |
|||
ibge_ufs = Estados().json() |
|||
regioes_map = {"N": "NO", "NE": "NE", "SE": "SE", "S": "SL", "CO": "CO"} |
|||
|
|||
self.uf_novas = [] |
|||
self.uf_atualizadas = [] |
|||
|
|||
for ibge_uf in ibge_ufs: |
|||
regiao = regioes_map[ibge_uf["regiao"]["sigla"]] |
|||
try: |
|||
sigi_uf = UnidadeFederativa.objects.get( |
|||
codigo_ibge=ibge_uf["id"] |
|||
) |
|||
except UnidadeFederativa.DoesNotExist: |
|||
sigi_uf = UnidadeFederativa( |
|||
codigo_ibge=ibge_uf["id"], |
|||
nome=ibge_uf["nome"], |
|||
sigla=ibge_uf["sigla"], |
|||
regiao=regiao, |
|||
populacao=0, |
|||
) |
|||
sigi_uf.save() |
|||
self.uf_novas.append(sigi_uf) |
|||
if ( |
|||
sigi_uf.nome != ibge_uf["nome"] |
|||
or sigi_uf.sigla != ibge_uf["sigla"] |
|||
or sigi_uf.regiao != regiao |
|||
): |
|||
sigi_uf.nome = ibge_uf["nome"] |
|||
sigi_uf.sigla = ibge_uf["sigla"] |
|||
sigi_uf.regiao = regiao |
|||
sigi_uf.save() |
|||
self.uf_atualizadas.append(sigi_uf) |
|||
|
|||
def atualiza_municipios(self): |
|||
|
|||
ibge_municipios = Municipios().json() |
|||
|
|||
self.municipios_novos = [] |
|||
self.municipios_atualizados = [] |
|||
self.meso_novas = [] |
|||
self.meso_atualizadas = [] |
|||
self.micro_novas = [] |
|||
self.micro_atualizadas = [] |
|||
|
|||
for ibge_mun in ibge_municipios: |
|||
uf_id = ibge_mun["microrregiao"]["mesorregiao"]["UF"]["id"] |
|||
cod_meso = ibge_mun["microrregiao"]["mesorregiao"]["id"] |
|||
cod_micro = int( |
|||
str(cod_meso) + str(ibge_mun["microrregiao"]["id"])[-3:] |
|||
) |
|||
# Atualiza ou cria mesorregião # |
|||
try: |
|||
meso = Mesorregiao.objects.get(codigo_ibge=cod_meso) |
|||
except Mesorregiao.DoesNotExist: |
|||
meso = Mesorregiao( |
|||
codigo_ibge=cod_meso, |
|||
uf_id=uf_id, |
|||
nome=ibge_mun["microrregiao"]["mesorregiao"]["nome"], |
|||
) |
|||
meso.save() |
|||
self.meso_novas.append(meso) |
|||
if meso.nome != ibge_mun["microrregiao"]["mesorregiao"]["nome"]: |
|||
meso.nome = ibge_mun["microrregiao"]["mesorregiao"]["nome"] |
|||
meso.save() |
|||
self.meso_atualizadas.append(meso) |
|||
# Atualiza ou cria a microrregião # |
|||
try: |
|||
micro = Microrregiao.objects.get(codigo_ibge=cod_micro) |
|||
except Microrregiao.DoesNotExist: |
|||
micro = Microrregiao( |
|||
codigo_ibge=cod_micro, |
|||
mesorregiao=meso, |
|||
nome=ibge_mun["microrregiao"]["nome"], |
|||
) |
|||
micro.save() |
|||
if ( |
|||
micro.nome != ibge_mun["microrregiao"]["nome"] |
|||
or micro.mesorregiao != meso |
|||
): |
|||
micro.nome = ibge_mun["microrregiao"]["nome"] |
|||
micro.mesorregiao = meso |
|||
micro.save() |
|||
self.micro_atualizadas.append(micro) |
|||
# Atualiza ou cria o município # |
|||
try: |
|||
sigi_mun = Municipio.objects.get(codigo_ibge=ibge_mun["id"]) |
|||
except Municipio.DoesNotExist: |
|||
sigi_mun = Municipio( |
|||
codigo_ibge=ibge_mun["id"], |
|||
microrregiao=micro, |
|||
nome=ibge_mun["nome"], |
|||
uf_id=uf_id, |
|||
populacao=0, |
|||
idh=0.0, |
|||
) |
|||
sigi_mun.save() |
|||
self.municipios_novos.append(sigi_mun) |
|||
if ( |
|||
sigi_mun.nome != ibge_mun["nome"] |
|||
or sigi_mun.uf_id != uf_id |
|||
or sigi_mun.microrregiao != micro |
|||
): |
|||
sigi_mun.nome = ibge_mun["nome"] |
|||
sigi_mun.uf_id = uf_id |
|||
sigi_mun.microrregiao = micro |
|||
sigi_mun.save() |
|||
self.municipios_atualizados.append(sigi_mun) |
|||
|
|||
def print_report(self): |
|||
report = ( |
|||
f"\t {len(self.uf_novas)} novas UFs criadas:\n" |
|||
+ "\n".join( |
|||
[ |
|||
f"\t{uf.codigo_ibge}: {uf.sigla} - {uf.nome}" |
|||
for uf in self.uf_novas |
|||
] |
|||
) |
|||
+ f"\t {len(self.uf_atualizadas)} UFs atualizadas:\n" |
|||
+ "\n".join( |
|||
[ |
|||
f"\t{uf.codigo_ibge}: {uf.sigla} - {uf.nome}" |
|||
for uf in self.uf_atualizadas |
|||
] |
|||
) |
|||
+ f"\t {len(self.municipios_novos)} novos municipios criados:\n" |
|||
+ "\n".join( |
|||
[f"\t{m.codigo_ibge}: {m.nome}" for m in self.municipios_novos] |
|||
) |
|||
+ f"\t {len(self.municipios_atualizados)} municípios atualizados:\n" |
|||
+ "\n".join( |
|||
[ |
|||
f"\t{m.codigo_ibge}: {m.nome}" |
|||
for m in self.municipios_atualizados |
|||
] |
|||
) |
|||
+ f"\t {len(self.meso_novas)} novas mesorregiões:\n" |
|||
+ "\n".join( |
|||
[f"\t{m.codigo_ibge}: {m.nome}" for m in self.meso_novas] |
|||
) |
|||
+ f"\t {len(self.meso_atualizadas)} mesorregiões atualizadas:\n" |
|||
+ "\n".join( |
|||
[f"\t{m.codigo_ibge}: {m.nome}" for m in self.meso_atualizadas] |
|||
) |
|||
+ f"\t {len(self.micro_novas)} novas microrregiões:\n" |
|||
+ "\n".join( |
|||
[f"\t{m.codigo_ibge}: {m.nome}" for m in self.micro_novas] |
|||
) |
|||
+ f"\t {len(self.micro_atualizadas)} microrregiões atualizadas:\n" |
|||
+ "\n".join( |
|||
[f"\t{m.codigo_ibge}: {m.nome}" for m in self.micro_atualizadas] |
|||
) |
|||
) |
|||
print(report) |
|||
mail_admins( |
|||
"CRON - Atualização de dados do IBGE", |
|||
report, |
|||
fail_silently=True, |
|||
) |
Loading…
Reference in new issue