# Create your views here.
import datetime
from datetime import date, timedelta
from django.views.generic.base import RedirectView
from Zalamero.models import *
from rest_framework import viewsets
from Zalamero.serializers import *
from django.shortcuts import render_to_response
from django.views.generic import ListView, DetailView, View
from pyjasperclient import JasperClient
import json
from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
class DependenciaViewSet(viewsets.ModelViewSet):
model = Dependencia
from django.core.mail import send_mail, BadHeaderError, EmailMultiAlternatives
class ProyectoViewSet(viewsets.ModelViewSet):
serializer_class = ProyectoSerializer
model = Proyecto
@method_decorator(csrf_exempt)
def dispatch(self, *args, **kwargs):
return super(ProyectoViewSet, self).dispatch(*args, **kwargs)
def pre_save(self, obj):
perfil = UsuariosPerfil.objects.get(usuario = self.request.user)
if str(perfil) == 'Responsables':
obj.estatus_id = 5
obj.creador = self.request.user
obj.fecha_termino = datetime.datetime.now()
return super(ProyectoViewSet, self).pre_save(obj)
def post_save(self, obj, created=False):
'''
#agregar a la columna porcentaje
actividades = Actividad.objects.filter(proyecto = self.id, estatus=True)#.annotate(por=Sum('porcentaje'))
porcentaje = 0
if actividades:
porcentaje = actividades[0].porcentaje * actividades.count()
return porcentaje
'''
if created:
# subject = 'Proyecto asignado (%s)' % obj.nombre
correos = ",".join(["'"+s.email+"'" for s in obj.responsable.all()])
usuarios = ",\n".join([ s.first_name + " " +s.last_name for s in obj.responsable.all()])
text_content = ''
message = 'Se le ha asignado un nuevo proyecto de nombre "%s" al usuario o usuarios %s.' %(obj.nombre,usuarios)
message = message + 'Si desea ingresar al sistema en este momento, de clic en la liga siguiente para ver los detalles.'
message = message + ' Ingresar al sistema de Proyectos'
#from_email = 'dgtic@tabasco.gob.mx'
try:
for responsablefor in obj.responsable.all():
subject,from_email, to = 'Proyecto asignado (%s)' % obj.nombre, 'dgtic@tabasco.gob.mx',responsablefor.email
msg = EmailMultiAlternatives(subject,text_content,from_email,[to])
msg.attach_alternative(message,"text/html")
msg.send()
#send_mail(subject, message, from_email, [str(responsablefor.email)])
except BadHeaderError:
pass
class ProyectosViewSet(viewsets.ModelViewSet):
serializer_class = ProyectoSerializer
model = Proyecto
def pre_save(self, obj):
obj.creador = self.request.user
obj.fecha_termino = datetime.datetime.now()
obj.estatus = Estatus.objects.get(pk=4)
return super(ProyectosViewSet, self).pre_save(obj)
class ComentarioViewSet(viewsets.ModelViewSet):
serializer_class = ComentarioSerializer
model = Comentario
def pre_save(self, obj):
obj.usuario = self.request.user
obj.fecha = datetime.datetime.now()
return super(ComentarioViewSet,self).pre_save(obj)
class ActividadViewSet(viewsets.ModelViewSet):
serializer_class = ActividadSerializer
model = Actividad
def pre_save(self, obj):
obj.fecha = datetime.datetime.now()
return super(ActividadViewSet, self).pre_save(obj)
def post_save(self, obj, created=False):
actividades = Actividad.objects.filter(proyecto=obj.proyecto)
if actividades.count() > 0:
for actividad in actividades:
actividad.porcentaje = str(100.00 / actividades.count())
actividad.save()
else:
obj.porcentaje = 100.00
if created:
subject = 'Actividad asignada (%s)' % obj.descripcion
correos = ",".join(["'"+s.email+"'" for s in obj.usuario.all()])
usuarios = ",\n".join([ s.first_name + " " +s.last_name for s in obj.usuario.all()])
message = 'Se le ha asignado la actividad "%s"\n' %(obj.descripcion)
message = message + 'a los usuarios %s.\n\n' %(usuarios)
from_email = 'dgtic@tabasco.gob.mx'
try:
for usuariofor in obj.usuario.all():
send_mail(subject, message, from_email, [str(usuariofor.email)])
except BadHeaderError:
pass
class EstatusViewSet(viewsets.ModelViewSet):
model = Estatus
from django.template.response import *
def index(request):
return TemplateResponse(request,'index.html')
def prueba(request):
return TemplateResponse(request,'pruebaa.html')
class IndexView(RedirectView):
def get_redirect_url(self, **kwargs):
return "/static/zalamero/app/index.html"
class ChismosoView(RedirectView):
def get_redirect_url(self, **kwargs):
return "/static/zalamero/app/templates/index.html#/chismoso"
@csrf_exempt
def login_(request):
return TemplateResponse(request,'login.html')
from django.contrib.auth import *
from django.contrib.auth.decorators import *
from django.http import *
def validar(request):
act = ActualizarProyectos(request)
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(username=username, password=password)
mensaje = ''
if user is not None:
if user.is_active:
login(request, user ) # return HttpResponse ( dependencia.objects.filter(usuarios__in=[user.id]).count() )
if user.is_staff:
return HttpResponseRedirect( '/home' ) #return HttpResponseRedirect( '/static/zalamero/app/index.html' )
else:
if user.username == 'Chismoso':
return HttpResponseRedirect('/chismoso')
else:
return HttpResponseRedirect( '/home' )
else:
mensaje = mensaje + 'cuenta desactivada'
else:
mensaje = mensaje + 'Usuario no valido, verifique sus credenciales'
return TemplateResponse(request, 'login.html', {'msj': mensaje})
def logout_user(request):
response = logout(request)
return HttpResponseRedirect('/')
def home(request):
perfil = None
try:
perfil = UsuariosPerfil.objects.get(usuario_id = request.user.id)
x = str(perfil)
except:
perfil = None
x = None
return render_to_response('index.html',{'usuario':request.user,'perfil':perfil,'x':x},context_instance = RequestContext(request))
from django.contrib.auth.models import User
class UserViewSet (viewsets.ModelViewSet):
serializer_class = UserSerializer
queryset = User.objects.all()
queryset = queryset.filter(is_staff = False)
queryset = queryset.exclude(username = 'Chismoso')
model = User
from rest_framework import generics
class ComentarioList(generics.ListAPIView):
serializer_class = ComentarioSerializerList
def get_queryset(self):
proyecto = self.request.GET.get('proyecto_id')
queryset = Comentario.objects.filter(proyecto_id = proyecto)
return queryset
from django.db.models import Q
#lista los proyectos en el menu principal
class ProyectoList(generics.ListAPIView):
serializer_class = ProyectoSerializerList
@method_decorator(never_cache)
def dispatch(self, *args, **kwargs):
return super(ProyectoList, self).dispatch(*args, **kwargs)
def get_queryset(self):
username = self.request.user
perfil = UsuariosPerfil.objects.get(usuario = username)
tipo = str(perfil)
usuario = str(username)
if tipo == 'Administrador':
if usuario == 'Chismoso':
hoy = date.today();
d=date.today()-timedelta(days=10)
queryset = Proyecto.objects.filter(Q(fecha__range=(d,hoy),estatus_id = 4)| Q(estatus_id__in = (1,2,3)))
else:
queryset = Proyecto.objects.all().exclude(estatus_id = 4)
elif tipo == 'Usuarios':
queryset = Proyecto.objects.filter(Q(responsable = username) | Q(actividad__actividadesusuario__usuario = username.id)).distinct().exclude(estatus_id =4)
else:
queryset = Proyecto.objects.filter(Q(responsable = username)|Q(creador = self.request.user)).exclude(estatus_id =4)
proyecto = self.request.GET.get('proyecto', '')
if proyecto:
queryset = queryset.filter(id=proyecto)
creador = self.request.GET.get('creador', '')
if creador:
queryset = queryset.filter(creador_id=creador)
dependencia = self.request.GET.get('dependencia', '')
if dependencia:
queryset = queryset.filter(dependencia_id=dependencia)
responsable = self.request.GET.get('responsable', '')
if responsable:
queryset = queryset.filter(responsable=responsable)
estatus = self.request.GET.get('estatus', '')
if estatus:
if estatus == '0':
queryset = queryset.filter(estatus_id__in = (1,2,3)).order_by('fecha_estimada_entrega')
else:
queryset = queryset.filter(estatus_id__in = (estatus))
return queryset
#lista los proyectos terminados
class ProyectosTerminadosList(generics.ListAPIView):
serializer_class = ProyectoSerializerList
def get_queryset(self):
username = self.request.user
perfil = UsuariosPerfil.objects.get(usuario = username)
tipo = str(perfil)
if tipo == 'Administrador':
queryset = Proyecto.objects.filter(estatus_id=4).order_by('-id')
elif tipo == 'Usuarios':
queryset = Proyecto.objects.filter(Q(responsable = username) | Q(actividad__actividadesusuario__usuario = username.id)).distinct().exclude(estatus_id = 3).exclude(estatus_id = 2).exclude(estatus_id = 1)
else:
queryset = Proyecto.objects.filter(Q(responsable = username,estatus_id = 4))
return queryset
class ActividadList(generics.ListAPIView):
"""vista para rest url consulta de actividades"""
serializer_class = ActividadSerializerlist
def get_queryset(self):
usuario = self.request.user
perfil = UsuariosPerfil.objects.get(usuario = usuario)
tipo = str(perfil)
if tipo =='Administrador' or tipo == 'Responsables':
queryset = Actividad.objects.all()
else:
queryset = Actividad.objects.filter(usuario = usuario)
proyecto = self.request.GET.get('proyecto', '')
if proyecto:
queryset = queryset.filter(proyecto_id=proyecto)
usuario = self.request.GET.get('usuario', '')
if usuario:
queryset = queryset.filter(usuario__in=(usuario))
estatus = self.request.GET.get('estatus', '')
if estatus:
queryset = queryset.filter(estatus = estatus)
return queryset
class ActividadesUsuarioViewSet(viewsets.ModelViewSet):
serializer_class = ActividadesUsuarioSerializer
model = ActividadesUsuario
def post_save(self, obj, created=False):
actividades = ActividadesUsuario.objects.filter(actividad=obj.actividad)
if actividades.count() > 0:
for actividad in actividades:
actividad.porcentaje = str(100.00 / actividades.count())
actividad.save()
else:
obj.porcentaje = 100.00
# class ActividadesList(generics.ListAPIView):
# serializer_class = ActividadesSerializer
# def get_queryset(self):
# """
# This view should return a list of all the purchases for
# the user as determined by the username portion of the URL.
# """
# proyecto_id = self.kwargs['proyecto_id']
# return Actividad.objects.filter(proyecto=proyecto_id)
class TerminarActividadViewSet(generics.RetrieveUpdateAPIView):
serializer_class = TerminarActividadesSerializer
pk_url_kwarg = 'actividad_id'
model = ActividadesUsuario
def pre_save(self, obj):
obj.usuario = self.request.user
return super(TerminarActividadViewSet,self).pre_save(obj)
class ActividadesUsuarioList(generics.ListAPIView):
serializer_class = ActividadesUsuarioSerializerlist
def get_queryset(self):
queryset = ActividadesUsuario.objects.all()
actividad = self.request.GET.get('actividad')
act_responsable = self.request.user
if actividad:
queryset=ActividadesUsuario.objects.filter(actividad__proyecto=actividad,usuario=self.request.user)
usuario = self.request.GET.get('usuario', '')
if usuario:
queryset = queryset.filter(usuario__in=(usuario))
return queryset
class ActividadesUsuarioListAdmin(generics.ListAPIView):
serializer_class = ActividadesUsuarioSerializerlist
def get_queryset(self):
queryset = ActividadesUsuario.objects.all()
actividad = self.request.GET.get('actividad')
if actividad:
queryset=queryset.filter(actividad=actividad)
return queryset
class UserList(generics.ListAPIView):
serializer_class = UserSerializer
def get_queryset(self):
queryset = User.objects.all().order_by('-id')
queryset = queryset.filter(is_staff = False)
queryset = queryset.exclude(username = 'Chismoso')
actividad = self.request.GET.get('actividad',)
if actividad:
actividad = int(actividad)
if actividad > 0:
queryset = queryset.filter(actividad = actividad)
else:
queryset = queryset.exclude(actividad = abs(actividad))
return queryset
@login_required
def perfil(request, user_id):
p = UsuariosPerfil.objects.get(usuario_id = request.user.id)
return TemplateResponse(request, 'perfil.html', {'user':request.user,'p':p} )
class JasperMix(object): #clase para invocar el reporte
url = settings.JASPERSERVER
username = 'jasperadmin'
password = 'jasperadmin'
def generateReport(self, path, namefile, params={}, tipo=None):
"""
Gennara reportes atravez del jasperserver
:param path:
:param namefile:
:param params:
:param tipo: default is PDF
"""
j = JasperClient(self.url, self.username, self.password)
ret = j.runReport(path, ("PDF" if not tipo else tipo), params)
f = file(namefile, 'w')
f.write(ret['data'])
f.close()
class reporte_directorView(View, JasperMix):
def get(self,request,*args,**kwargs):
user = kwargs.get('id')
self.generateReport('/reportes_zalamero/director_reporte',settings.MEDIA_ROOT+'/reportes/reporte_director.pdf',{'user_id':str(user),},'pdf')
return HttpResponseRedirect('/media/reportes/reporte_director'+'.pdf')
class reporteView(View, JasperMix):
def get(self,request,*args,**kwargs):
user = kwargs.get('id')
self.generateReport('/reportes_zalamero/reporte',settings.MEDIA_ROOT+'/reportes/reporte.pdf',{'user_id':str(user),},'pdf')
return HttpResponseRedirect('/media/reportes/reporte'+'.pdf')
def ActualizarProyectos(request):
proyectos = Proyecto.objects.filter(estatus_id__in = (1,2,3))
fecha_actual = date.today()
for p in proyectos:
proyecto = p.fecha_estimada_entrega + timedelta(days=3)
proyecto2 = p.fecha_estimada_entrega + timedelta(days = 7)
if proyecto < fecha_actual:
pr = Proyecto.objects.get(id = p.id)
pr.estatus_id = 2
pr.save()
elif proyecto2 < fecha_actual:
pr = Proyecto.objects.get(id = p.id)
pr.estatus_id = 3
pr.save()