# -*- coding: utf-8 -*-
"""
Sistema de Consulta Pública
Copyleft (@) 2017 CENDITEL nodo Mérida - https://planificacion.cenditel.gob.ve/trac/wiki/ModeladoTopicos_2017
"""
## @package participacion.views
#
# Vistas correspondientes a la aplicación participacion
# @author Rodrigo Boet (rboet at cenditel.gob.ve)
# @author Centro Nacional de Desarrollo e Investigación en Tecnologías Libres
# (CENDITEL) nodo Mérida - Venezuela
# @copyright GNU Public License versión 2 (GPLv2)
# @version 1.0
from django.shortcuts import render, redirect
from django.views.generic import FormView, RedirectView, CreateView, UpdateView, ListView
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.messages.views import SuccessMessageMixin
from django.contrib.auth import authenticate, logout, login
from django.core.urlresolvers import reverse_lazy
from django.contrib.auth.models import User, Group
from django.contrib import messages
from .forms import LoginForm, UserRegisterForm, PerfilForm
from .models import Perfil, Universidades
from base.models import Parroquia
from base.constant import OBJETIVOS_DICT, SECTORES, SECTOR_ESTUDIANTE, SECTOR_TRABAJADOR
from participacion.models import RespuestaAbierta
from easy_pdf.views import PDFTemplateView
class LoginView(FormView):
"""!
Clase que gestiona la vista principal del logeo de usuario
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU Public License versión 2 (GPLv2)
@date 01-03-2017
@version 1.0.0
"""
form_class = LoginForm
template_name = 'user.login.html'
def get_success_url(self):
"""!
Metodo que permite definir la url de dirección al ser válido el formulario
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 22-02-2017
@param self {object} Objeto que instancia la clase
@return Retorna la url
"""
grupo = self.request.user.groups.get()
if('Participante' in grupo.name):
return reverse_lazy('participacion_index')
elif('Administrador' in grupo.name):
return reverse_lazy('administrador_base')
def form_valid(self, form):
"""!
Metodo que valida si el formulario es valido
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 01-03-2017
@param self {object} Objeto que instancia la clase
@param form {object} Objeto que contiene el formulario de registro
@return Retorna el formulario validado
"""
usuario = form.cleaned_data['usuario']
contrasena = form.cleaned_data['contrasena']
usuario = authenticate(username=usuario, password=contrasena)
login(self.request, usuario)
if self.request.POST.get('remember_me') is not None:
# Session expira a los dos meses si no se deslogea
self.request.session.set_expiry(1209600)
return super(LoginView, self).form_valid(form)
class LogoutView(RedirectView):
"""!
Clase que gestiona la vista principal del deslogeo de usuario
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU Public License versión 2 (GPLv2)
@date 01-03-2017
@version 1.0.0
"""
permanent = False
query_string = True
def get_redirect_url(self):
"""!
Metodo que permite definir la url de dirección al ser válido el formulario
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 01-03-2017
@param self {object} Objeto que instancia la clase
@return Retorna la url
"""
logout(self.request)
return reverse_lazy('login')
class RegisterView(SuccessMessageMixin,FormView):
"""!
Muestra el formulario de registro de usuarios
@author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
@copyright GNU Public License versión 2 (GPLv2)
@date 09-01-2017
@version 1.0.0
"""
template_name = "user.register.html"
form_class = UserRegisterForm
success_url = reverse_lazy('login')
success_message = "Se registró con éxito"
model = User
def form_valid(self, form, **kwargs):
"""!
Metodo que valida si el formulario es valido
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 20-04-2017
@param self {object} Objeto que instancia la clase
@param form {object} Objeto que contiene el formulario de registro
@return Retorna el formulario validado
"""
self.object = form.save()
self.object.username = form.cleaned_data['username']
self.object.first_name = form.cleaned_data['nombre']
self.object.last_name = form.cleaned_data['apellido']
self.object.set_password(form.cleaned_data['password'])
self.object.email = form.cleaned_data['email']
self.object.save()
## Se asigna el grupo de Participantes por defecto
self.object.groups.add(2)
parroquia = Parroquia.objects.get(id=form.cleaned_data['parroquia'])
perfil = Perfil()
perfil.cedula = form.cleaned_data['cedula']
perfil.sector = form.cleaned_data['sector']
if(perfil.sector=='TR'):
perfil.sector_trabajador = form.cleaned_data['sector_trabajador']
elif(perfil.sector=='ES'):
perfil.sector_estudiante = form.cleaned_data['sector_estudiante']
universidad = Universidades.objects.get(pk=form.cleaned_data['universidad'])
perfil.universidad = universidad
perfil.participacion = form.cleaned_data['participacion']
if(perfil.participacion=='CO'):
perfil.colectivo = form.cleaned_data['colectivo']
perfil.parroquia = parroquia
perfil.user = self.object
perfil.save()
return super(RegisterView, self).form_valid(form)
class PerfilUpdate(SuccessMessageMixin,LoginRequiredMixin,UpdateView):
"""!
Clase que gestiona la actualización del perfil
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU Public License versión 2 (GPLv2)
@date 24-04-2017
@version 1.0.0
"""
model = Perfil
template_name = "perfil.update.html"
form_class = PerfilForm
success_message = "Se actualizó el perfil con éxito"
def dispatch(self, request, *args, **kwargs):
"""
Metodo que redirecciona al usuario si no cuenta con los permisos
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 24-04-2017
@param self {object} Objeto que instancia la clase
@param request {object} Objeto que contiene la petición
@param args {object} Objeto que contiene los argumentos
@param kwargs {object} Objeto que contiene los datos de contexto
@return Direcciona al 403 si no es su perfil
"""
if int(self.request.user.id) != int(self.kwargs['pk']):
return redirect('base_403')
return super(PerfilUpdate, self).dispatch(request, *args, **kwargs)
def get_object(self, queryset=None):
"""
Metodo para obtener el objeto de la consulta
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 24-05-2017
@param self {object} Objeto que instancia la clase
@param queryset {object} Objeto que contiene una consulta
@return El objeto del perfil
"""
obj = Perfil.objects.get(user_id=self.kwargs['pk'])
return obj
def get_success_url(self):
"""!
Metodo que permite definir la url de dirección al ser válido el formulario
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 24-04-2017
@param self {object} Objeto que instancia la clase
@return Retorna la url
"""
return reverse_lazy('update',
kwargs={'pk': self.kwargs['pk']})
def get_initial(self):
"""!
Metodo para agregar valores de inicio al formulario
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 24-04-2017
@param self {object} Objeto que instancia la clase
@return Retorna los valores iniciales
"""
initial = super(PerfilUpdate, self).get_initial()
perfil = Perfil.objects.get(user_id=self.kwargs['pk'])
initial['parroquia'] = perfil.parroquia_id
initial['municipio'] = perfil.parroquia.municipio_id
initial['estado'] = perfil.parroquia.municipio.entidad_id
initial['sector'] = perfil.sector
initial['participacion'] = perfil.participacion
initial['colectivo'] = perfil.colectivo
return initial
def form_valid(self,form):
"""!
Metodo que valida si el formulario es valido
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 24-04-2017
@param self {object} Objeto que instancia la clase
@param form {object} Objeto que contiene el formulario de registro
@return Retorna el formulario validado
"""
parroquia = Parroquia.objects.get(id=form.cleaned_data['parroquia'])
self.object = form.save()
self.object.cedula = form.cleaned_data['cedula']
self.sector = form.cleaned_data['sector']
if(self.sector=='TR'):
self.sector_trabajador = form.cleaned_data['sector_trabajador']
elif(self.sector=='ES'):
self.sector_estudiante = form.cleaned_data['sector_estudiante']
universidad = Universidades.objects.get(pk=form.cleaned_data['universidad'])
self.universidad = universidad
self.participacion = form.cleaned_data['participacion']
if(self.participacion=='CO'):
self.colectivo = form.cleaned_data['colectivo']
self.object.parroquia = parroquia
self.object.save()
return super(PerfilUpdate, self).form_valid(form)
class MiParticipacion(LoginRequiredMixin,ListView):
"""!
Clase que gestiona la el listado de las participaciones en los aportes
de la consulta
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU Public License versión 2 (GPLv2)
@date 07-09-2017
@version 1.0.0
"""
model = RespuestaAbierta
template_name = "mi_participacion.html"
paginate_by = 5
def get_context_data(self, **kwargs):
"""!
Metodo para cargar/obtener valores en el contexto de la vista
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 28-03-2017
@param self {object} Objeto que instancia la clase
@param kwargs {object} Objeto que contiene los datos de contexto
@return Retorna los datos de contexto
"""
context = super(MiParticipacion, self).get_context_data(**kwargs)
context['object_list'] = RespuestaAbierta.objects.filter(user_id=self.request.user.id).all()
context['objetivos'] = OBJETIVOS_DICT
## Implementación del paginador
paginator = Paginator(context['object_list'], self.paginate_by)
page = self.request.GET.get('page')
try:
kwargs['page_obj'] = paginator.page(page)
except PageNotAnInteger:
kwargs['page_obj'] = paginator.page(1)
except EmptyPage:
kwargs['page_obj'] = paginator.page(paginator.num_pages)
return context
class Certificado(PDFTemplateView):
"""!
Clase que gestiona la generación en pdf de los certificados de participacion
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU Public License versión 2 (GPLv2)
@date 07-09-2017
@version 1.0.0
"""
template_name = "certificado.template.html"
def get_context_data(self, **kwargs):
"""!
Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 07-09-2017
@param self {object} Objeto que instancia la clase
@param kwargs {object} Objeto que contiene los datos de contexto
@return Retorna los datos de contexto
"""
participacionid = int(self.kwargs['pk'])
participacion = RespuestaAbierta.objects.filter(pk=participacionid)
if(participacion):
participacion = participacion.get()
kwargs['user'] = participacion.user.first_name + " " + participacion.user.last_name
kwargs['nro_obj'] = participacion.objetivo
kwargs['objetivo'] = OBJETIVOS_DICT[participacion.objetivo]
perfil = Perfil.objects.get(user_id = participacion.user_id)
SECTOR = dict(SECTORES)
kwargs['sector'] = SECTOR[perfil.sector]
if(perfil.sector_trabajador!=''):
ST = dict(SECTOR_TRABAJADOR)
kwargs['subsector'] = ST[perfil.sector_trabajador]
elif (perfil.sector_estudiante!=''):
SE = dict(SECTOR_ESTUDIANTE)
kwargs['subsector'] = SE[perfil.sector_estudiante]
kwargs['aporte_num'] = str(participacionid).zfill(10)
return super(Certificado, self).get_context_data(**kwargs)