#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.shortcuts import render, redirect, render_to_response
from django.template import RequestContext
from django.http import HttpResponse
from django.db import IntegrityError
from django.contrib.auth.decorators import login_required
from models import *
from utils import *
import os
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth import authenticate, login, logout
from datetime import datetime, date
import time
from django.conf import settings
def pagina_inicial(request):
lista_funcionarios = list(Funcionario.objects.all().exclude(username='admin'))
lista_funcionarios.sort()
admin_autenticado = request.user.is_superuser
status_autenticacao = None
if 'status_autenticacao' in request.session:
status_autenticacao = request.session['status_autenticacao']
if admin_autenticado:
nome_funcionario = None
if 'nome_funcionario' in request.session and request.session['nome_funcionario']:
nome_funcionario = request.session['nome_funcionario']
else:
try:
nome_funcionario = lista_funcionarios[0].username
request.session['nome_funcionario'] = nome_funcionario
except Exception:
pass
for funcionario in lista_funcionarios:
if funcionario.username == nome_funcionario:
funcionario.selecionado = True
return render_to_response('pagina_inicial.html', locals(), context_instance=RequestContext(request))
def autenticar(request):
funcionario = None
nome_usuario = None
senha = None
origem = "/"
if 'HTTP_REFERER' in request.META and request.META['HTTP_REFERER']:
origem = request.META['HTTP_REFERER']
if 'nome_usuario' in request.POST and request.POST['nome_usuario']:
nome_usuario = request.POST['nome_usuario']
if 'senha' in request.POST and request.POST['senha']:
senha = request.POST['senha']
if nome_usuario and senha:
funcionario = authenticate(username=nome_usuario, password=senha)
if funcionario is not None:
if funcionario.is_active:
login(request, funcionario)
request.session['status_autenticacao'] = None
else:
request.session['status_autenticacao'] = "Usuário Desabilitado"
# Return a 'disabled account' error message
else:
request.session['status_autenticacao'] = "Usuário Inválido"
# Return an 'invalid login' error message.
return redirect(origem, permanent=False)
# Página inicial que redireciona para o Django Admin.
def sair(request):
logout(request)
return redirect('pagina_inicial', permanent=False)
@login_required(login_url='/')
def batidasponto(request):
admin_autenticado = request.user.is_superuser
if admin_autenticado:
if 'nome_funcionario' in request.session and request.session['nome_funcionario']:
nome_funcionario = request.session['nome_funcionario']
funcionario = Funcionario.objects.get(username=nome_funcionario)
else:
funcionario = request.user
batidasponto = []
if not funcionario.is_anonymous():
batidasponto = list(BatidaPonto.objects.filter(funcionario=funcionario))
batidasponto.reverse()
dias_semana = ["Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira", "Sexta-feira","Sábado","Domingo"]
for bp in batidasponto:
bp.dia_semana = dias_semana[bp.momento_batidaponto.weekday()]
return render_to_response('batidasponto.html', locals(), context_instance=RequestContext(request))
@login_required(login_url='/')
def resumodiario(request):
admin_autenticado = request.user.is_superuser
if admin_autenticado:
if 'nome_funcionario' in request.session and request.session['nome_funcionario']:
nome_funcionario = request.session['nome_funcionario']
funcionario = Funcionario.objects.get(username=nome_funcionario)
else:
funcionario = request.user
datas_horastrabalhadas = []
if not funcionario.is_anonymous():
datas_horastrabalhadas = horas_trabalhadas_dia(funcionario)
datas_horastrabalhadas.reverse()
dias_semana = ["Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira", "Sexta-feira","Sábado","Domingo"]
for dht in datas_horastrabalhadas:
dht.dia_semana = dias_semana[dht.data.weekday()]
for dht in datas_horastrabalhadas:
comentario = None
try:
comentario = Comentario.objects.get(funcionario=funcionario, data=dht.data)
except ObjectDoesNotExist:
pass
if comentario:
dht.comentario = comentario
for dht in datas_horastrabalhadas:
observacao = None
try:
observacao = Observacao.objects.get(data=dht.data)
except ObjectDoesNotExist:
pass
if observacao:
dht.observacao = observacao
return render_to_response('resumodiario.html', locals(), context_instance=RequestContext(request))
@login_required(login_url='/')
def resumosemanal(request):
admin_autenticado = request.user.is_superuser
if admin_autenticado:
if 'nome_funcionario' in request.session and request.session['nome_funcionario']:
nome_funcionario = request.session['nome_funcionario']
funcionario = Funcionario.objects.get(username=nome_funcionario)
else:
funcionario = request.user
semanas_horastrabalhadas = []
if not funcionario.is_anonymous():
semanas_horastrabalhadas = horas_trabalhadas_semana(funcionario)
semanas_horastrabalhadas.reverse()
return render_to_response('resumosemanal.html', locals(), context_instance=RequestContext(request))
def forcar_sincronizacao(request):
if sincronizar():
return HttpResponse("Os dados foram sincronizados com sucesso.")
else:
return HttpResponse("Não há funcionários cadastrados.")
# Relatórios
@login_required(login_url='/')
def relatorio_individual(request, funcionario=None, mes=None, ano=None):
admin_autenticado = request.user.is_superuser
if not admin_autenticado:
mensagem_erro = "Acesso negado! Apenas o administrador pode acessar esta função."
destino = "/"
return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
if 'funcionario' in request.POST and request.POST['funcionario']:
funcionario = request.POST['funcionario']
if 'mes' in request.POST and request.POST['mes']:
mes = request.POST['mes']
if 'ano' in request.POST and request.POST['ano']:
ano = request.POST['ano']
return redirect("/relatorio_individual/%s/%s/%s/" %(funcionario, mes, ano), permanent=False)
else:
if not funcionario:
# Exibe a tela que gera os relatórios.
anos = range(2010,2014+1,1)
anos.reverse()
lista_funcionarios = list(Funcionario.objects.all().exclude(username='admin'))
lista_funcionarios.sort()
return render_to_response('relatorios/tela_geracao_relatorio_individual.html', locals(), context_instance=RequestContext(request))
else:
# Gera o relatório.
relatorios_diarios = []
try:
funcionario = Funcionario.objects.get(username=funcionario)
except ObjectDoesNotExist:
pass
mes = int(mes)
ano = int(ano)
dias_semana_abreviados = ["Seg","Ter","Qua","Qui", "Sex","Sáb","Dom"]
meses = ("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro")
relatorios_diarios = gerar_relatorio_mensal(funcionario, mes, ano)
mes_texto = meses[mes-1]
# Para inverter a matrícula, descomentar a linha abaixo.
funcionario.matricula = funcionario.matricula[::-1]
for rel in relatorios_diarios:
rel.ultimo_dia_mes = False
if relatorios_diarios:
relatorios_diarios[-1].ultimo_dia_mes = True
ultima_data = None
primeira_semana = True
for rel in relatorios_diarios:
data_objeto = datetime.strptime(rel.data, "%d/%m/%Y")
rel.dia_semana = dias_semana_abreviados[data_objeto.weekday()]
datas = []
if data_objeto.weekday() == 5:
rel.sabado = True
if primeira_semana:
primeiro_dia_mes = datetime.strptime(relatorios_diarios[0].data, "%d/%m/%Y")
dia_temp = primeiro_dia_mes
while dia_temp <= data_objeto:
datas.append(dia_temp)
dia_temp += timedelta(days=1)
primeira_semana = False
else:
for i in range(7):
datas.append(data_objeto - timedelta(days=i))
rel.horas_ate_este_sabado = horas_trabalhadas_datas(funcionario, datas)
elif rel.ultimo_dia_mes:
data_objeto = datetime.strptime(rel.data, "%d/%m/%Y")
while(data_objeto.weekday() != 5):
datas.append(data_objeto)
data_objeto -= timedelta(days=1)
rel.horas_ate_este_sabado = horas_trabalhadas_datas(funcionario, datas)
return render_to_response('relatorios/relatorio_individual.html', locals(), context_instance=RequestContext(request))
@login_required(login_url='/')
def relatorio_geral(request, mes=None, ano=None):
admin_autenticado = request.user.is_superuser
if not admin_autenticado:
mensagem_erro = "Acesso negado! Apenas o administrador pode acessar esta função."
destino = "/"
return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
if 'mes' in request.POST and request.POST['mes'] and 'ano' in request.POST and request.POST['ano']:
mes = request.POST['mes']
ano = request.POST['ano']
return redirect("/relatorio_geral/%s/%s/" %(mes, ano), permanent=False)
else:
if not mes and not ano:
# Exibe a tela de geração de relatório
anos = range(2010,2014+1,1)
anos.reverse()
return render_to_response('relatorios/tela_geracao_relatorio_geral.html', locals(), context_instance=RequestContext(request))
else:
# Finalmente, gera o relatório
mes = int(mes)
ano = int(ano)
meses = ("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro")
mes_texto = meses[mes-1]
funcionarios = list(Funcionario.objects.all())
admin = Funcionario.objects.get(username='admin')
funcionarios.remove(admin)
for funcionario in funcionarios:
funcionario.semanas_horastrabalhadas = horas_trabalhadas_semana_durante_mes(funcionario, int(mes), int(ano))
for sht in funcionario.semanas_horastrabalhadas:
print sht.semana_formatada()
return render_to_response('relatorios/relatorio_geral.html', locals(), context_instance=RequestContext(request))
# Comentários
@login_required(login_url='/')
def adicionar_comentario(request, dia=None, mes=None, ano=None):
data = date(day=int(dia), month=int(mes), year=int(ano))
data_texto = data.strftime("%d/%m/%Y")
funcionario = request.user
if 'data_texto' in request.POST and 'comentario' in request.POST and 'tempo_gasto' in request.POST:
if request.POST['data_texto'] and request.POST['comentario'] and request.POST['tempo_gasto']:
funcionario = request.user
data_texto = request.POST['data_texto']
data = datetime.strptime(data_texto, "%d/%m/%Y")
texto_comentario = request.POST['comentario']
tempo_gasto = request.POST['tempo_gasto']
comentario = Comentario()
comentario.funcionario = funcionario
comentario.data = data.date()
comentario.texto = texto_comentario
if 'arquivo_anexo' in request.FILES:
arquivo_anexo = request.FILES['arquivo_anexo']
extensao = arquivo_anexo.name.split(".")[-1]
nome_arquivo = os.path.join(settings.MEDIA_ROOT, 'arquivos_anexos', funcionario.username, "%s.%s" %(data.strftime("%d-%m-%Y"), extensao))
if not os.path.exists(os.path.dirname(nome_arquivo)):
os.makedirs(os.path.dirname(nome_arquivo))
destino = open(nome_arquivo, 'wb+')
for chunk in arquivo_anexo.chunks():
destino.write(chunk)
destino.close()
comentario.arquivo_anexo = os.path.join(settings.MEDIA_URL, 'arquivos_anexos', funcionario.username, "%s.%s" %(data.strftime("%d-%m-%Y"), extensao))
try:
teste_formato = time.strptime(tempo_gasto, '%H:%M:%S')
comentario.tempo_gasto = tempo_gasto
comentario.save()
return redirect('/listar_comentarios/', permanent=False)
except ValueError:
mensagem_erro = "Digite o tempo gasto no formato <hh:mm:ss>. Exemplo: 03:00:00."
destino = "/adicionar_comentario/%s/" %data_texto
return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
return render_to_response('comentarios/adicionar_comentario.html', locals(), context_instance=RequestContext(request))
@login_required(login_url='/')
def editar_comentario(request, dia=None, mes=None, ano=None):
data = date(day=int(dia), month=int(mes), year=int(ano))
data_texto = data.strftime("%d/%m/%Y")
admin_autenticado = request.user.is_superuser
if not admin_autenticado:
mensagem_erro = "Acesso negado! Apenas o próprio dono do comentário pode acessar esta função."
destino = "/"
return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
try:
comentario = Comentario.objects.get(data=data, funcionario=funcionario)
if not comentario.avaliado_pela_chefia:
if 'data_texto' in request.POST and 'comentario' in request.POST and request.POST['data_texto'] and request.POST['comentario']:
data_texto = request.POST['data_texto']
data = datetime.strptime(data_texto, "%d/%m/%Y")
texto_comentario = request.POST['comentario']
comentario.data = data.date()
comentario.texto = texto_comentario
if 'arquivo_anexo' in request.FILES:
arquivo_anexo = request.FILES['arquivo_anexo']
extensao = arquivo_anexo.name.split(".")[-1]
nome_arquivo = os.path.join(settings.MEDIA_ROOT, 'arquivos_anexos', funcionario.username, "%s.%s" %(data.strftime("%d-%m-%Y"), extensao))
if not os.path.exists(os.path.dirname(nome_arquivo)):
os.makedirs(os.path.dirname(nome_arquivo))
destino = open(nome_arquivo, 'wb+')
for chunk in arquivo_anexo.chunks():
destino.write(chunk)
destino.close()
comentario.arquivo_anexo = os.path.join(settings.MEDIA_URL, 'arquivos_anexos', funcionario.username, "%s.%s" %(data.strftime("%d-%m-%Y"), extensao))
comentario.save()
return redirect('/listar_comentarios/', permanent=False)
else:
return render_to_response('comentarios/editar_comentario.html', locals(), context_instance=RequestContext(request))
else:
mensagem_erro = "Acesso negado! Este comentário não pode ser mais editado."
destino = "/"
return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
except ObjectDoesNotExist:
mensagem_erro = "Não existe comentário para esta data."
destino = "/listar_comentarios/"
return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
if 'data_texto' in request.POST and 'comentario' in request.POST and request.POST['data_texto'] and request.POST['comentario']:
data_texto = request.POST['data_texto']
data = datetime.strptime(data_texto, "%d/%m/%Y")
texto_comentario = request.POST['comentario']
comentario.data = data.date()
comentario.texto = texto_comentario
if 'arquivo_anexo' in request.FILES:
arquivo_anexo = request.FILES['arquivo_anexo']
extensao = arquivo_anexo.name.split(".")[-1]
nome_arquivo = os.path.join(settings.MEDIA_ROOT, 'arquivos_anexos', funcionario.username, "%s.%s" %(data.strftime("%d-%m-%Y"), extensao))
if not os.path.exists(os.path.dirname(nome_arquivo)):
os.makedirs(os.path.dirname(nome_arquivo))
destino = open(nome_arquivo, 'wb+')
for chunk in arquivo_anexo.chunks():
destino.write(chunk)
destino.close()
comentario.arquivo_anexo = os.path.join(settings.MEDIA_URL, 'arquivos_anexos', funcionario.username, "%s.%s" %(data.strftime("%d-%m-%Y"), extensao))
comentario.save()
return redirect('/listar_comentarios/', permanent=False)
else:
return render_to_response('comentarios/editar_comentario.html', locals(), context_instance=RequestContext(request))
@login_required(login_url='/')
def consultar_comentario(request, dia=None, mes=None, ano=None):
admin_autenticado = request.user.is_superuser
if admin_autenticado:
if 'nome_funcionario' in request.session and request.session['nome_funcionario']:
nome_funcionario = request.session['nome_funcionario']
funcionario = Funcionario.objects.get(username=nome_funcionario)
else:
funcionario = request.user
data = date(day=int(dia), month=int(mes), year=int(ano))
data_texto = data.strftime("%d/%m/%Y")
try:
comentario = Comentario.objects.get(data=data, funcionario=funcionario)
return render_to_response('comentarios/consultar_comentario.html', locals(), context_instance=RequestContext(request))
except ObjectDoesNotExist:
mensagem_erro = "Não existe comentário para esta data."
destino = "/listar_comentarios/"
return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
@login_required(login_url='/')
def remover_comentario(request, dia=None, mes=None, ano=None):
admin_autenticado = request.user.is_superuser
if not admin_autenticado:
mensagem_erro = "Acesso negado! Apenas o próprio dono do comentário pode acessar esta função."
destino = "/"
return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
funcionario = request.user
data = date(day=int(dia), month=int(mes), year=int(ano))
data_texto = data.strftime("%d/%m/%Y")
try:
comentario = Comentario.objects.get(data=data, funcionario=funcionario)
if not comentario.avaliado_pela_chefia:
if comentario.arquivo_anexo:
caminho_arquivo = str(comentario.arquivo_anexo).replace("/media", settings.MEDIA_ROOT)
os.remove(caminho_arquivo)
if 'remover' in request.POST:
if request.POST['remover'] == 'sim':
comentario.delete()
return redirect('/listar_comentarios/', permanent=False)
else:
mensagem_erro = "Acesso negado! Este comentário não pode ser mais removido."
destino = "/listar_comentarios/"
return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
except ObjectDoesNotExist:
mensagem_erro = "Não existe comentário para esta data."
destino = "/listar_comentarios/"
return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
else:
try:
comentario = Comentario.objects.get(data=data, funcionario=funcionario)
return render_to_response('comentarios/remover_comentario.html', locals(), context_instance=RequestContext(request))
except ObjectDoesNotExist:
mensagem_erro = "Não existe comentário para esta data."
destino = "/listar_comentarios/"
return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
@login_required(login_url='/')
def listar_comentarios(request):
comentarios = None
admin_autenticado = request.user.is_superuser
if admin_autenticado:
if 'nome_funcionario' in request.session and request.session['nome_funcionario']:
nome_funcionario = request.session['nome_funcionario']
funcionario = Funcionario.objects.get(username=nome_funcionario)
else:
funcionario = request.user
if not funcionario.is_anonymous():
comentarios = Comentario.objects.filter(funcionario=funcionario).order_by('-data')
return render_to_response('comentarios/listar_comentarios.html', locals(), context_instance=RequestContext(request))
@login_required(login_url='/')
def selecionar_funcionario(request):
nome_funcionario = None
origem = "/"
if 'nome_funcionario' in request.POST and request.POST['nome_funcionario']:
nome_funcionario = request.POST['nome_funcionario']
request.session['nome_funcionario'] = nome_funcionario
return redirect(origem, permanent=False)
# Página inicial que redireciona para o Django Admin.
@login_required(login_url='/')
def aprovar_comentarios(request):
comentarios = Comentario.objects.filter(avaliado_pela_chefia = False).order_by('-data')
for elemento in request.POST:
if 'comentario_' in elemento:
comentario_id = int(elemento.strip("comentario_"))
comentario = comentarios.get(id=comentario_id)
if request.POST[elemento] == "sim":
comentario.aprovado = True
elif request.POST[elemento] == "nao":
comentario.aprovado = False
comentario.avaliado_pela_chefia = True
comentario.save()
admin_autenticado = request.user.is_superuser
status_autenticacao = None
if 'status_autenticacao' in request.session:
status_autenticacao = request.session['status_autenticacao']
if admin_autenticado:
comentarios = Comentario.objects.filter(avaliado_pela_chefia = False).order_by('-data')
return render_to_response('comentarios/aprovar_comentarios.html', locals(), context_instance=RequestContext(request))
else:
mensagem_erro = "Acesso negado! Apenas o administrador pode acessar esta função."
destino = "/"
return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
"""
def observacoes(request):
observacoes = None
admin_autenticado = request.user.is_superuser
if admin_autenticado:
observacoes = list(Observacao.objects.all())
return render_to_response('observacoes.html', locals(), context_instance=RequestContext(request))
def observacao(request):
origem = "/"
funcionario = request.user
data_texto = None
observacao_existente = None
observacao = None
if 'data' in request.POST and request.POST['data']:
data_texto = request.POST['data']
if 'observacao' in request.POST and request.POST['observacao']:
observacao_existente = True
if observacao_existente:
data = datetime.strptime(data_texto, "%d/%m/%Y")
observacao = Observacao.objects.get(data=data)
if funcionario.is_superuser:
if data_texto:
return render_to_response('observacao.html', locals(), context_instance=RequestContext(request))
else:
return redirect(observacoes, permanent=False)
else:
return redirect(origem, permanent=False)
"""
"""
def pagina_inicial2(request):
agora = datetime.now()
try:
ultima_sincronizacao = Sincronizacao.objects.latest('data_hora')
data_hora_nova_sincronizacao = ultima_sincronizacao.data_hora + timedelta(hours=1)
if data_hora_nova_sincronizacao <= agora:
sincronizar()
gerar_resumos_diarios()
gerar_resumos_semanais()
except ObjectDoesNotExist:
sincronizar()
ultima_sincronizacao = Sincronizacao()
ultima_sincronizacao.data_hora = agora
ultima_sincronizacao.save()
return redirect('/admin/', permanent=False)
"""
# Página que sincroniza o arquivo de saída do Henry com o banco de dados.