Browse Source

Add Meso and Micro regions geographic structures

stable/2.1
Sesostris Vieira 9 years ago
parent
commit
25e91f46c1
  1. 25
      sigi/apps/contatos/admin.py
  2. 0
      sigi/apps/contatos/management/__init__.py
  3. 0
      sigi/apps/contatos/management/commands/__init__.py
  4. 100
      sigi/apps/contatos/management/commands/importa_mesomicro.py
  5. 59
      sigi/apps/contatos/migrations/0002_auto_20151104_0810.py
  6. 52
      sigi/apps/contatos/models.py
  7. 20
      sigi/apps/eventos/migrations/0003_auto_20151104_0810.py

25
sigi/apps/contatos/admin.py

@ -3,11 +3,16 @@ from django.contrib import admin
from django.utils.translation import ugettext as _
from sigi.apps.contatos.filters import PopulationFilter
from sigi.apps.contatos.models import (UnidadeFederativa, Municipio, Telefone,
Contato)
from sigi.apps.contatos.models import (UnidadeFederativa, Mesorregiao, Microrregiao,
Municipio, Telefone, Contato)
from sigi.apps.utils import queryset_ascii
from sigi.apps.utils.base_admin import BaseModelAdmin
class MesorregiaoInline(admin.TabularInline):
model = Mesorregiao
class MicrorregiaoInline(admin.TabularInline):
model = Microrregiao
class UnidadeFederativaAdmin(BaseModelAdmin):
actions = None
@ -16,7 +21,16 @@ class UnidadeFederativaAdmin(BaseModelAdmin):
list_filter = ('regiao', 'populacao', PopulationFilter,)
search_fields = ('search_text', 'codigo_ibge', 'sigla', 'regiao')
get_queryset = queryset_ascii
inlines = (MesorregiaoInline, )
class MesorregiaoAdmin(BaseModelAdmin):
actions = None
list_display = ('codigo_ibge', 'uf', 'nome')
list_display_links = ('codigo_ibge', 'nome')
list_filter = ('uf',)
search_fields = ('uf__search_text', 'search_text', 'codigo_ibge', 'uf__sigla')
get_queryset = queryset_ascii
inlines = (MicrorregiaoInline,)
class MunicipioAdmin(BaseModelAdmin):
actions = None
@ -27,16 +41,14 @@ class MunicipioAdmin(BaseModelAdmin):
get_queryset = queryset_ascii
fieldsets = (
(None, {
'fields': ('codigo_ibge', 'codigo_tse', 'codigo_mesorregiao',
'codigo_microrregiao', 'nome', 'data_criacao', 'uf',
'fields': ('codigo_ibge', 'codigo_tse', 'nome', 'data_criacao', 'uf', 'microrregiao',
'is_capital', 'populacao', 'is_polo', 'idh', 'pib_ano', 'pib_total', 'pib_percapita')
}),
(_(u'Posição geográfica'), {
'fields': ('latitude', 'longitude'),
}),
)
search_fields = ('search_text', 'codigo_ibge', 'codigo_tse', 'codigo_mesorregiao',
'codigo_microrregiao', 'uf__sigla')
search_fields = ('search_text', 'codigo_ibge', 'codigo_tse', 'uf__sigla')
class TelefoneAdmin(BaseModelAdmin):
@ -54,6 +66,7 @@ class ContatoAdmin(BaseModelAdmin):
search_fields = ('nome', 'nota', 'email', 'municipio__nome', 'municipio__uf__nome')
admin.site.register(UnidadeFederativa, UnidadeFederativaAdmin)
admin.site.register(Mesorregiao, MesorregiaoAdmin)
admin.site.register(Municipio, MunicipioAdmin)
admin.site.register(Telefone, TelefoneAdmin)
admin.site.register(Contato, ContatoAdmin)

0
sigi/apps/contatos/management/__init__.py

0
sigi/apps/contatos/management/commands/__init__.py

100
sigi/apps/contatos/management/commands/importa_mesomicro.py

@ -0,0 +1,100 @@
# -*- coding: utf-8 -*-
#
# sigi.apps.contatos.management.commands.importa_mesomicro
#
# Copyright (c) 2015 by Interlegis
#
# GNU General Public License (GPL)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
#
import csv
import os
from django.core.management.base import BaseCommand, CommandError
from sigi.apps.contatos.models import Municipio, UnidadeFederativa, Mesorregiao, Microrregiao
class Command(BaseCommand):
args = u"data_file.csv"
help = u"""Importa arquivo do IBGE para preencher as tabelas de meso e microrregiões para os municípios.
A primeira linha do arquivo deve possuir um cabeçalho com os seguintes campos obrigatórios:
- cod_uf : Código IBGE da Unidade da Federação
- cod_mesorregiao : Código IBGE da mesorregião
- nome_mesorregiao : Nome da mesorregião
- cod_microrregiao : Código IBGE da microrregião
- nome_microrregiao : Nome da microrregião
- cod_municipio : Código IBGE do município
* Os nomes dos campos devem ser grafados exatamente como descrito."""
campos = {'cod_uf', 'cod_mesorregiao', 'nome_mesorregiao', 'cod_microrregiao',
'nome_microrregiao', 'cod_municipio'}
def handle(self, *args, **options):
if len(args) != 1:
raise CommandError(u"Informe UM arquivo csv a importar")
file_name = args[0]
if not os.path.isfile(file_name):
raise CommandError(u"Arquivo %s não encontrado" % [file_name,])
with open(file_name, 'rb') as csvfile:
reader = csv.DictReader(csvfile)
if not self.campos.issubset(reader.fieldnames):
raise CommandError(u"O arquivo não possui todos os campos obrigatórios")
erros = 0
for reg in reader:
try:
uf = UnidadeFederativa.objects.get(codigo_ibge=reg['cod_uf'])
except UnidadeFederativa.DoesNotExist:
self.stdout.write(u"(Linha %s): não existe UF com código IBGE '%s'" %
(reader.line_num, reg['cod_uf'],))
erros = erros + 1
continue
try:
municipio = Municipio.objects.get(codigo_ibge=reg['cod_municipio'])
except Municipio.DoesNotExist:
self.stdout.write(u"(Linha %s): não existe Município com código IBGE '%s'" %
(reader.line_num, reg['cod_municipio'],))
erros = erros + 1
continue
cod_meso = reg['cod_uf'] + reg['cod_mesorregiao']
cod_micro = cod_meso + reg['cod_microrregiao']
if Mesorregiao.objects.filter(codigo_ibge=cod_meso).exists():
meso = Mesorregiao.objects.get(codigo_ibge=cod_meso)
else:
meso = Mesorregiao(codigo_ibge=cod_meso, uf=uf, nome=reg['nome_mesorregiao'])
meso.nome = reg['nome_mesorregiao']
meso.save()
if Microrregiao.objects.filter(codigo_ibge=cod_micro).exists():
micro = Microrregiao.objects.get(codigo_ibge=cod_micro)
else:
micro = Microrregiao(codigo_ibge=cod_micro, mesorregiao=meso, nome=reg['nome_microrregiao'])
micro.nome = reg['nome_microrregiao']
micro.save()
municipio.microrregiao = micro
municipio.save()
self.stdout.write(u"Importação concluída. %s erros em %s linhas" % (erros, reader.line_num,))

59
sigi/apps/contatos/migrations/0002_auto_20151104_0810.py

@ -0,0 +1,59 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import sigi.apps.utils
class Migration(migrations.Migration):
dependencies = [
('contatos', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Mesorregiao',
fields=[
('codigo_ibge', models.PositiveIntegerField(help_text='C\xf3digo da mesorregi\xe3o segundo o IBGE', unique=True, serialize=False, verbose_name='C\xf3digo IBGE', primary_key=True)),
('nome', models.CharField(max_length=100, verbose_name='Nome mesorregi\xe3o')),
('search_text', sigi.apps.utils.SearchField(field_names=[b'nome'], editable=False)),
('uf', models.ForeignKey(verbose_name='UF', to='contatos.UnidadeFederativa')),
],
options={
'ordering': ('uf', 'nome'),
'verbose_name': 'Mesorregi\xe3o',
'verbose_name_plural': 'Mesorregi\xf5es',
},
bases=(models.Model,),
),
migrations.CreateModel(
name='Microrregiao',
fields=[
('codigo_ibge', models.PositiveIntegerField(help_text='C\xf3digo da microrregi\xe3o segundo o IBGE', unique=True, serialize=False, verbose_name='C\xf3digo IBGE', primary_key=True)),
('nome', models.CharField(max_length=100, verbose_name='Nome microrregi\xe3o')),
('search_text', sigi.apps.utils.SearchField(field_names=[b'nome'], editable=False)),
('mesorregiao', models.ForeignKey(to='contatos.Mesorregiao')),
],
options={
'ordering': ('mesorregiao', 'nome'),
'verbose_name': 'Microrregi\xe3o',
'verbose_name_plural': 'Microrregi\xf5es',
},
bases=(models.Model,),
),
migrations.RemoveField(
model_name='municipio',
name='codigo_mesorregiao',
),
migrations.RemoveField(
model_name='municipio',
name='codigo_microrregiao',
),
migrations.AddField(
model_name='municipio',
name='microrregiao',
field=models.ForeignKey(verbose_name='Microrregi\xe3o', blank=True, to='contatos.Microrregiao', null=True),
preserve_default=True,
),
]

52
sigi/apps/contatos/models.py

@ -37,13 +37,50 @@ class UnidadeFederativa(models.Model):
populacao = models.PositiveIntegerField(_(u'população'))
class Meta:
ordering = (_(u'nome'),)
ordering = ('nome',)
verbose_name = _(u'Unidade Federativa')
verbose_name_plural = _(u'Unidades Federativas')
def __unicode__(self):
return self.nome
class Mesorregiao(models.Model):
codigo_ibge = models.PositiveIntegerField(
_(u'Código IBGE'),
primary_key=True,
unique=True,
help_text=_(u'Código da mesorregião segundo o IBGE')
)
uf = models.ForeignKey(UnidadeFederativa, verbose_name=_(u'UF'))
nome = models.CharField(_(u"Nome mesorregião"), max_length=100)
# Campo de busca em caixa baixa sem acento
search_text = SearchField(field_names=['nome'])
class Meta:
ordering = ('uf', 'nome',)
verbose_name, verbose_name_plural = _(u'Mesorregião'), _(u'Mesorregiões')
def __unicode__(self):
return self.nome
class Microrregiao(models.Model):
codigo_ibge = models.PositiveIntegerField(
_(u'Código IBGE'),
primary_key=True,
unique=True,
help_text=_(u'Código da microrregião segundo o IBGE')
)
mesorregiao = models.ForeignKey(Mesorregiao)
nome = models.CharField(_(u"Nome microrregião"), max_length=100)
# Campo de busca em caixa baixa sem acento
search_text = SearchField(field_names=['nome'])
class Meta:
ordering = ('mesorregiao', 'nome')
verbose_name, verbose_name_plural = _(u'Microrregião'), _(u'Microrregiões')
def __unicode__(self):
return u"%s (%s)" % (self.nome, self.mesorregiao.nome)
class Municipio(models.Model):
@ -56,18 +93,7 @@ class Municipio(models.Model):
help_text=_(u'Código do município segundo IBGE.')
)
# agrupamento baseado em similaridades econômicas e sociais
codigo_mesorregiao = models.PositiveIntegerField(
_(u'código mesorregião'),
blank=True,
null=True
)
# agrupamento baseado em similaridades econômicas e sociais
codigo_microrregiao = models.PositiveIntegerField(
_(u'código microrregião'),
blank=True,
null=True
)
microrregiao = models.ForeignKey(Microrregiao, verbose_name=_(u'Microrregião'), blank=True, null=True)
# codio designado pelo Tribunal Superior Eleitoral
codigo_tse = models.PositiveIntegerField(

20
sigi/apps/eventos/migrations/0003_auto_20151104_0810.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('eventos', '0002_auto_20151016_1449'),
]
operations = [
migrations.AlterField(
model_name='evento',
name='curso_moodle_id',
field=models.IntegerField(blank=True, null=True, verbose_name='Curso saberes', choices=[(None, '---------'), (59L, 'Oficina Interlegis em Montes Claros, MG')]),
preserve_default=True,
),
]
Loading…
Cancel
Save