From 25e91f46c1f5985a050285f920ffff254f59a6e0 Mon Sep 17 00:00:00 2001 From: Sesostris Vieira Date: Wed, 4 Nov 2015 12:13:05 -0200 Subject: [PATCH] Add Meso and Micro regions geographic structures --- sigi/apps/contatos/admin.py | 29 +++-- sigi/apps/contatos/management/__init__.py | 0 .../contatos/management/commands/__init__.py | 0 .../management/commands/importa_mesomicro.py | 100 ++++++++++++++++++ .../migrations/0002_auto_20151104_0810.py | 59 +++++++++++ sigi/apps/contatos/models.py | 54 +++++++--- .../migrations/0003_auto_20151104_0810.py | 20 ++++ 7 files changed, 240 insertions(+), 22 deletions(-) create mode 100644 sigi/apps/contatos/management/__init__.py create mode 100644 sigi/apps/contatos/management/commands/__init__.py create mode 100644 sigi/apps/contatos/management/commands/importa_mesomicro.py create mode 100644 sigi/apps/contatos/migrations/0002_auto_20151104_0810.py create mode 100644 sigi/apps/eventos/migrations/0003_auto_20151104_0810.py diff --git a/sigi/apps/contatos/admin.py b/sigi/apps/contatos/admin.py index c9687e4..768956f 100644 --- a/sigi/apps/contatos/admin.py +++ b/sigi/apps/contatos/admin.py @@ -3,12 +3,17 @@ 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 list_display = ('codigo_ibge', 'nome', 'sigla', 'regiao', 'populacao') @@ -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) diff --git a/sigi/apps/contatos/management/__init__.py b/sigi/apps/contatos/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sigi/apps/contatos/management/commands/__init__.py b/sigi/apps/contatos/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sigi/apps/contatos/management/commands/importa_mesomicro.py b/sigi/apps/contatos/management/commands/importa_mesomicro.py new file mode 100644 index 0000000..d4bc2b9 --- /dev/null +++ b/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,)) \ No newline at end of file diff --git a/sigi/apps/contatos/migrations/0002_auto_20151104_0810.py b/sigi/apps/contatos/migrations/0002_auto_20151104_0810.py new file mode 100644 index 0000000..c95d8c2 --- /dev/null +++ b/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, + ), + ] diff --git a/sigi/apps/contatos/models.py b/sigi/apps/contatos/models.py index c1ccbf0..9b3becf 100644 --- a/sigi/apps/contatos/models.py +++ b/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): @@ -55,19 +92,8 @@ class Municipio(models.Model): unique=True, 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( diff --git a/sigi/apps/eventos/migrations/0003_auto_20151104_0810.py b/sigi/apps/eventos/migrations/0003_auto_20151104_0810.py new file mode 100644 index 0000000..d4965cd --- /dev/null +++ b/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, + ), + ]