diff --git a/sigi/apps/casas/admin.py b/sigi/apps/casas/admin.py index 8225f32..1a71719 100644 --- a/sigi/apps/casas/admin.py +++ b/sigi/apps/casas/admin.py @@ -7,9 +7,11 @@ from sigi.apps.contatos.models import Contato, Telefone class ContatosInline(generic.GenericTabularInline): model = Contato + extra = 1 class TelefonesInline(generic.GenericTabularInline): model = Telefone + extra = 1 class CasaLegislativaAdmin(admin.ModelAdmin): form = CasaLegislativaForm diff --git a/sigi/apps/contatos/admin.py b/sigi/apps/contatos/admin.py index d3419a5..0ab024d 100644 --- a/sigi/apps/contatos/admin.py +++ b/sigi/apps/contatos/admin.py @@ -4,26 +4,44 @@ from sigi.apps.contatos.models import (UnidadeFederativa, Municipio, Telefone, Contato) class UnidadeFederativaAdmin(admin.ModelAdmin): - list_display = ('codigo_ibge', 'nome', 'sigla') - list_display_links = ('codigo_ibge', 'nome', 'sigla') - search_fields = ('codigo_ibge', 'nome', 'sigla') + list_display = ('codigo_ibge', 'nome', 'sigla', 'regiao', 'populacao') + list_display_links = ('codigo_ibge', 'nome') + list_filter = ('regiao', 'populacao') + search_fields = ('codigo_ibge', 'nome', 'sigla', 'regiao') class MunicipioAdmin(admin.ModelAdmin): - list_display = ('codigo_ibge', 'nome', 'uf') + list_display = ('codigo_ibge', 'nome', 'uf', 'is_capital', 'populacao', 'is_polo') list_display_links = ('codigo_ibge', 'nome') - list_filter = ('uf',) - search_fields = ('codigo_ibge', 'nome', 'uf') + list_filter = ('uf', 'is_capital', 'is_polo', 'populacao') + fieldsets = ( + (None, { + 'fields': ('codigo_ibge', 'codigo_mesorregiao', + 'codigo_microrregiao', 'nome', 'uf', 'is_capital', + 'populacao', 'is_polo') + }), + ('Posição geográfica', { + 'fields': ('latitude', 'longitude'), + }), + ) + search_fields = ('codigo_ibge', 'codigo_mesorregiao', 'codigo_microrregiao', + 'nome', 'uf__nome', 'uf__sigla') class TelefoneAdmin(admin.ModelAdmin): list_display = ('codigo_ddd', 'numero', 'tipo', 'nota') list_display_links = ('codigo_ddd', 'numero') - list_filter = ('codigo_ddd',) + list_filter = ('codigo_ddd', 'tipo') radio_fields = {'tipo': admin.VERTICAL} search_fields = ('codigo_ddd', 'numero', 'tipo', 'nota') class ContatoAdmin(admin.ModelAdmin): - list_display = ('nome', 'nota') + list_display = ('nome', 'nota', 'email', 'municipio', 'get_uf') list_display_links = ('nome',) + list_filter = ('nome',) + search_fields = ('nome', 'nota', 'email', 'municipio__nome', 'municipio__uf__nome') + + def get_uf(self, obj): + return obj.municipio.uf.nome + get_uf.short_description = 'UF' admin.site.register(UnidadeFederativa, UnidadeFederativaAdmin) admin.site.register(Municipio, MunicipioAdmin) diff --git a/sigi/apps/contatos/models.py b/sigi/apps/contatos/models.py index 589e2e8..947a0ac 100644 --- a/sigi/apps/contatos/models.py +++ b/sigi/apps/contatos/models.py @@ -23,8 +23,9 @@ class UnidadeFederativa(models.Model): unique=True, help_text="Exemplo: MG.", ) - regiao = models.CharField(max_length=2, choices=REGIAO_CHOICES) + regiao = models.CharField('região', max_length=2, choices=REGIAO_CHOICES) populacao = models.PositiveIntegerField('população') + populacao.list_filter_range = [100000, 1000000, 10000000] class Meta: ordering = ('nome',) @@ -51,6 +52,7 @@ class Municipio(models.Model): uf = models.ForeignKey(UnidadeFederativa, verbose_name='UF') is_capital = models.BooleanField('capital') populacao = models.PositiveIntegerField(u'população') + populacao.list_filter_range = [10000, 100000, 1000000] is_polo = models.BooleanField(u'pólo') latitude = models.DecimalField( max_digits=10, @@ -113,6 +115,7 @@ class Telefone(models.Model): class Contato(models.Model): nome = models.CharField('nome completo', max_length=60) + nome.alphabetic_filter = True nota = models.CharField(max_length=70, blank=True) email = models.EmailField('e-mail', blank=True) diff --git a/sigi/apps/convenios/admin.py b/sigi/apps/convenios/admin.py index 353f736..331b9b7 100644 --- a/sigi/apps/convenios/admin.py +++ b/sigi/apps/convenios/admin.py @@ -2,20 +2,50 @@ from django.contrib import admin from sigi.apps.convenios.models import Convenio, EquipamentoPrevisto, Anexo +class AnexosInline(admin.TabularInline): + model = Anexo + extra = 1 + +class EquipamentoPrevistoInline(admin.TabularInline): + model = EquipamentoPrevisto + extra = 1 + +class AnexoAdmin(admin.ModelAdmin): + date_hierarchy = 'data_pub' + exclude = ['data_pub',] + list_display = ('arquivo', 'descricao', 'data_pub', 'convenio') + search_fields = ('descricao', 'convenio__num_convenio', 'arquivo', + 'convenio__casa_legislativa__nome') + class ConvenioAdmin(admin.ModelAdmin): - ordering = ('-num_convenio',) + date_hierarchy = 'data_adesao' + fieldsets = ( + (None, + {'fields': ('casa_legislativa', 'num_convenio', 'num_processo_sf',)} + ), + ('Datas', + {'fields': ('data_adesao', 'data_retorno_assinatura', + 'data_termo_aceite', 'data_pub_diario')} + ), + ('Equipamentos & Serviços', + {'fields': ('equipamentos_recebidos', 'servicos')} + ) + ) + inlines = (AnexosInline, EquipamentoPrevistoInline) list_display = ('num_convenio', 'casa_legislativa', 'num_processo_sf', 'data_adesao') list_filter = ('equipamentos_recebidos',) + ordering = ('-num_convenio',) + search_fields = ('num_convenio', 'casa_legislativa__nome', + 'num_processo_sf', 'casa_legislativa__municipio__nome', + 'casa_legislativa__municipio__uf__nome') class EquipamentoPrevistoAdmin(admin.ModelAdmin): - ordering = ('convenio', 'equipamento') list_display = ('convenio', 'equipamento', 'quantidade') list_display_links = ('convenio', 'equipamento') - -class AnexoAdmin(admin.ModelAdmin): - date_hierarchy = 'data_pub' - list_display = ('descricao', 'data_pub', 'convenio') + ordering = ('convenio', 'equipamento') + search_fields = ('convenio__num_convenio', 'equipamento__fabricante__nome', + 'equipamento__modelo__modelo', 'equipamento__modelo__tipo__tipo') admin.site.register(Convenio, ConvenioAdmin) admin.site.register(EquipamentoPrevisto, EquipamentoPrevistoAdmin) diff --git a/sigi/apps/convenios/models.py b/sigi/apps/convenios/models.py index 64c3b75..98d19d1 100644 --- a/sigi/apps/convenios/models.py +++ b/sigi/apps/convenios/models.py @@ -42,6 +42,8 @@ class Convenio(models.Model): servicos = models.ManyToManyField( 'servicos.Servico', verbose_name='serviços prestados', + null=True, + blank=True ) class Meta: @@ -49,8 +51,11 @@ class Convenio(models.Model): ordering = ('num_convenio',) verbose_name = 'convênio' + def __unicode__(self): + return str(self.num_convenio) + class EquipamentoPrevisto(models.Model): - convenio = models.ForeignKey(Convenio) + convenio = models.ForeignKey(Convenio, verbose_name='convênio') equipamento = models.ForeignKey('inventario.Equipamento') quantidade = models.PositiveSmallIntegerField(default=1) @@ -58,14 +63,20 @@ class EquipamentoPrevisto(models.Model): verbose_name = 'equipamento previsto' verbose_name_plural = 'equipamentos previstos' + def __unicode__(self): + return '%s %s(s)' % (self.quantidade, self.equipamento) + class Anexo(models.Model): convenio = models.ForeignKey(Convenio, verbose_name='convênio') arquivo = models.FileField(upload_to='arquivos/anexos',) descricao = models.CharField('descrição', max_length='70') - data_pub = models.DateField( + data_pub = models.DateTimeField( 'data da publicação do anexo', default=datetime.now ) class Meta: ordering = ('-data_pub',) + + def __unicode__(self): + return self.arquivo.name diff --git a/sigi/apps/inventario/admin.py b/sigi/apps/inventario/admin.py index 23c7433..427d397 100644 --- a/sigi/apps/inventario/admin.py +++ b/sigi/apps/inventario/admin.py @@ -1,30 +1,63 @@ # -*- coding: utf-8 -*- from django.contrib import admin +from django.contrib.contenttypes import generic +from sigi.apps.contatos.models import Contato, Telefone from sigi.apps.inventario.models import (Fornecedor, Fabricante, Equipamento, TipoEquipamento, ModeloEquipamento, Bem) +class ContatosInline(generic.GenericTabularInline): + model = Contato + extra = 1 + +class TelefonesInline(generic.GenericTabularInline): + model = Telefone + extra = 1 + class FornecedorAdmin(admin.ModelAdmin): - list_display = ('id', 'nome') + inlines = (TelefonesInline, ContatosInline) + list_display = ('id', 'nome', 'email', 'pagina_web') + list_display_links = ('id', 'nome') + list_filter = ('nome',) + search_fields = ('id', 'nome', 'email', 'pagina_web') class FabricanteAdmin(admin.ModelAdmin): list_display = ('id', 'nome') + list_display_links = list_display + list_filter = ('nome',) + search_fields = ('id', 'nome') class TipoEquipamentoAdmin(admin.ModelAdmin): list_display = ('id', 'tipo') + list_display_links = list_display + list_filter = ('tipo',) + search_fields = ('id', 'tipo') class ModeloEquipamentoAdmin(admin.ModelAdmin): list_display = ('id', 'tipo', 'modelo') + list_filter = ('tipo', 'modelo') + ordering = ('tipo', 'modelo') + search_fields = ('id', 'tipo', 'modelo') class EquipamentoAdmin(admin.ModelAdmin): - ordering = ('fabricante', 'modelo') - list_display = ('id', 'modelo', 'fabricante') + list_display = ('id', 'fabricante', 'modelo', 'get_tipo') + list_display_links = ('id', 'modelo') list_filter = ('fabricante',) + ordering = ('fabricante', 'modelo') + search_fields = ('id', 'modelo', 'fabricante') + + def get_tipo(self, obj): + return obj.modelo.tipo.tipo + get_tipo.short_description = 'tipo' class BemAdmin(admin.ModelAdmin): - ordering = ('casa_legislativa', 'fornecedor', 'equipamento') list_display = ('equipamento', 'fornecedor', 'num_serie', 'num_tombamento', 'casa_legislativa') + list_filter = ('fornecedor',) + ordering = ('casa_legislativa', 'fornecedor', 'equipamento') + search_fields = ('fornecedor__nome', 'equipamento__fabricante__nome', + 'equipamento__modelo__modelo', 'num_serie', + 'num_tombamento', 'casa_legislativa__nome') admin.site.register(Fornecedor, FornecedorAdmin) admin.site.register(Fabricante, FabricanteAdmin) diff --git a/sigi/apps/inventario/models.py b/sigi/apps/inventario/models.py index efe5dbf..3c93542 100644 --- a/sigi/apps/inventario/models.py +++ b/sigi/apps/inventario/models.py @@ -4,6 +4,7 @@ from django.contrib.contenttypes import generic class Fornecedor(models.Model): nome = models.CharField(max_length=40) + nome.alphabetic_filter = True email = models.EmailField('e-mail', blank=True) pagina_web = models.URLField('página web', blank=True) telefones = generic.GenericRelation('contatos.Telefone') @@ -18,6 +19,7 @@ class Fornecedor(models.Model): class Fabricante(models.Model): nome = models.CharField(max_length=40) + nome.alphabetic_filter = True class Meta: ordering = ('nome',) @@ -27,6 +29,7 @@ class Fabricante(models.Model): class TipoEquipamento(models.Model): tipo = models.CharField(max_length=40) + tipo.alphabetic_filter = True class Meta: ordering = ('tipo',) @@ -42,6 +45,7 @@ class ModeloEquipamento(models.Model): verbose_name='tipo de equipamento' ) modelo = models.CharField(max_length=30) + modelo.alphabetic_filter = True class Meta: ordering = ('modelo',) @@ -59,7 +63,8 @@ class Equipamento(models.Model): unique_together = (('fabricante', 'modelo'),) def __unicode__(self): - return str(self.id) + return unicode('%s %s %s' % (self.modelo.tipo, self.fabricante.nome, + self.modelo.modelo)) class Bem(models.Model): casa_legislativa = models.ForeignKey('casas.CasaLegislativa') @@ -82,5 +87,4 @@ class Bem(models.Model): verbose_name_plural = 'bens' def __unicode__(self): - return '%s (%s)' % (unicode(self.equipamento), - unicode(self.casa_legislativa)) + return unicode('%s (%s)') % (self.equipamento, self.casa_legislativa) diff --git a/sigi/apps/servicos/admin.py b/sigi/apps/servicos/admin.py index ffa2f80..e052518 100644 --- a/sigi/apps/servicos/admin.py +++ b/sigi/apps/servicos/admin.py @@ -1,9 +1,18 @@ # -*- coding: utf-8 -*- from django.contrib import admin +from django.contrib.contenttypes import generic +from sigi.apps.contatos.models import Contato from sigi.apps.servicos.models import Servico +class ContatosInline(generic.GenericTabularInline): + model = Contato + extra = 1 + class ServicoAdmin(admin.ModelAdmin): - list_display = ('id', 'tipo', 'situacao', 'avaliacao') - list_filter = ('situacao', 'avaliacao',) + date_hierarchy = 'data_inicio' + inlines = (ContatosInline,) + list_display = ('id', 'titulo', 'tipo', 'situacao', 'avaliacao') + list_filter = ('tipo','situacao', 'avaliacao',) + search_fields = ('titulo', 'tipo', 'descricao',) admin.site.register(Servico, ServicoAdmin) diff --git a/sigi/apps/servicos/models.py b/sigi/apps/servicos/models.py index e796389..8b01016 100644 --- a/sigi/apps/servicos/models.py +++ b/sigi/apps/servicos/models.py @@ -16,7 +16,8 @@ class Servico(models.Model): (2, 'Regular'), (1, 'Ruim'), ) - tipo = models.CharField(max_length=50) + titulo = models.CharField('título', max_length=60) + tipo = models.CharField(max_length=30) descricao = models.TextField(u'descrição') colaboradores = generic.GenericRelation('contatos.Contato') data_inicio = models.DateField( @@ -49,4 +50,4 @@ class Servico(models.Model): verbose_name_plural = 'serviços' def __unicode__(self): - return str(self.id) + return str(self.titulo) diff --git a/sigi/sites.py b/sigi/sites.py index ff6b166..46f71aa 100644 --- a/sigi/sites.py +++ b/sigi/sites.py @@ -1,13 +1,58 @@ -from django.contrib.admin.sites import AdminSite +from django.contrib.auth.admin import Group, GroupAdmin, User, UserAdmin from django.contrib.sites.admin import Site, SiteAdmin +from django.contrib.admin.sites import AdminSite from maintenancemode.admin import AllowedPath, AllowedPathAdmin from sigi.apps.casas.admin import CasaLegislativa, CasaLegislativaAdmin +from sigi.apps.contatos.admin import (UnidadeFederativa, UnidadeFederativaAdmin, + Municipio, MunicipioAdmin, Telefone, + TelefoneAdmin, Contato, ContatoAdmin) +from sigi.apps.convenios.admin import (Convenio, ConvenioAdmin, EquipamentoPrevisto, + EquipamentoPrevistoAdmin, Anexo, AnexoAdmin) +from sigi.apps.inventario.admin import (Fornecedor, FornecedorAdmin, Fabricante, + FabricanteAdmin, Equipamento, + EquipamentoAdmin, TipoEquipamento, + TipoEquipamentoAdmin, ModeloEquipamento, + ModeloEquipamentoAdmin, Bem, BemAdmin) +from sigi.apps.servicos.admin import Servico, ServicoAdmin + class DefaultSite(AdminSite): index_template = 'index.html' login_template = 'login.html' default = DefaultSite() + +# django.contrib.auth +default.register(Group, GroupAdmin) +default.register(User, UserAdmin) + +# django.contrib.sites default.register(Site, SiteAdmin) + +# maintenancemode default.register(AllowedPath, AllowedPathAdmin) + +# sigi.apps.casas default.register(CasaLegislativa, CasaLegislativaAdmin) + +# sigi.apps.contatos +default.register(UnidadeFederativa, UnidadeFederativaAdmin) +default.register(Municipio, MunicipioAdmin) +default.register(Telefone, TelefoneAdmin) +default.register(Contato, ContatoAdmin) + +# sigi.apps.convenios +default.register(Convenio, ConvenioAdmin) +default.register(EquipamentoPrevisto, EquipamentoPrevistoAdmin) +default.register(Anexo, AnexoAdmin) + +# sigi.apps.inventario +default.register(Fornecedor, FornecedorAdmin) +default.register(Fabricante, FabricanteAdmin) +default.register(TipoEquipamento, TipoEquipamentoAdmin) +default.register(ModeloEquipamento,ModeloEquipamentoAdmin) +default.register(Equipamento, EquipamentoAdmin) +default.register(Bem, BemAdmin) + +# sigi.apps.servicos +default.register(Servico, ServicoAdmin)