Browse Source

Fix #44

pull/66/head
Sesostris Vieira 4 years ago
parent
commit
883e15b2d4
  1. 3
      sigi/apps/convenios/admin.py
  2. 34
      sigi/apps/convenios/migrations/0008_auto_20210422_1907.py
  3. 27
      sigi/apps/convenios/models.py
  4. 98
      sigi/apps/servidores/admin.py
  5. 109
      sigi/apps/servidores/migrations/0003_auto_20210422_1729.py
  6. 27
      sigi/apps/servidores/migrations/0004_auto_20210422_1907.py
  7. 200
      sigi/apps/servidores/models.py
  8. 51
      sigi/apps/servidores/templates/servidores/servidores_por_cargo.html
  9. 51
      sigi/apps/servidores/templates/servidores/servidores_por_funcao.html
  10. 11
      sigi/apps/servidores/urls.py
  11. 34
      sigi/apps/servidores/views.py
  12. 1
      sigi/urls.py

3
sigi/apps/convenios/admin.py

@ -53,6 +53,9 @@ class ConvenioAdmin(BaseModelAdmin):
{'fields': ('data_solicitacao', 'data_sigad', 'tipo_solicitacao',
'status', 'acompanha', 'observacao',)}
),
(_(u"Gestão do convênio"),
{'fields': ('servico_gestao', 'servidor_gestao',)}
),
(_(u'Datas'),
{'fields': ('data_retorno_assinatura', 'duracao',
'data_pub_diario',)}

34
sigi/apps/convenios/migrations/0008_auto_20210422_1907.py

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('servidores', '0004_auto_20210422_1907'),
('convenios', '0007_auto_20210416_0918'),
]
operations = [
migrations.AddField(
model_name='convenio',
name='servico_gestao',
field=models.ForeignKey(related_name='convenios_geridos', on_delete=django.db.models.deletion.SET_NULL, verbose_name='servi\xe7o de gest\xe3o', blank=True, to='servidores.Servico', null=True),
preserve_default=True,
),
migrations.AddField(
model_name='convenio',
name='servidor_gestao',
field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, verbose_name='servidor de gest\xe3o', blank=True, to='servidores.Servidor', null=True),
preserve_default=True,
),
migrations.AlterField(
model_name='convenio',
name='acompanha',
field=models.ForeignKey(related_name='convenios_acompanhados', on_delete=django.db.models.deletion.SET_NULL, verbose_name='acompanhado por', blank=True, to='servidores.Servidor', null=True),
preserve_default=True,
),
]

27
sigi/apps/convenios/models.py

@ -4,7 +4,7 @@ from datetime import datetime, date
from django.db import models
from django.utils.translation import ugettext as _
from sigi.apps.utils import SearchField
from sigi.apps.servidores.models import Servidor
from sigi.apps.servidores.models import Servidor, Servico
class Projeto(models.Model):
""" Modelo para representar os projetos do programa
@ -40,15 +40,6 @@ class TipoSolicitacao(models.Model):
return self.nome
class Convenio(models.Model):
""" Modelo que representa um convênio do Interlegis
com uma Casa Legislativa.
Uma Casa Legislativa pode não ter um convênio e sim
apenas uma adesão com o Interlegis, isto é,
não tem compromissos direto com o Interlegis apenas
um pacto de colaboração entre as partes
"""
casa_legislativa = models.ForeignKey(
'casas.Orgao',
on_delete=models.PROTECT,
@ -105,6 +96,7 @@ class Convenio(models.Model):
acompanha = models.ForeignKey(
Servidor,
on_delete=models.SET_NULL,
related_name='convenios_acompanhados',
verbose_name=_(u"acompanhado por"),
null=True,
blank=True
@ -114,6 +106,21 @@ class Convenio(models.Model):
null=True,
blank=True,
)
servico_gestao = models.ForeignKey(
Servico,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='convenios_geridos',
verbose_name=_(u"serviço de gestão")
)
servidor_gestao = models.ForeignKey(
Servidor,
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name=_(u"servidor de gestão")
)
data_adesao = models.DateField(
_(u'aderidas'),
null=True,

98
sigi/apps/servidores/admin.py

@ -4,90 +4,30 @@ from django.contrib.contenttypes import generic
from django.utils.translation import ugettext as _
from sigi.apps.contatos.models import Endereco, Telefone
from sigi.apps.servidores.forms import FeriasForm, LicencaForm, FuncaoForm
from sigi.apps.servidores.models import Servidor, Funcao, Licenca, Ferias, Servico, Subsecretaria
from sigi.apps.servidores.models import Servidor, Servico
from sigi.apps.utils.admin_widgets import AdminImageWidget
from sigi.apps.utils.base_admin import BaseModelAdmin
from sigi.apps.utils.filters import AlphabeticFilter
class FuncaoAdmin(BaseModelAdmin):
form = FuncaoForm
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 FeriasAdmin(BaseModelAdmin):
form = FeriasForm
list_display = ('servidor', 'inicio_ferias', 'fim_ferias')
list_filter = ('inicio_ferias', 'fim_ferias')
search_fields = ('obs',
'servidor__nome_completo', 'servidor__email_pessoal',
'servidor__user__email', 'servidor__user__username')
class ServidorFilter(AlphabeticFilter):
title = _(u'Nome do Servidor')
parameter_name = 'servidor__nome_completo'
@admin.register(Servico)
class ServicoAdmin(admin.ModelAdmin):
list_display = ['sigla', 'nome', 'subordinado', 'responsavel']
list_filter = ['subordinado',]
search_fields = ['nome', 'sigla',]
class LicencaAdmin(BaseModelAdmin):
form = LicencaForm
list_display = ('servidor', 'inicio_licenca', 'fim_licenca')
list_filter = (ServidorFilter, 'inicio_licenca', 'fim_licenca')
search_fields = ('obs',
'servidor__nome_completo', 'servidor__email_pessoal',
'servidor__user__email', 'servidor__user__username')
def lookup_allowed(self, lookup, value):
return super(LicencaAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['servidor__nome_completo']
class EnderecoInline(generic.GenericStackedInline):
model = Endereco
extra = 0
raw_id_fields = ('municipio',)
class TelefonesInline(generic.GenericTabularInline):
extra = 1
model = Telefone
@admin.register(Servidor)
class ServidorAdmin(BaseModelAdmin):
def is_active(self, servidor):
return servidor.user.is_active
is_active.admin_order_field = 'user__is_active'
is_active.boolean = True
is_active.short_description = _(u'ativo')
list_display = ('nome_completo', 'is_active', 'foto', 'servico', )
list_filter = ('user__is_active', 'sexo', 'servico',)
search_fields = ('nome_completo', 'obs', 'apontamentos',
'user__email', 'user__first_name',
'user__last_name', 'user__username')
list_display = ('foto', 'nome_completo', 'is_active', 'servico', )
list_filter = ('user__is_active', 'servico',)
search_fields = ('nome_completo', 'user__email', 'user__first_name',
'user__last_name', 'user__username', 'servico__nome',
'servico__sigla')
raw_id_fields = ('user',)
inlines = (TelefonesInline, EnderecoInline)
fieldsets = (
(_(u'Autenticação'), {
'fields': ('user',),
}),
(_(u'Cadastro'), {
'fields': ('nome_completo', 'foto', 'email_pessoal', 'rg', 'cpf', 'sexo', 'data_nascimento', 'matricula', 'ramal', 'data_nomeacao', 'ato_numero', 'ato_exoneracao')
}),
(_(u'Lotação'), {
'fields': ('servico', 'turno', 'de_fora'),
}),
(_(u'Observações'), {
'fields': ('apontamentos', 'obs'),
}),
)
fields = ['user', 'nome_completo', 'foto', 'servico',]
def lookup_allowed(self, lookup, value):
return super(ServidorAdmin, self).lookup_allowed(lookup, value) or \
@ -103,10 +43,8 @@ class ServidorAdmin(BaseModelAdmin):
return db_field.formfield(**kwargs)
return super(ServidorAdmin, self).formfield_for_dbfield(db_field, **kwargs)
admin.site.register(Servidor, ServidorAdmin)
admin.site.register(Funcao, FuncaoAdmin)
admin.site.register(Ferias, FeriasAdmin)
admin.site.register(Licenca, LicencaAdmin)
admin.site.register(Servico)
admin.site.register(Subsecretaria)
def is_active(self, servidor):
return servidor.user.is_active
is_active.admin_order_field = 'user__is_active'
is_active.boolean = True
is_active.short_description = _(u'ativo')

109
sigi/apps/servidores/migrations/0003_auto_20210422_1729.py

@ -0,0 +1,109 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('servidores', '0002_auto_20210416_0841'),
]
operations = [
migrations.RemoveField(
model_name='ferias',
name='servidor',
),
migrations.DeleteModel(
name='Ferias',
),
migrations.RemoveField(
model_name='funcao',
name='servidor',
),
migrations.DeleteModel(
name='Funcao',
),
migrations.RemoveField(
model_name='licenca',
name='servidor',
),
migrations.DeleteModel(
name='Licenca',
),
migrations.RemoveField(
model_name='subsecretaria',
name='responsavel',
),
migrations.RemoveField(
model_name='servico',
name='subsecretaria',
),
migrations.DeleteModel(
name='Subsecretaria',
),
migrations.RemoveField(
model_name='servidor',
name='apontamentos',
),
migrations.RemoveField(
model_name='servidor',
name='ato_exoneracao',
),
migrations.RemoveField(
model_name='servidor',
name='ato_numero',
),
migrations.RemoveField(
model_name='servidor',
name='cpf',
),
migrations.RemoveField(
model_name='servidor',
name='data_nascimento',
),
migrations.RemoveField(
model_name='servidor',
name='data_nomeacao',
),
migrations.RemoveField(
model_name='servidor',
name='de_fora',
),
migrations.RemoveField(
model_name='servidor',
name='email_pessoal',
),
migrations.RemoveField(
model_name='servidor',
name='matricula',
),
migrations.RemoveField(
model_name='servidor',
name='obs',
),
migrations.RemoveField(
model_name='servidor',
name='ramal',
),
migrations.RemoveField(
model_name='servidor',
name='rg',
),
migrations.RemoveField(
model_name='servidor',
name='sexo',
),
migrations.RemoveField(
model_name='servidor',
name='turno',
),
migrations.AddField(
model_name='servico',
name='subordinado',
field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, verbose_name='subordinado a', to='servidores.Servico', null=True),
preserve_default=True,
),
]

27
sigi/apps/servidores/migrations/0004_auto_20210422_1907.py

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('servidores', '0003_auto_20210422_1729'),
]
operations = [
migrations.AlterField(
model_name='servico',
name='responsavel',
field=models.ForeignKey(related_name='chefe', on_delete=django.db.models.deletion.SET_NULL, blank=True, to='servidores.Servidor', null=True),
preserve_default=True,
),
migrations.AlterField(
model_name='servico',
name='subordinado',
field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, verbose_name='subordinado a', blank=True, to='servidores.Servico', null=True),
preserve_default=True,
),
]

200
sigi/apps/servidores/models.py

@ -5,47 +5,22 @@ from django.db import models
from django.db.models.signals import post_save
from django.utils.translation import ugettext as _
class Subsecretaria(models.Model):
""" Modelo para representação das Subsecretarias do Interlegis
"""
nome = models.CharField(max_length=250, null=True)
sigla = models.CharField(max_length=10, null=True)
# servidor responsavel por dirigir a Subsecretaria
responsavel = models.ForeignKey(
'servidores.Servidor',
on_delete=models.SET_NULL,
related_name='diretor',
null=True
)
class Meta:
ordering = ('nome',)
def __unicode__(self):
return '%s (%s)' % (unicode(self.nome), unicode(self.sigla))
class Servico(models.Model):
""" Modelo para representação dos Serviços de uma Subsecretaria
"""
nome = models.CharField(_(u'Setor'), max_length=250, null=True)
sigla = models.CharField(max_length=10, null=True)
subsecretaria = models.ForeignKey(
Subsecretaria,
on_delete=models.CASCADE,
null=True
subordinado = models.ForeignKey(
'self',
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name=_(u"subordinado a")
)
# servidor responsavel por chefiar o serviço
responsavel = models.ForeignKey(
'servidores.Servidor',
on_delete=models.SET_NULL,
related_name='chefe',
null=True
null=True,
blank=True
)
class Meta:
@ -54,33 +29,12 @@ class Servico(models.Model):
verbose_name_plural = _(u'serviços')
def __unicode__(self):
return '%s (%s)' % (unicode(self.nome), unicode(self.sigla))
return u"{sigla} - {nome}".format(sigla=self.sigla, nome=self.nome)
class Servidor(models.Model):
""" Modelo para representação de um Servidor.
Um servidor pertence a um Serviço e uma Subsecretaria os campos
deste modelo são referente as informações básicas de cadastro.
"""
SEXO_CHOICES = (
('M', u'Masculino'),
('F', u'Feminino'),
)
TURNO_CHOICES = (
('M', u'Manhã'),
('T', u'Tarde'),
('N', u'Noite'),
)
# usuario responsavel pela autenticação do servidor no sistema
user = models.ForeignKey(User, on_delete=models.CASCADE, unique=True)
nome_completo = models.CharField(max_length=128)
apelido = models.CharField(max_length=50, blank=True)
# caminho no sistema para arquivo com a imagem
foto = models.ImageField(
upload_to='fotos/servidores',
width_field='foto_largura',
@ -89,79 +43,17 @@ class Servidor(models.Model):
)
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,
)
servico = models.ForeignKey(
'servidores.Servico',
Servico,
on_delete=models.SET_NULL,
blank=True,
null=True
)
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,
)
de_fora = models.BooleanField(default=False)
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)
ato_numero = 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)
# Informações de contato
email_pessoal = models.EmailField('email pessoal', blank=True, null=True)
endereco = generic.GenericRelation('contatos.Endereco')
telefones = generic.GenericRelation('contatos.Telefone')
ramal = models.CharField(max_length=25, blank=True, null=True)
class Meta:
ordering = ('nome_completo',)
verbose_name_plural = 'servidores'
def is_chefe(self):
""" Verifica se o servidor é chefe ou diretor
"""
pass
def data_entrada(self):
""" Verifica a data de entrada da função mais antiga
"""
pass
def data_saida(self):
""" Verifica a data de saída da função mais recente
de um servidor desativado
Caso o usuário esteja ativo retorna None
"""
pass
@property
def diagnosticos(self):
""" Retorna todos os diagnosticos que este servidor
participa, isto é, como responsavel ou parte da equipe
"""
diagnosticos = set(self.diagnostico_set.filter(publicado=True).all())
for equipe in self.equipe_set.all():
diagnosticos.add(equipe.diagnostico)
return list(diagnosticos)
def __unicode__(self):
return self.nome_completo
@ -172,8 +64,6 @@ User.servidor = property(lambda user: Servidor.objects.get(user=user))
# Sinal para ao criar um usuário criar um servidor
# baseado no nome contino no LDAP
def create_user_profile(sender, instance, created, **kwargs):
if created:
Servidor.objects.create(
@ -182,73 +72,3 @@ def create_user_profile(sender, instance, created, **kwargs):
)
post_save.connect(create_user_profile, sender=User)
class Funcao(models.Model):
""" Modelo para guardar o histórico de funções dos
servidores no Interlegis
"""
servidor = models.ForeignKey(Servidor, on_delete=models.CASCADE)
funcao = models.CharField(max_length=250, null=True)
cargo = models.CharField(max_length=250, null=True)
inicio_funcao = models.DateField(u'início da função', null=True)
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):
""" Modelo que representa as licenças tiradas pelos servidores
"""
servidor = models.ForeignKey(Servidor, on_delete=models.CASCADE)
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 days():
""" Calcula a quantidade de dias da licença
"""
pass
def __unicode__(self):
return str(self.id)
class Ferias(models.Model):
""" Modelo que representa as férias tiradas pelos servidores
"""
servidor = models.ForeignKey(Servidor, on_delete=models.CASCADE)
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 days():
""" Calcula a quantidade de dias das férias
"""
pass
def __unicode__(self):
return str(self.id)

51
sigi/apps/servidores/templates/servidores/servidores_por_cargo.html

@ -1,51 +0,0 @@
{% extends "base_report.html" %}
{% load i18n %}
{% block extra_head %}
<style type="text/css">
tr.title {
text-align: center;
font-size: 1.2em;
border-bottom: 2px black solid;
}
tr.data {
padding: 2px 5px;
border-bottom: 1px gray solid;
}
tr.total {
font-weight: bold;
}
td.index {
width: 50px;
}
</style>
{% endblock %}
{% block subsecretaria %}
{% trans 'SUBSECRETARIA DE ADMINISTRAÇÃO – SSADM' %}
{% endblock %}
{% block report %}
<div>
<h1>{% trans 'Relatório de Servidores por Cargo' %}</h1>
<table class="report">
<tr class="title">
<td class="index"></td>
<td>{% trans 'Cargo' %}</td>
<td>{% trans 'Servidores' %}</td>
</tr>
{% for r in report %}
<tr class="data">
<td>{{ forloop.counter }}</td>
<td>{{ r.cargo }}</td>
<td>{{ r.cargo__count }}</td>
</tr>
{% endfor %}
<tr class="data total">
<td></td>
<td>{% trans 'Total' %}</td>
<td>{{ total }}</td>
</tr>
</table>
</div>
{% endblock %}

51
sigi/apps/servidores/templates/servidores/servidores_por_funcao.html

@ -1,51 +0,0 @@
{% extends "base_report.html" %}
{% load i18n %}
{% block extra_head %}
<style type="text/css">
tr.title {
text-align: center;
font-size: 1.2em;
border-bottom: 2px black solid;
}
tr.data {
padding: 2px 5px;
border-bottom: 1px gray solid;
}
tr.total {
font-weight: bold;
}
td.index {
width: 50px;
}
</style>
{% endblock %}
{% block subsecretaria %}
{% trans 'SUBSECRETARIA DE ADMINISTRAÇÃO – SSADM' %}
{% endblock %}
{% block report %}
<div>
<h1>{% trans 'Relatório de Servidores por Função' %}</h1>
<table class="report">
<tr class="title">
<td class="index"></td>
<td>{% trans 'Função' %}</td>
<td>{% trans 'Servidores' %}</td>
</tr>
{% for r in report %}
<tr class="data">
<td>{{ forloop.counter }}</td>
<td>{{ r.funcao }}</td>
<td>{{ r.funcao__count }}</td>
</tr>
{% endfor %}
<tr class="data total">
<td></td>
<td>{% trans 'Total' %}</td>
<td>{{ total }}</td>
</tr>
</table>
</div>
{% endblock %}

11
sigi/apps/servidores/urls.py

@ -1,11 +0,0 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
urlpatterns = patterns(
'sigi.apps.servidores.views',
# Reports servidores
url(r'^servidores_por_funcao.pdf$', 'servidores_por_funcao', name='servidores-funcao-pdf'),
url(r'^servidores_por_cargo.pdf$', 'servidores_por_cargo', name='servidores-cargo-pdf'),
)

34
sigi/apps/servidores/views.py

@ -1,34 +0,0 @@
# -*- coding: utf-8 -*-
import new
from django.template import RequestContext
from django.shortcuts import render_to_response, get_object_or_404, redirect
from django.db.models import Avg, Max, Min, Count
from sigi.apps.servidores.models import Servidor, Funcao
from sigi.shortcuts import render_to_pdf
def servidores_por_funcao(request):
report = Funcao.objects.values('funcao').annotate(funcao__count=Count('funcao')).order_by('funcao__count')
total = Funcao.objects.count()
context = RequestContext(request, {
'pagesize': 'A4',
'report': report,
'total': total
})
return render_to_pdf('servidores/servidores_por_funcao.html', context)
def servidores_por_cargo(request):
report = Funcao.objects.values('cargo').annotate(cargo__count=Count('cargo')).order_by('cargo__count')
total = Funcao.objects.count()
context = RequestContext(request, {
'pagesize': 'A4',
'report': report,
'total': total
})
return render_to_pdf('servidores/servidores_por_cargo.html', context)

1
sigi/urls.py

@ -15,7 +15,6 @@ urlpatterns = patterns(
url(r'^casas/', include('sigi.apps.casas.urls')),
url(r'^convenios/', include('sigi.apps.convenios.urls')),
url(r'^diagnosticos/', include('sigi.apps.diagnosticos.urls')),
url(r'^servidores/', include('sigi.apps.servidores.urls')),
url(r'^servicos/', include('sigi.apps.servicos.urls')),
url(r'^dashboard/', include('sigi.apps.metas.urls')),
url(r'^ocorrencias/', include('sigi.apps.ocorrencias.urls')),

Loading…
Cancel
Save