mirror of https://github.com/interlegis/sigi.git
Breno Teixeira
11 years ago
11 changed files with 740 additions and 0 deletions
@ -0,0 +1,87 @@ |
|||
# -*- coding: utf-8 -*- |
|||
from django.contrib import admin |
|||
from django.contrib.contenttypes import generic |
|||
|
|||
from sigi.apps.utils.admin_widgets import AdminImageWidget |
|||
from sigi.apps.servidores.models import Servidor, Funcao, Licenca, Ferias |
|||
from sigi.apps.contatos.models import Endereco, Telefone |
|||
from sigi.apps.servidores.forms import FeriasForm, LicencaForm, FuncaoForm |
|||
|
|||
class FuncaoAdmin(admin.ModelAdmin): |
|||
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(admin.ModelAdmin): |
|||
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 LicencaAdmin(admin.ModelAdmin): |
|||
form = LicencaForm |
|||
list_display = ('servidor', 'inicio_licenca', 'fim_licenca') |
|||
list_filter = ('servidor', 'inicio_licenca', 'fim_licenca') |
|||
search_fields = ('obs', |
|||
'servidor__nome_completo', 'servidor__email_pessoal', |
|||
'servidor__user__email', 'servidor__user__username') |
|||
|
|||
class EnderecoInline(generic.GenericStackedInline): |
|||
model = Endereco |
|||
extra = 0 |
|||
raw_id_fields = ('municipio',) |
|||
|
|||
class TelefonesInline(generic.GenericTabularInline): |
|||
extra = 1 |
|||
model = Telefone |
|||
|
|||
class ServidorAdmin(admin.ModelAdmin): |
|||
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 = 'ativo' |
|||
|
|||
list_display = ('nome_completo', 'is_active', 'foto', 'servico', ) |
|||
list_filter = ('user', 'sexo', 'servico',) |
|||
search_fields = ('nome_completo', 'obs', 'apontamentos', |
|||
'user__email', 'user__first_name', |
|||
'user__last_name', 'user__username') |
|||
raw_id_fields = ('user',) |
|||
inlines= (TelefonesInline,EnderecoInline) |
|||
fieldsets = ( |
|||
(u'Autenticação', { |
|||
'fields': ('user',), |
|||
}), |
|||
('Cadastro', { |
|||
'fields': ('nome_completo', 'foto', 'email_pessoal', 'rg', 'cpf', 'sexo', 'data_nascimento', 'matricula', 'ramal', 'data_nomeacao', 'ato_numero', 'ato_exoneracao') |
|||
}), |
|||
('Lotação', { |
|||
'fields': ('servico', 'turno', 'de_fora'), |
|||
}), |
|||
(u'Observações', { |
|||
'fields': ('apontamentos', 'obs'), |
|||
}), |
|||
) |
|||
|
|||
def lookup_allowed(self, lookup, value): |
|||
return super(ServidorAdmin, self).lookup_allowed(lookup, value) or \ |
|||
lookup in ['user__is_active__exact'] |
|||
|
|||
def formfield_for_dbfield(self, db_field, **kwargs): |
|||
if db_field.name == 'foto': |
|||
request = kwargs.pop("request", None) |
|||
kwargs['widget'] = AdminImageWidget |
|||
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) |
@ -0,0 +1,60 @@ |
|||
# -*- coding: utf8 -*- |
|||
|
|||
from django import forms |
|||
|
|||
from sigi.apps.utils.validators import valida_data, valida_periodo_data |
|||
|
|||
from sigi.apps.servidores.models import Ferias, Licenca, Funcao, Servidor |
|||
|
|||
|
|||
class FeriasForm(forms.ModelForm): |
|||
class Meta: |
|||
model = Ferias |
|||
|
|||
def clean(self): |
|||
data = self.cleaned_data |
|||
if valida_data(data.get('inicio_ferias'), data.get('fim_ferias')): |
|||
raise forms.ValidationError(u"""A data de início deve ser menor |
|||
que a data final. Verifique novamente""") |
|||
return data |
|||
|
|||
|
|||
class LicencaForm(forms.ModelForm): |
|||
class Meta: |
|||
model = Licenca |
|||
|
|||
def clean(self): |
|||
data = self.cleaned_data |
|||
if valida_data(data.get('inicio_licenca'), data.get('fim_licenca')): |
|||
raise forms.ValidationError(u"""A data de início deve ser menor |
|||
que a data final. Verifique novamente""") |
|||
return data |
|||
|
|||
|
|||
class FuncaoForm(forms.ModelForm): |
|||
class Meta: |
|||
model = Funcao |
|||
|
|||
def clean(self): |
|||
data = self.cleaned_data |
|||
if valida_data(data.get('inicio_funcao'), data.get('fim_funcao')): |
|||
raise forms.ValidationError(u"""A data de início deve ser menor |
|||
que a data final. Verifique |
|||
novamente""") |
|||
|
|||
# Verifica na função anterior, se o seu período é igual |
|||
# ou está entre o período da função atual. |
|||
servidor = Servidor.objects.get(nome_completo=data.get('servidor')) |
|||
if len(servidor.funcao_set.all()): |
|||
if len(servidor.funcao_set.all()) > 1: |
|||
funcao_anterior = servidor.funcao_set.all()[1] |
|||
elif len(servidor.funcao_set.all()) == 1: |
|||
funcao_anterior = servidor.funcao_set.all()[0] |
|||
|
|||
if valida_periodo_data(funcao_anterior.inicio_funcao, |
|||
funcao_anterior.fim_funcao, data.get('inicio_funcao'), |
|||
data.get('fim_funcao')): |
|||
raise forms.ValidationError(u"""Você não pode exercer |
|||
uma função no mesmo período que a anterior, como também, |
|||
não pode ser entre o período da mesma.""") |
|||
return data |
@ -0,0 +1,236 @@ |
|||
# coding= utf-8 |
|||
import sys |
|||
import csv |
|||
import re |
|||
from datetime import datetime |
|||
from django.core.management.base import BaseCommand, CommandError |
|||
from django.contrib.auth.models import User |
|||
from sigi.apps.servidores.models import Servidor, Servico, Subsecretaria, Funcao, Ferias, Licenca |
|||
from sigi.apps.contatos.models import Municipio |
|||
|
|||
#Funcao.objects.all().delete() |
|||
#Ferias.objects.all().delete() |
|||
#Licenca.objects.all().delete() |
|||
#for u in User.objects.filter(date_joined__gte=datetime(2011, 12, 9, 10, 58, 49, 83734)).all(): |
|||
# u.servidor_set.all().delete() |
|||
# u.delete() |
|||
|
|||
class MigrationError(Exception): |
|||
pass |
|||
|
|||
class Command(BaseCommand): |
|||
help = 'Migra usuários do antigo Sistema de RH' |
|||
|
|||
def to_date(self, data): |
|||
return datetime.strptime(data, "%Y-%m-%d 00:00:00") |
|||
|
|||
def handle(self, *args, **options): |
|||
reader = csv.reader(open("/tmp/pessoal.csv"), delimiter=',', quotechar="\"") |
|||
|
|||
BRASILIA = Municipio.objects.get(codigo_ibge=5300108) |
|||
|
|||
# Read the column names from the first line of the file |
|||
fields = reader.next() |
|||
for row in reader: |
|||
# cria um dict com a primeira e a linha atual |
|||
pessoa = zip(fields, row) |
|||
p = {} |
|||
for (name, value) in pessoa: |
|||
p[name] = value.strip() |
|||
|
|||
user = None |
|||
if not p['email']: |
|||
username = '' |
|||
email = '' |
|||
elif not ('@interlegis' in p['email']): |
|||
username = p['email'].split('@')[0].strip().lower() |
|||
email = '' |
|||
else: |
|||
username = p['email'].split('@')[0].strip().lower() |
|||
email = username + '@interlegis.gov.br' |
|||
|
|||
# buscar usuário e servidor da linha atual |
|||
try: |
|||
# procuro o usuario por email do interlegis |
|||
if email: |
|||
try: user = User.objects.get(email=email) |
|||
except User.DoesNotExist: |
|||
email = username + '@interlegis.leg.br' |
|||
try: user = User.objects.get(email=email) |
|||
except User.DoesNotExist: pass |
|||
|
|||
if not user and username: |
|||
try: user = User.objects.get(username=username) |
|||
except User.DoesNotExist: |
|||
try: user = User.objects.get(username=username + "__") |
|||
except User.DoesNotExist: pass |
|||
|
|||
if not user: |
|||
if not username: |
|||
raise MigrationError |
|||
|
|||
if not email: |
|||
# cria um username a partir do email sem |
|||
# colidir com os usuarios ldap |
|||
username = username + '__' |
|||
|
|||
names = p['nome_completo'].split(' ') |
|||
first_name = names[0] |
|||
last_name = " ".join(names[1:]) |
|||
|
|||
user = User.objects.create( |
|||
username = username, |
|||
email = email, |
|||
first_name = first_name, |
|||
last_name = last_name[:30], |
|||
is_active= False |
|||
) |
|||
|
|||
servidor = user.servidor |
|||
except Servidor.DoesNotExist: |
|||
servidor = Servidor.objects.create( |
|||
user=user, |
|||
nome_completo= "%s %s" % (user.first_name, user.last_name) |
|||
) |
|||
except MigrationError, e: |
|||
print ", ".join(row) |
|||
continue |
|||
|
|||
# mapeando dados simples |
|||
servidor.nome_completo = p['nome_completo'] |
|||
servidor.cpf = p['cpf'] |
|||
servidor.rg = p['identidade'] |
|||
servidor.apelido = p['username'] |
|||
servidor.matricula = p['matricula'] |
|||
servidor.ato_exoneracao = p['ato_exoneracao'] |
|||
servidor.ato_numero = p['ato_numero'] |
|||
servidor.ramal = p['ramal'] |
|||
|
|||
if p['email'] and not '@interlegis' in p['email']: |
|||
servidor.email_pessoal= p['email'] |
|||
|
|||
if p['inativo']=="-1": |
|||
servidor.user.is_active = False |
|||
else: |
|||
servidor.user.is_active = True |
|||
servidor.user.save() |
|||
|
|||
if p['de_fora']=="-1": |
|||
servidor.de_fora = True |
|||
else: |
|||
servidor.de_fora = False |
|||
|
|||
if p['sexo'].upper() == 'M': |
|||
servidor.sexo = 'M' |
|||
elif p['sexo'].upper() == 'F': |
|||
servidor.sexo = 'F' |
|||
|
|||
if p['turno']=="1": |
|||
servidor.turno = 'M' |
|||
elif p['turno']=="2": |
|||
servidor.turno = 'T' |
|||
elif p['turno']=="3": |
|||
servidor.turno = 'N' |
|||
|
|||
if p['aniversario']: |
|||
servidor.data_nascimento = self.to_date(p['aniversario']) |
|||
|
|||
if p['data_nomeacao']: |
|||
servidor.data_nomeacao = self.to_date(p['data_nomeacao']) |
|||
|
|||
if p['secretaria_sigla']: |
|||
if ' - ' in p['secretaria_nome']: |
|||
secretaria_nome = p['secretaria_nome'].split(' - ')[1] |
|||
else: |
|||
secretaria_nome = p['secretaria_nome'] |
|||
|
|||
secretaria = Subsecretaria.objects.get_or_create( |
|||
sigla = p['secretaria_sigla'], |
|||
nome = secretaria_nome |
|||
)[0] |
|||
|
|||
if ' - ' in p['servico_nome']: |
|||
servico_nome = p['servico_nome'].split(' - ')[1] |
|||
else: |
|||
servico_nome = p['servico_nome'] |
|||
|
|||
servico = Servico.objects.get_or_create( |
|||
sigla = p['servico_sigla'], |
|||
nome = servico_nome |
|||
)[0] |
|||
|
|||
servico.subsecretaria = secretaria |
|||
servico.save() |
|||
servidor.servico = servico |
|||
|
|||
if p['telefone']: |
|||
try: |
|||
t = servidor.telefones.get(numero=p['telefone']) |
|||
except: |
|||
t = servidor.telefones.create(numero=p['telefone']) |
|||
t.tipo = 'F' |
|||
t.save() |
|||
|
|||
if p['celular']: |
|||
try: |
|||
t = servidor.telefones.get(numero=p['celular']) |
|||
except: |
|||
t = servidor.telefones.create(numero=p['celular']) |
|||
t.tipo = 'M' |
|||
t.save() |
|||
|
|||
if p['endereco']: |
|||
try: |
|||
e = servidor.endereco.get(logradouro=p['endereco']) |
|||
except: |
|||
e = servidor.endereco.create(logradouro=p['endereco']) |
|||
e.municipio = BRASILIA |
|||
e.bairro = p['cidade'] # bizarro mas é isso mesmo |
|||
e.cep = re.sub("\D", "", p['cep']) |
|||
e.save() |
|||
|
|||
servidor.apontamentos = p['apontamentos'] |
|||
servidor.obs = p['obs'] |
|||
|
|||
if p['cargo'] or p['funcao']: |
|||
funcao = servidor.funcao_set.get_or_create( |
|||
funcao = p['funcao'], |
|||
cargo = p['cargo'], |
|||
)[0] |
|||
|
|||
if p['data_bap_entrada']: |
|||
funcao.data_bap_entrada = self.to_date(p['data_bap_entrada']) |
|||
|
|||
if p['data_bap_saida']: |
|||
funcao.data_bap_saida = self.to_date(p['data_bap_saida']) |
|||
|
|||
if p['data_entrada']: |
|||
funcao.inicio_funcao = self.to_date(p['data_entrada']) |
|||
|
|||
if p['data_saida']: |
|||
funcao.fim_funcao = self.to_date(p['data_saida']) |
|||
|
|||
funcao.bap_entrada = p['bap_entrada'] |
|||
funcao.bap_saida = p['bap_saida'] |
|||
funcao.save() |
|||
|
|||
if re.search(r'estagi.ri[o|a]',p['cargo'],re.I): |
|||
#TODO inserir dados de estagio |
|||
pass |
|||
|
|||
if p['inicio_ferias'] and p['final_ferias']: |
|||
servidor.ferias_set.get_or_create( |
|||
inicio_ferias = self.to_date(p['inicio_ferias']), |
|||
fim_ferias = self.to_date(p['final_ferias']), |
|||
obs = p['obs_ferias'] |
|||
) |
|||
|
|||
if p['inicio_licenca'] and p['fim_licenca']: |
|||
servidor.licenca_set.get_or_create( |
|||
inicio_licenca = self.to_date(p['inicio_licenca']), |
|||
fim_licenca = self.to_date(p['fim_licenca']), |
|||
obs = p['obs_licenca'] |
|||
) |
|||
|
|||
servidor.save() |
|||
|
@ -0,0 +1,100 @@ |
|||
# coding= utf-8 |
|||
import ldap |
|||
from django.core.management.base import BaseCommand, CommandError |
|||
from django.contrib.auth.models import User, Group |
|||
from sigi.settings import * |
|||
from sigi.apps.servidores.models import Servidor |
|||
|
|||
class Command(BaseCommand): |
|||
help = 'Sincroniza Usuários e Servidores com o LDAP' |
|||
|
|||
def handle(self, *args, **options): |
|||
self.sync_groups() |
|||
self.sync_users() |
|||
|
|||
def get_ldap_groups(self): |
|||
filter = "(&(objectclass=Group))" |
|||
values = ['cn',] |
|||
l = ldap.initialize(AUTH_LDAP_SERVER_URI) |
|||
l.protocol_version = ldap.VERSION3 |
|||
l.simple_bind_s(AUTH_LDAP_BIND_DN.encode('utf-8'),AUTH_LDAP_BIND_PASSWORD) |
|||
result_id = l.search(AUTH_LDAP_GROUP, ldap.SCOPE_SUBTREE, filter, values) |
|||
result_type, result_data = l.result(result_id, 1) |
|||
l.unbind() |
|||
return result_data |
|||
|
|||
def get_ldap_users(self): |
|||
filter = "(&(objectclass=user))" |
|||
values = ['sAMAccountName', 'userPrincipalName', 'givenName', 'sn', 'cn' ] |
|||
l = ldap.initialize(AUTH_LDAP_SERVER_URI) |
|||
l.protocol_version = ldap.VERSION3 |
|||
l.simple_bind_s(AUTH_LDAP_BIND_DN.encode('utf-8'),AUTH_LDAP_BIND_PASSWORD) |
|||
result_id = l.search(AUTH_LDAP_USER.encode('utf-8'), ldap.SCOPE_SUBTREE, filter, values) |
|||
result_type, result_data = l.result(result_id, 1) |
|||
l.unbind() |
|||
return result_data |
|||
|
|||
def sync_groups(self): |
|||
ldap_groups = self.get_ldap_groups() |
|||
for ldap_group in ldap_groups: |
|||
try: group_name = ldap_group[1]['cn'][0] |
|||
except: pass |
|||
else: |
|||
try: group = Group.objects.get(name=group_name) |
|||
except Group.DoesNotExist: |
|||
group = Group(name=group_name) |
|||
group.save() |
|||
print "Group '%s' created." % group_name |
|||
print "Groups are synchronized." |
|||
|
|||
def sync_users(self): |
|||
ldap_users = self.get_ldap_users() |
|||
for ldap_user in ldap_users: |
|||
try: username = ldap_user[1]['sAMAccountName'][0] |
|||
except: pass |
|||
else: |
|||
try: email = ldap_user[1]['userPrincipalName'][0] |
|||
except: email = '' |
|||
try: first_name = ldap_user[1]['givenName'][0] |
|||
except: first_name = username |
|||
try: last_name = ldap_user[1]['sn'][0][:30] |
|||
except: last_name = '' |
|||
try: user = User.objects.get(username=username) |
|||
except User.DoesNotExist: |
|||
try: |
|||
user = User.objects.get(email=email) |
|||
user.username = username |
|||
except User.DoesNotExist: |
|||
user = User.objects.create_user( |
|||
username = username, |
|||
email = email |
|||
) |
|||
user.first_name = first_name |
|||
user.last_name = last_name |
|||
print "User '%s' created." % username |
|||
try: nome_completo = ldap_user[1]['cn'][0] |
|||
except: nome_completo = '' |
|||
try: |
|||
servidor = user.servidor |
|||
if not servidor.nome_completo == nome_completo.decode('utf8'): |
|||
servidor.nome_completo = nome_completo |
|||
print "Servidor '%s' updated." % nome_completo |
|||
except Servidor.DoesNotExist: |
|||
try: servidor = Servidor.objects.get(nome_completo=nome_completo) |
|||
except Servidor.DoesNotExist: |
|||
servidor = user.servidor_set.create(nome_completo=nome_completo) |
|||
print "Servidor '%s' created." % nome_completo |
|||
else: |
|||
if not user.email == email.decode('utf8'): |
|||
user.email = email |
|||
print "User '%s' email updated." % username |
|||
if not user.first_name == first_name.decode('utf8'): |
|||
user.first_name = first_name |
|||
print "User '%s' first name updated." % username |
|||
if not user.last_name == last_name.decode('utf8'): |
|||
user.last_name = last_name |
|||
print "User '%s' last name updated." % username |
|||
servidor.user = user |
|||
servidor.save() |
|||
user.save() |
|||
print "Users are synchronized." |
@ -0,0 +1,223 @@ |
|||
# -*- coding: utf-8 -*- |
|||
from django.db import models |
|||
from django.db.models.signals import post_save |
|||
from django.contrib.contenttypes import generic |
|||
from django.contrib.auth.models import User |
|||
|
|||
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', 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(max_length=250, null=True) |
|||
sigla = models.CharField(max_length=10, null=True) |
|||
subsecretaria = models.ForeignKey(Subsecretaria, null=True) |
|||
# servidor responsavel por chefiar o serviço |
|||
responsavel = models.ForeignKey('servidores.Servidor', related_name='chefe', null=True) |
|||
|
|||
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): |
|||
""" 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, unique=True) |
|||
user.is_active__filter = True |
|||
nome_completo = models.CharField(max_length=128) |
|||
nome_completo.alphabetic_filter = True |
|||
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', |
|||
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, |
|||
) |
|||
servico = models.ForeignKey('servidores.Servico', 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 |
|||
|
|||
# Soluçao alternativa para extender o usuário do django |
|||
# Acessa do servidor de um objeto user criando um profile |
|||
# baseado nos dados do LDAP |
|||
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( |
|||
user=instance, |
|||
nome_completo= "%s %s" % (instance.first_name, instance.last_name) |
|||
) |
|||
|
|||
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) |
|||
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) |
|||
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) |
|||
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) |
@ -0,0 +1,33 @@ |
|||
# -*- coding: utf8 -*- |
|||
|
|||
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) |
|||
|
Loading…
Reference in new issue