mirror of https://github.com/interlegis/sigi.git
332 lines
11 KiB
332 lines
11 KiB
# -*- coding: utf-8 -*-
|
|
from django.contrib.contenttypes import generic
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.core.validators import MaxValueValidator, MinValueValidator
|
|
from django.db import models
|
|
from django.utils.translation import ugettext as _
|
|
|
|
from sigi.apps.utils import SearchField
|
|
|
|
|
|
class UnidadeFederativa(models.Model):
|
|
|
|
""" Modelo que representa um estado brasileiro
|
|
"""
|
|
REGIAO_CHOICES = (
|
|
('SL', _(u'Sul')),
|
|
('SD', _(u'Sudeste')),
|
|
('CO', _(u'Centro-Oeste')),
|
|
('NE', _(u'Nordeste')),
|
|
('NO', _(u'Norte')),
|
|
)
|
|
codigo_ibge = models.PositiveIntegerField(
|
|
u'código IBGE',
|
|
primary_key=True,
|
|
unique=True,
|
|
help_text=_(u'Código do estado segundo IBGE.')
|
|
)
|
|
nome = models.CharField(_(u'Nome UF'), max_length=25)
|
|
# Campo de busca em caixa baixa sem acento
|
|
search_text = SearchField(field_names=['nome'])
|
|
sigla = models.CharField(
|
|
max_length=2,
|
|
unique=True,
|
|
help_text=_(u"Exemplo") + ": <em>MG</em>.",
|
|
)
|
|
regiao = models.CharField(_(u'região'), max_length=2, choices=REGIAO_CHOICES)
|
|
populacao = models.PositiveIntegerField(_(u'população'))
|
|
|
|
class Meta:
|
|
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,
|
|
on_delete=models.CASCADE,
|
|
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,
|
|
on_delete=models.CASCADE
|
|
)
|
|
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):
|
|
|
|
""" Modelo para representar as cidades brasileiras
|
|
"""
|
|
codigo_ibge = models.PositiveIntegerField(
|
|
_(u'código IBGE'),
|
|
primary_key=True,
|
|
unique=True,
|
|
help_text=_(u'Código do município segundo IBGE.')
|
|
)
|
|
|
|
microrregiao = models.ForeignKey(
|
|
Microrregiao,
|
|
on_delete=models.PROTECT,
|
|
verbose_name=_(u'Microrregião'),
|
|
blank=True,
|
|
null=True
|
|
)
|
|
|
|
# codio designado pelo Tribunal Superior Eleitoral
|
|
codigo_tse = models.PositiveIntegerField(
|
|
_(u'código TSE'),
|
|
unique=True,
|
|
null=True,
|
|
help_text=_(u'Código do município segundo TSE.')
|
|
)
|
|
nome = models.CharField(max_length=50)
|
|
search_text = SearchField(field_names=[_(u'nome'), _(u'uf')])
|
|
uf = models.ForeignKey(
|
|
UnidadeFederativa,
|
|
on_delete=models.PROTECT,
|
|
verbose_name=_(u'UF')
|
|
)
|
|
# verdadeiro se o município é capital do estado
|
|
is_capital = models.BooleanField(_(u'capital'), default=False)
|
|
populacao = models.PositiveIntegerField(_(u'população'))
|
|
populacao.list_filter_range = [10000, 100000, 1000000]
|
|
is_polo = models.BooleanField(_(u'pólo'), default=False)
|
|
data_criacao = models.DateField(_(u'data de criação do município'), null=True, blank=True)
|
|
|
|
# posição geográfica do município
|
|
latitude = models.DecimalField(
|
|
max_digits=10,
|
|
decimal_places=8,
|
|
null=True,
|
|
blank=True,
|
|
help_text=_(u'Exemplo') + ': <em>-20,464</em>.'
|
|
)
|
|
longitude = models.DecimalField(
|
|
max_digits=11,
|
|
decimal_places=8,
|
|
null=True,
|
|
blank=True,
|
|
help_text=_(u'Exemplo') + ': <em>-45,426</em>.'
|
|
)
|
|
|
|
idh = models.DecimalField(_(u'IDH'), help_text=_(u'Índice de desenvolvimento Humano'), max_digits=4, decimal_places=3,
|
|
validators=[MinValueValidator(0), MaxValueValidator(1)])
|
|
idh.list_filter_range = [0.500, 0.800]
|
|
|
|
pib_total = models.DecimalField(_(u'PIB total'), max_digits=18, decimal_places=3, blank=True, null=True)
|
|
pib_percapita = models.DecimalField(_(u'PIB per capita'), max_digits=18, decimal_places=3, blank=True, null=True)
|
|
pib_ano = models.IntegerField(_(u'Ano de apuração do PIB'), blank=True, null=True)
|
|
|
|
class Meta:
|
|
ordering = ('nome', 'codigo_ibge')
|
|
verbose_name = _(u'município')
|
|
verbose_name_plural = _(u'municípios')
|
|
|
|
def __unicode__(self):
|
|
return "%s - %s" % (self.nome, self.uf)
|
|
|
|
def get_google_maps_url(self):
|
|
return "http://maps.google.com.br/maps/mm?ie=UTF8&hl=pt-BR&t=h&ll=%s,%s&spn=1.61886,1.812744&z=9&source=embed" % \
|
|
(self.latitude, self.longitude)
|
|
|
|
|
|
class Telefone(models.Model):
|
|
|
|
""" Modelo genérico para agrupar telefones dos modulos do sistema
|
|
"""
|
|
TELEFONE_CHOICES = (
|
|
('F', _(u'Fixo')),
|
|
('M', _(u'Móvel')),
|
|
('X', _(u'Fax')),
|
|
('I', _(u'Indefinido')),
|
|
)
|
|
numero = models.CharField(
|
|
_(u'número'),
|
|
max_length=64, # TODO: diminuir tamanho de campo após migração de dados
|
|
help_text=_(u'Exemplo') + ': <em>(31)8851-9898</em>.',
|
|
)
|
|
tipo = models.CharField(
|
|
max_length=1,
|
|
choices=TELEFONE_CHOICES,
|
|
default='I'
|
|
)
|
|
nota = models.CharField(max_length=70, null=True, blank=True)
|
|
ult_alteracao = models.DateTimeField(_(u'Última alteração'), null=True, blank=True, editable=False, auto_now=True)
|
|
|
|
# guarda o tipo do objeto (classe) vinculado a esse registro
|
|
content_type = models.ForeignKey(ContentType)
|
|
# identificador do registro na classe vinculado a esse registro
|
|
object_id = models.PositiveIntegerField()
|
|
content_object = generic.GenericForeignKey('content_type', 'object_id')
|
|
|
|
class Meta:
|
|
ordering = ('numero',)
|
|
unique_together = ('numero', 'tipo')
|
|
|
|
def __unicode__(self):
|
|
return unicode(self.numero)
|
|
|
|
|
|
class Contato(models.Model):
|
|
|
|
""" Modelo generico para registrar contatos vinculados aos
|
|
modulos do sistema
|
|
"""
|
|
nome = models.CharField(_(u'nome completo'), max_length=120)
|
|
nome.alphabetic_filter = True
|
|
nota = models.CharField(max_length=70, blank=True)
|
|
|
|
email = models.EmailField(_(u'e-mail'), blank=True)
|
|
telefones = generic.GenericRelation(Telefone)
|
|
|
|
municipio = models.ForeignKey(
|
|
Municipio,
|
|
on_delete=models.SET_NULL,
|
|
verbose_name=_(u'município'),
|
|
blank=True,
|
|
null=True,
|
|
)
|
|
|
|
# guarda o tipo do objeto (classe) vinculado a esse registro
|
|
content_type = models.ForeignKey(ContentType)
|
|
# identificador do registro na classe vinculado a esse registro
|
|
object_id = models.PositiveIntegerField()
|
|
content_object = generic.GenericForeignKey('content_type', 'object_id')
|
|
|
|
class Meta:
|
|
ordering = ('nome',)
|
|
verbose_name = _(u'contato Interlegis')
|
|
verbose_name_plural = _(u'contatos Interlegis')
|
|
|
|
def __unicode__(self):
|
|
return self.nome
|
|
|
|
|
|
class Endereco(models.Model):
|
|
TIPO_CHOICES = (
|
|
('aeroporto', _(u'Aeroporto')),
|
|
('alameda', _(u'Alameda')),
|
|
('area', _(u'Área')),
|
|
('avenida', _(u'Avenida')),
|
|
('campo', _(u'Campo')),
|
|
('chacara', _(u'Chácara')),
|
|
('colonia', _(u'Colônia')),
|
|
('condominio', _(u'Condomínio')),
|
|
('conjunto', _(u'Conjunto')),
|
|
('distrito', _(u'Distrito')),
|
|
('esplanada', _(u'Esplanada')),
|
|
('estacao', _(u'Estação')),
|
|
('estrada', _(u'Estrada')),
|
|
('favela', _(u'Favela')),
|
|
('fazenda', _(u'Fazenda')),
|
|
('feira', _(u'Feira')),
|
|
('jardim', _(u'Jardim')),
|
|
('ladeira', _(u'Ladeira')),
|
|
('lago', _(u'Lago')),
|
|
('lagoa', _(u'Lagoa')),
|
|
('largo', _(u'Largo')),
|
|
('loteamento', _(u'Loteamento')),
|
|
('morro', _(u'Morro')),
|
|
('nucleo', _(u'Núcleo')),
|
|
('parque', _(u'Parque')),
|
|
('passarela', _(u'Passarela')),
|
|
('patio', _(u'Pátio')),
|
|
('praca', _(u'Praça')),
|
|
('quadra', _(u'Quadra')),
|
|
('recanto', _(u'Recanto')),
|
|
('residencial', _(u'Residencial')),
|
|
('rodovia', _(u'Rodovia')),
|
|
('rua', _(u'Rua')),
|
|
('setor', _(u'Setor')),
|
|
('sitio', _(u'Sítio')),
|
|
('travessa', _(u'Travessa')),
|
|
('trecho', _(u'Trecho')),
|
|
('trevo', _(u'Trevo')),
|
|
('vale', _(u'Vale')),
|
|
('vereda', _(u'Vereda')),
|
|
('via', _(u'Via')),
|
|
('viaduto', _(u'Viaduto')),
|
|
('viela', _(u'Viela')),
|
|
('vila', _(u'Vila')),
|
|
('outro', _(u'Outro')),
|
|
)
|
|
|
|
# tipo do endereço obtido no site dos correios
|
|
tipo = models.CharField(max_length=15, choices=TIPO_CHOICES)
|
|
logradouro = models.CharField(
|
|
max_length=100,
|
|
)
|
|
logradouro.alphabetic_filter = True
|
|
numero = models.CharField(max_length=15, blank=True)
|
|
complemento = models.CharField(max_length=15, blank=True)
|
|
# campo de texto livre
|
|
referencia = models.CharField(max_length=100, blank=True)
|
|
bairro = models.CharField(max_length=100, blank=True)
|
|
|
|
cep = models.CharField(
|
|
_(u'CEP'),
|
|
max_length=9,
|
|
blank=True,
|
|
null=True,
|
|
help_text=_(u"Formato") + ": <em>XXXXX-XXX</em>."
|
|
)
|
|
|
|
municipio = models.ForeignKey(
|
|
Municipio,
|
|
on_delete=models.SET_NULL,
|
|
verbose_name=_(u'município'),
|
|
blank=True,
|
|
null=True,
|
|
)
|
|
municipio.uf_filter = True
|
|
|
|
# guarda o tipo do objeto (classe) vinculado a esse registro
|
|
content_type = models.ForeignKey(ContentType)
|
|
# identificador do registro na classe vinculado a esse registro
|
|
object_id = models.PositiveIntegerField()
|
|
content_object = generic.GenericForeignKey('content_type', 'object_id')
|
|
|
|
class Meta:
|
|
ordering = ('logradouro', 'numero')
|
|
verbose_name = _(u'endereço')
|
|
verbose_name_plural = _(u'endereços')
|
|
|
|
def __unicode__(self):
|
|
return self.tipo + ' ' + self.logradouro + ', ' + self.numero \
|
|
+ ' ' + self.complemento + ' - ' + self.bairro
|
|
|