# -*- 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 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 from base.models import Parroquia 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'] 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'] 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)