diff --git a/sigi/apps/casas/models.py b/sigi/apps/casas/models.py index 77f3d2f..9842749 100644 --- a/sigi/apps/casas/models.py +++ b/sigi/apps/casas/models.py @@ -57,7 +57,6 @@ class CasaLegislativa(models.Model): foto_largura = models.SmallIntegerField(editable=False, null=True) foto_altura = models.SmallIntegerField(editable=False, null=True) - contatos = generic.GenericRelation('contatos.Contato') class Meta: diff --git a/sigi/apps/contatos/models.py b/sigi/apps/contatos/models.py index 75c8191..62756f6 100644 --- a/sigi/apps/contatos/models.py +++ b/sigi/apps/contatos/models.py @@ -159,3 +159,91 @@ class Contato(models.Model): def __unicode__(self): return self.nome + +class Endereco(models.Model): + TIPO_CHOICES = ( + ('aeroporto','Aeroporto'), + ('alameda','Alameda'), + ('area',u'Área'), + ('avenida','Avenida'), + ('campo','Campo'), + ('chacara',u'Chácara'), + ('colonia',u'Colônia'), + ('condominio',u'Condomínio'), + ('conjunto','Conjunto'), + ('distrito','Distrito'), + ('esplanada','Esplanada'), + ('estacao',u'Estação'), + ('estrada','Estrada'), + ('favela','Favela'), + ('fazenda','Fazenda'), + ('feira','Feira'), + ('jardim','Jardim'), + ('ladeira','Ladeira'), + ('lago','Lago'), + ('lagoa','Lagoa'), + ('largo','Largo'), + ('loteamento','Loteamento'), + ('morro','Morro'), + ('nucleo',u'Núcleo'), + ('parque','Parque'), + ('passarela','Passarela'), + ('patio',u'Pátio'), + ('praca',u'Praça'), + ('quadra','Quadra'), + ('recanto','Recanto'), + ('residencial','Residencial'), + ('rodovia','Rodovia'), + ('rua','Rua'), + ('setor','Setor'), + ('sitio',u'Sítio'), + ('travessa','Travessa'), + ('trecho','Trecho'), + ('trevo','Trevo'), + ('vale','Vale'), + ('vereda','Vereda'), + ('via','Via'), + ('viaduto','Viaduto'), + ('viela','Viela'), + ('vila','Vila'), + ('outro','Outro'), + ) + 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) + referencia = models.CharField(max_length=100, blank=True) + bairro = models.CharField(max_length=100, blank=True) + + cep = models.CharField( + 'CEP', + max_length=9, + blank=True, + null=True, + help_text="Formato: XXXXX-XXX." + ) + + municipio = models.ForeignKey( + Municipio, + verbose_name='município', + blank=True, + null=True, + ) + municipio.uf_filter = True + + content_type = models.ForeignKey(ContentType) + 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 + ' ' + seld.logradouro + ', ' + self.numero \ + + ' ' + self.complemento + ' - ' + self.bairro + diff --git a/sigi/apps/diagnosticos/__init__.py b/sigi/apps/diagnosticos/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sigi/apps/diagnosticos/admin.py b/sigi/apps/diagnosticos/admin.py new file mode 100644 index 0000000..e79f997 --- /dev/null +++ b/sigi/apps/diagnosticos/admin.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from eav.admin import BaseEntityAdmin, BaseSchemaAdmin +from sigi.apps.diagnosticos.models import Diagnostico, Pergunta, Escolha, Equipe, Anexo +from sigi.apps.diagnosticos.forms import DiagnosticoForm + +class EquipeInline(admin.TabularInline): + model = Equipe + extra = 4 + +class AnexosInline(admin.TabularInline): + model = Anexo + extra = 2 + exclude = ['data_pub',] + +class AnexoAdmin(admin.ModelAdmin): + date_hierarchy = 'data_pub' + exclude = ['data_pub',] + list_display = ('arquivo', 'descricao', 'data_pub', 'diagnostico') + raw_id_fields = ('diagnostico',) + search_fields = ('descricao', 'diagnostico__id', 'arquivo', + 'diagnostico__casa_legislativa__nome') + +class DiagnosticoAdmin(BaseEntityAdmin): + form = DiagnosticoForm + inlines = (EquipeInline, AnexosInline) + raw_id_fields = ('casa_legislativa',) + +admin.site.register(Diagnostico, DiagnosticoAdmin) +admin.site.register(Pergunta, BaseSchemaAdmin) +admin.site.register(Escolha) +admin.site.register(Anexo, AnexoAdmin) diff --git a/sigi/apps/diagnosticos/forms.py b/sigi/apps/diagnosticos/forms.py new file mode 100644 index 0000000..3c5ace0 --- /dev/null +++ b/sigi/apps/diagnosticos/forms.py @@ -0,0 +1,5 @@ +from models import Diagnostico +from eav.forms import BaseDynamicEntityForm + +class DiagnosticoForm(BaseDynamicEntityForm): + model = Diagnostico diff --git a/sigi/apps/diagnosticos/models.py b/sigi/apps/diagnosticos/models.py new file mode 100644 index 0000000..9027345 --- /dev/null +++ b/sigi/apps/diagnosticos/models.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +from datetime import datetime +from django.db import models +from sigi.apps.utils import SearchField +from eav.models import BaseChoice, BaseEntity, BaseSchema, BaseAttribute + +class Diagnostico(BaseEntity): + casa_legislativa = models.ForeignKey( + 'casas.CasaLegislativa', + verbose_name='Casa Legislativa' + ) + search_text = SearchField(field_names=['casa_legislativa']) + casa_legislativa.convenio_uf_filter = True + casa_legislativa.convenio_cl_tipo_filter = True + data_visita = models.DateField( + 'data da visita', + null=True, + blank=True, + ) + data_questionario = models.DateField( + 'data do questionario', + null=True, + blank=True, + help_text='Convênio firmado.' + ) + data_relatorio_questionario = models.DateField( + 'data do relatório do questionario', + null=True, + blank=True + ) + data_termo_aceite = models.DateField( + 'Equipadas', + null=True, + blank=True, + help_text='Equipamentos recebidos.' + ) + class Meta: + verbose_name, verbose_name_plural = u'diagnóstico', u'diagnósticos' + + @classmethod + def get_schemata_for_model(self): + return Pergunta.objects.all() + + def __unicode__(self): + return str(self.casa_legislativa) + +class Categoria(models.Model): + nome= models.CharField(max_length=50) + ordem = models.PositiveSmallIntegerField(blank=True, null=True) + +class Pergunta(BaseSchema): + categoria = models.ForeignKey(Categoria) + ordem = models.PositiveSmallIntegerField(blank=True, null=True) + class Meta: + verbose_name, verbose_name_plural = 'pergunta', 'perguntas' + +class Escolha(BaseChoice): + schema = models.ForeignKey(Pergunta, related_name='choices', verbose_name='pergunta') + class Meta: + verbose_name, verbose_name_plural = 'escolha', 'escolhas' + +class Resposta(BaseAttribute): + schema = models.ForeignKey(Pergunta, related_name='attrs', verbose_name='pergunta') + choice = models.ForeignKey(Escolha, verbose_name='escolha', blank=True, null=True) + class Meta: + verbose_name, verbose_name_plural = 'resposta', 'respostas' + +class Equipe(models.Model): + diagnostico = models.ForeignKey(Diagnostico) + membro = models.ForeignKey('servidores.Servidor') + is_chefe = models.BooleanField() + + def __unicode__(self): + return str(self.id) + +class Anexo(models.Model): + diagnostico = models.ForeignKey(Diagnostico, verbose_name=u'diagnóstico') + arquivo = models.FileField(upload_to='apps/diagnostico/anexo/arquivo',) + descricao = models.CharField('descrição', max_length='70') + data_pub = models.DateTimeField( + 'data da publicação do anexo', + default=datetime.now + ) + + class Meta: + ordering = ('-data_pub',) + + def __unicode__(self): + return unicode(self.arquivo.name) + diff --git a/sigi/apps/ocorrencias/__init__.py b/sigi/apps/ocorrencias/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sigi/apps/ocorrencias/admin.py b/sigi/apps/ocorrencias/admin.py new file mode 100644 index 0000000..5308ca3 --- /dev/null +++ b/sigi/apps/ocorrencias/admin.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from eav.admin import BaseEntityAdmin, BaseSchemaAdmin +from sigi.apps.ocorrencias.models import Ocorrencia, Comentario, Anexo, Categoria + +class ComentarioInline(admin.TabularInline): + model = Comentario + extra = 1 + +class AnexosInline(admin.TabularInline): + model = Anexo + extra = 2 + exclude = ['data_pub',] + +class AnexoAdmin(admin.ModelAdmin): + date_hierarchy = 'data_pub' + exclude = ['data_pub',] + list_display = ('arquivo', 'descricao', 'data_pub', 'ocorrencia') + raw_id_fields = ('ocorrencia',) + search_fields = ('descricao', 'ocorrencia__id', 'arquivo', + 'ocorrencia__casa_legislativa__nome') + +class OcorrenciaAdmin(BaseEntityAdmin): + inlines = (ComentarioInline, AnexosInline) + raw_id_fields = ('casa_legislativa',) + +admin.site.register(Ocorrencia, OcorrenciaAdmin) +admin.site.register(Anexo, AnexoAdmin) +admin.site.register(Categoria) diff --git a/sigi/apps/ocorrencias/models.py b/sigi/apps/ocorrencias/models.py new file mode 100644 index 0000000..c9865b1 --- /dev/null +++ b/sigi/apps/ocorrencias/models.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +from django.db import models +from datetime import datetime +from django.db import models +from sigi.apps.utils import SearchField +from eav.models import BaseChoice, BaseEntity, BaseSchema, BaseAttribute + +class Categoria(models.Model): + nome= models.CharField(max_length=50) + descricao = models.TextField('descrição', blank=True, null=True) + + def __unicode__(self): + return str(self.nome) + +class Ocorrencia(models.Model): + casa_legislativa = models.ForeignKey( + 'casas.CasaLegislativa', + verbose_name='Casa Legislativa' + ) + search_text = SearchField(field_names=['casa_legislativa']) + casa_legislativa.convenio_uf_filter = True + casa_legislativa.convenio_cl_tipo_filter = True + data_criacao = models.DateField( + 'data de criacao', + null=True, + blank=True, + ) + + data_modificacao = models.DateField( + u'data de modificação', + null=True, + blank=True, + ) + + + STATUS_CHOICES = ( + (1, 'Aberto'), + (2, 'Reaberto'), + (3, 'Resolvido'), + (4, 'Fechado'), + (5, 'Duplicado'), + ) + + PRIORITY_CHOICES = ( + (1, u'Altíssimo'), + (2, 'Alto'), + (3, 'Normal'), + (4, 'Baixo'), + (5, u'Baixíssimo'), + ) + + categoria = models.ForeignKey(Categoria) + assunto = models.CharField(max_length=200) + status = models.IntegerField(choices=STATUS_CHOICES, default=1, blank=1) + prioridade = models.IntegerField(choices=PRIORITY_CHOICES, default=3, blank=3) + descricao = models.TextField(u'descirção', blank=True, null=True) + resolucao = models.TextField(u'resolução', blank=True, null=True) + responsavel = models.ForeignKey('servidores.Servidor', blank=True, null=True, verbose_name=u'responsável') + + class Meta: + verbose_name, verbose_name_plural = u'ocorrência', u'ocorrências' + +class Comentario(models.Model): + ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'ocorrência') + data_criacao = models.DateTimeField(u'data de criação', default = datetime.now()) + descricao = models.TextField(u'descirção', blank=True, null=True) + usuario = models.ForeignKey('servidores.Servidor', blank=True, null=True, verbose_name=u'usuário') + +class Anexo(models.Model): + ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'ocorrência') + arquivo = models.FileField(upload_to='apps/ocorrencia/anexo/arquivo',) + descricao = models.CharField('descrição', max_length='70') + data_pub = models.DateTimeField( + 'data da publicação do anexo', + default=datetime.now + ) + + class Meta: + ordering = ('-data_pub',) + + def __unicode__(self): + return unicode(self.arquivo.name) + diff --git a/sigi/apps/servidores/__init__.py b/sigi/apps/servidores/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sigi/apps/servidores/admin.py b/sigi/apps/servidores/admin.py new file mode 100644 index 0000000..e2a6f2c --- /dev/null +++ b/sigi/apps/servidores/admin.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from django.contrib.contenttypes import generic +from sigi.apps.servidores.models import Servidor, Funcao, Licenca, Ferias +from sigi.apps.contatos.models import Endereco, Telefone + +class FuncaoInline(admin.TabularInline): + model = Funcao + extra = 1 + +class FuncaoAdmin(admin.ModelAdmin): + list_display = ('servidor', 'funcao', 'cargo','inicio_funcao', 'fim_funcao') + list_filter = ('inicio_funcao', 'fim_funcao') + search_fields = ('funcao', 'cargo', 'descricao', + 'servidor__nome_completo', 'servidor__obs', 'servidor__apontamentos', + 'servidor__user__email', 'servidor__user__first_name', + 'servidor__user__last_name', 'servidor__user__username') + +class FeriasInline(admin.TabularInline): + model = Ferias + extra = 1 + +class FeriasAdmin(admin.ModelAdmin): + list_display = ('servidor', 'inicio_ferias', 'fim_ferias') + list_filter = ('servidor', 'inicio_ferias', 'fim_ferias') + search_fields = ('obs', + 'servidor__nome_completo', 'servidor__obs', 'servidor__apontamentos', + 'servidor__user__email', 'servidor__user__first_name', + 'servidor__user__last_name', 'servidor__user__username') + +class LicencaInline(admin.TabularInline): + model = Licenca + extra = 1 + +class LicencaAdmin(admin.ModelAdmin): + list_display = ('servidor', 'inicio_licenca', 'fim_licenca') + list_filter = ('servidor', 'inicio_licenca', 'fim_licenca') + search_fields = ('obs', + 'servidor__nome_completo', 'servidor__obs', 'servidor__apontamentos', + 'servidor__user__email', 'servidor__user__first_name', + 'servidor__user__last_name', 'servidor__user__username') + +class EnderecoInline(generic.GenericTabularInline): + model = Endereco + extra = 1 + raw_id_fields = ('municipio',) + +class TelefonesInline(generic.GenericTabularInline): + extra = 1 + model = Telefone + +class ServidorAdmin(admin.ModelAdmin): + list_display = ('nome_completo', 'servico') + list_filter = ('sexo', 'servico') + search_fields = ('nome_completo', 'obs', 'apontamentos', + 'user__email', 'user__first_name', + 'user__last_name', 'user__username') + inlines= (EnderecoInline, TelefonesInline) + +admin.site.register(Servidor, ServidorAdmin) +admin.site.register(Funcao, FuncaoAdmin) +admin.site.register(Ferias, FeriasAdmin) +admin.site.register(Licenca, LicencaAdmin) diff --git a/sigi/apps/servidores/models.py b/sigi/apps/servidores/models.py new file mode 100644 index 0000000..f5e90a0 --- /dev/null +++ b/sigi/apps/servidores/models.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +from django.db import models +from django.contrib.contenttypes import generic +from django.contrib.auth.models import User + +class Subsecretaria(models.Model): + nome = models.CharField(max_length=50) + sigla = models.CharField(max_length=10) + #responsavel = models.ForeignKey('servidores.Servidor') + + class Meta: + ordering = ('nome',) + + def __unicode__(self): + return '%s (%s)' % (unicode(self.nome), unicode(self.sigla)) + +class Servico(models.Model): + nome = models.CharField(max_length=50) + sigla = models.CharField(max_length=10) + subsecretaria = models.ForeignKey(Subsecretaria) + #responsavel = models.ForeignKey('servidores.Servidor') + + class Meta: + ordering = ('nome',) + verbose_name = 'serviço' + verbose_name_plural = 'serviços' + + def __unicode__(self): + return '%s (%s)' % (unicode(self.nome), unicode(self.sigla)) + +class Servidor(models.Model): + SEXO_CHOICES = ( + ('M', u'Masculino'), + ('F', u'Feminino'), + ) + TURNO_CHOICES = ( + ('M', u'Manhã'), + ('T', u'Tarde'), + ('N', u'Noite'), + ) + nome_completo = models.CharField(max_length=128) + nome_completo.alphabetic_filter = True + user = models.ForeignKey(User, unique=True) + apelido = models.CharField(max_length=50, blank=True) + foto = models.ImageField( + upload_to='fotos/servidores', + width_field='foto_largura', + height_field='foto_altura', + blank=True + ) + foto_largura = models.SmallIntegerField(editable=False, null=True) + foto_altura = models.SmallIntegerField(editable=False, null=True) + sexo = models.CharField( + max_length=1, + choices=SEXO_CHOICES, + blank=True, + null=True, + ) + data_nascimento = models.DateField( + 'data de nascimento', + blank=True, + null=True, + ) + email = models.EmailField('e-mail', blank=True, null=True) + servico = models.ForeignKey(Servico, blank=True, null=True) + is_chefe = models.BooleanField() + matricula = models.CharField(u'matrícula', max_length=25, blank=True, null=True) + turno= models.CharField( + max_length=1, + choices=TURNO_CHOICES, + blank=True, + null=True, + ) + data_entrada = models.DateField(u'data de entrada', blank=True, null=True) + data_saida = models.DateField(u'data de saída', blank=True, null=True) + data_nomeacao = models.DateField(u'data de nomeação', blank=True, null=True) + ato_exoneracao = models.CharField(u'ato de exoneração',max_length=150, blank=True, null=True) + cpf = models.CharField('CPF', max_length=11, blank=True, null=True) + rg = models.CharField('RG', max_length=25, blank=True, null=True) + obs = models.TextField(u'observação', blank=True, null=True) + apontamentos = models.TextField(u'apontamentos', blank=True, null=True) + + #endereco = models.ForeignKey('contatos.Endereco', blank=True, null=True) + endereco = generic.GenericRelation('contatos.Endereco') + telefones = generic.GenericRelation('contatos.Telefone') + ramal = models.IntegerField('ramal', blank=True, null=True) + + class Meta: + ordering = ('nome_completo',) + verbose_name_plural = 'servidores' + + def __unicode__(self): + return self.nome_completo + +class Funcao(models.Model): + servidor = models.ForeignKey(Servidor) + funcao = models.CharField(max_length=50) + cargo = models.CharField(max_length=50, blank=True, null=True) + inicio_funcao = models.DateField(u'início da função') + fim_funcao = models.DateField(u'fim da função', blank=True, null=True) + descricao = models.TextField(u'descrição', blank=True, null=True) + + bap_entrada = models.CharField('BAP de entrada',max_length=50, blank=True, null=True) + data_bap_entrada = models.DateField('data BAP de entrada', blank=True, null=True) + + bap_saida = models.CharField(u'BAP de saída',max_length=50, blank=True, null=True) + data_bap_saida = models.DateField(u'data BAP de saída', blank=True, null=True) + + class Meta: + verbose_name = u'função' + verbose_name_plural = u'funções' + + def __unicode__(self): + return str(self.id) + + +class Licenca(models.Model): + servidor = models.ForeignKey(Servidor) + inicio_licenca = models.DateField(u'início da licença') + fim_licenca = models.DateField(u'fim da licença') + obs = models.TextField(u'observação', blank=True, null=True) + + class Meta: + verbose_name = u'licença' + verbose_name_plural = u'licenças' + + def __unicode__(self): + return str(self.id) + +class Ferias(models.Model): + servidor = models.ForeignKey(Servidor) + inicio_ferias = models.DateField(u'início das férias') + fim_ferias = models.DateField(u'fim das férias') + obs = models.TextField(u'observação', blank=True, null=True) + + class Meta: + verbose_name = u'férias' + verbose_name_plural = u'férias' + + def __unicode__(self): + return str(self.id) diff --git a/sigi/settings.py b/sigi/settings.py index d8e1d43..5df353d 100644 --- a/sigi/settings.py +++ b/sigi/settings.py @@ -154,6 +154,8 @@ INSTALLED_APPS = ( 'sigi.apps.mesas', 'sigi.apps.parlamentares', 'sigi.apps.servidores', + 'sigi.apps.diagnosticos', + 'sigi.apps.ocorrencias', 'sigi.apps.servicos', 'sigi.apps.relatorios', ) diff --git a/sigi/sites.py b/sigi/sites.py index 4e09ffe..2bd2404 100644 --- a/sigi/sites.py +++ b/sigi/sites.py @@ -7,7 +7,8 @@ from sigi.apps.contatos.admin import (UnidadeFederativa, UnidadeFederativaAdmin, Municipio, MunicipioAdmin, Telefone, TelefoneAdmin, Contato, ContatoAdmin) from sigi.apps.convenios.admin import (Projeto, Convenio, ConvenioAdmin, EquipamentoPrevisto, - EquipamentoPrevistoAdmin, Anexo, AnexoAdmin,UnidadeAdministrativa,Tramitacao) + EquipamentoPrevistoAdmin, Anexo, AnexoAdmin, + UnidadeAdministrativa,Tramitacao) from sigi.apps.inventario.admin import (Fornecedor, FornecedorAdmin, Fabricante, FabricanteAdmin, Equipamento, EquipamentoAdmin, TipoEquipamento, @@ -22,6 +23,13 @@ from sigi.apps.mesas.admin import (Legislatura, LegislaturaAdmin, Coligacao, MembroMesaDiretora, MembroMesaDiretoraAdmin) from sigi.apps.parlamentares.admin import (Partido, PartidoAdmin, Parlamentar, ParlamentarAdmin, Mandato, MandatoAdmin) +from sigi.apps.diagnosticos.admin import (Diagnostico, DiagnosticoAdmin, Pergunta, + BaseSchemaAdmin, Escolha, Anexo as AnexoDiagnostico, + AnexoAdmin as AnexoDiagnosticoAdmin) +from sigi.apps.servidores.admin import (Servidor, ServidorAdmin, Funcao, FuncaoAdmin, + Ferias, FeriasAdmin, Licenca, LicencaAdmin) +from sigi.apps.ocorrencias.admin import (Ocorrencia, OcorrenciaAdmin, Anexo as AnexoOcorrencia, + AnexoAdmin as AnexoOcorrenciaAdmin, Categoria) class DefaultSite(AdminSite): index_template = 'index.html' @@ -82,3 +90,21 @@ default.register(MembroMesaDiretora, MembroMesaDiretoraAdmin) default.register(Partido, PartidoAdmin) default.register(Parlamentar, ParlamentarAdmin) default.register(Mandato, MandatoAdmin) + +# sigi.apps.diagnosticos +default.register(Diagnostico, DiagnosticoAdmin) +default.register(Pergunta, BaseSchemaAdmin) +default.register(Escolha) +default.register(AnexoDiagnostico, AnexoDiagnosticoAdmin) + +# sigi.apps.servidores +default.register(Servidor, ServidorAdmin) +default.register(Funcao, FuncaoAdmin) +default.register(Ferias, FeriasAdmin) +default.register(Licenca, LicencaAdmin) + +# sigi.apps.ocorrencias +default.register(Ocorrencia, OcorrenciaAdmin) +default.register(AnexoOcorrencia, AnexoOcorrenciaAdmin) +default.register(Categoria) +