# -*- 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)