source: consulta_publica/users/views.py @ 32be06f

estudiantesgeneralplan_patria
Last change on this file since 32be06f was 7095598, checked in by rudmanmrrod <rudman22@…>, 7 años ago

Agregado el campo de universidades para actualizar perfil, y como campo en los reportes, se agregó también la funcionalidad de guardar en la vista, así como también su filtro en los reportes

  • Propiedad mode establecida a 100644
File size: 13.9 KB
Ver.Línea 
[cdd72e5]1# -*- coding: utf-8 -*-
2"""
3Sistema de Consulta Pública
4
5Copyleft (@) 2017 CENDITEL nodo Mérida - https://planificacion.cenditel.gob.ve/trac/wiki/ModeladoTopicos_2017
6"""
7## @package participacion.views
8#
9# Vistas correspondientes a la aplicación participacion
10# @author Rodrigo Boet (rboet at cenditel.gob.ve)
11# @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres
12# (CENDITEL) nodo Mérida - Venezuela</a>
13# @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
14# @version 1.0
[be8d917]15from django.shortcuts import render, redirect
[66ac3fc]16from django.views.generic import FormView, RedirectView, CreateView, UpdateView, ListView
17from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
[bf6bc0b]18from django.contrib.auth.mixins import LoginRequiredMixin
[be8d917]19from django.contrib.messages.views import SuccessMessageMixin
[cdd72e5]20from django.contrib.auth import authenticate, logout, login
21from django.core.urlresolvers import reverse_lazy
[bf6bc0b]22from django.contrib.auth.models import User, Group
[cdd72e5]23from django.contrib import messages
[be8d917]24from .forms import LoginForm, UserRegisterForm, PerfilForm
[7095598]25from .models import Perfil, Universidades
[bf6bc0b]26from base.models import Parroquia
[66ac3fc]27from base.constant import OBJETIVOS_DICT, SECTORES, SECTOR_ESTUDIANTE, SECTOR_TRABAJADOR
28from participacion.models import RespuestaAbierta
29from easy_pdf.views import PDFTemplateView
[cdd72e5]30
[bf6bc0b]31class LoginView(FormView):
[cdd72e5]32    """!
33    Clase que gestiona la vista principal del logeo de usuario
34
35    @author Rodrigo Boet (rboet at cenditel.gob.ve)
36    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
37    @date 01-03-2017
38    @version 1.0.0
39    """
40    form_class = LoginForm
41    template_name = 'user.login.html'
[bf6bc0b]42
43    def get_success_url(self):
44        """!
45        Metodo que permite definir la url de dirección al ser válido el formulario
46   
47        @author Rodrigo Boet (rboet at cenditel.gob.ve)
48        @copyright GNU/GPLv2
49        @date 22-02-2017
50        @param self <b>{object}</b> Objeto que instancia la clase
51        @return Retorna la url
52        """
53        grupo = self.request.user.groups.get()
54        if('Participante' in grupo.name):
55            return reverse_lazy('participacion_index')
56        elif('Administrador' in grupo.name):
57            return reverse_lazy('administrador_base')
[cdd72e5]58
59    def form_valid(self, form):
60        """!
61        Metodo que valida si el formulario es valido
62   
63        @author Rodrigo Boet (rboet at cenditel.gob.ve)
64        @copyright GNU/GPLv2
65        @date 01-03-2017
66        @param self <b>{object}</b> Objeto que instancia la clase
67        @param form <b>{object}</b> Objeto que contiene el formulario de registro
68        @return Retorna el formulario validado
69        """
70        usuario = form.cleaned_data['usuario']
71        contrasena = form.cleaned_data['contrasena']
[bf6bc0b]72        usuario = authenticate(username=usuario, password=contrasena)
73        login(self.request, usuario)
74        if self.request.POST.get('remember_me') is not None:
75            # Session expira a los dos meses si no se deslogea
76            self.request.session.set_expiry(1209600)
[cdd72e5]77        return super(LoginView, self).form_valid(form)
78   
79   
80class LogoutView(RedirectView):
81    """!
82    Clase que gestiona la vista principal del deslogeo de usuario
83
84    @author Rodrigo Boet (rboet at cenditel.gob.ve)
85    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
86    @date 01-03-2017
87    @version 1.0.0
88    """
89    permanent = False
90    query_string = True
91
92    def get_redirect_url(self):
93        """!
94        Metodo que permite definir la url de dirección al ser válido el formulario
95   
96        @author Rodrigo Boet (rboet at cenditel.gob.ve)
97        @copyright GNU/GPLv2
98        @date 01-03-2017
99        @param self <b>{object}</b> Objeto que instancia la clase
100        @return Retorna la url
101        """
102        logout(self.request)
103        return reverse_lazy('login')
104
105
[be8d917]106class RegisterView(SuccessMessageMixin,FormView):
[cdd72e5]107    """!
108    Muestra el formulario de registro de usuarios
109
110    @author Ing. Leonel P. Hernandez M. (lhernandez at cenditel.gob.ve)
111    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
112    @date 09-01-2017
113    @version 1.0.0
114    """
115    template_name = "user.register.html"
116    form_class = UserRegisterForm
[bf6bc0b]117    success_url = reverse_lazy('login')
[be8d917]118    success_message = "Se registró con éxito"
[cdd72e5]119    model = User
120
121    def form_valid(self, form, **kwargs):
[bf6bc0b]122        """!
123        Metodo que valida si el formulario es valido
124   
125        @author Rodrigo Boet (rboet at cenditel.gob.ve)
126        @copyright GNU/GPLv2
127        @date 20-04-2017
128        @param self <b>{object}</b> Objeto que instancia la clase
129        @param form <b>{object}</b> Objeto que contiene el formulario de registro
130        @return Retorna el formulario validado
[cdd72e5]131        """
[bf6bc0b]132        self.object = form.save()
133        self.object.username = form.cleaned_data['username']
134        self.object.first_name = form.cleaned_data['nombre']
135        self.object.last_name = form.cleaned_data['apellido']
136        self.object.set_password(form.cleaned_data['password'])
137        self.object.email = form.cleaned_data['email']
138        self.object.save()
139       
140        ## Se asigna el grupo de Participantes por defecto
141        self.object.groups.add(2)
142       
143        parroquia = Parroquia.objects.get(id=form.cleaned_data['parroquia'])
144       
145        perfil = Perfil()
146        perfil.cedula = form.cleaned_data['cedula']
[0b2127c]147        perfil.sector = form.cleaned_data['sector']
148        if(perfil.sector=='TR'):
149            perfil.sector_trabajador = form.cleaned_data['sector_trabajador']
150        elif(perfil.sector=='ES'):
151            perfil.sector_estudiante = form.cleaned_data['sector_estudiante']
[7095598]152            universidad = Universidades.objects.get(pk=form.cleaned_data['universidad'])
153            perfil.universidad = universidad
[0b2127c]154        perfil.participacion = form.cleaned_data['participacion']
155        if(perfil.participacion=='CO'):
156            perfil.colectivo = form.cleaned_data['colectivo']
[bf6bc0b]157        perfil.parroquia = parroquia
158        perfil.user = self.object
159        perfil.save() 
160       
[be8d917]161        return super(RegisterView, self).form_valid(form)
162   
163class PerfilUpdate(SuccessMessageMixin,LoginRequiredMixin,UpdateView):
164    """!
165    Clase que gestiona la actualización del perfil
166
167    @author Rodrigo Boet (rboet at cenditel.gob.ve)
168    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
169    @date 24-04-2017
170    @version 1.0.0
171    """
172    model = Perfil
173    template_name = "perfil.update.html"
174    form_class = PerfilForm
175    success_message = "Se actualizó el perfil con éxito"
176   
177    def dispatch(self, request, *args, **kwargs):
178        """
179        Metodo que redirecciona al usuario si no cuenta con los permisos
180   
181        @author Rodrigo Boet (rboet at cenditel.gob.ve)
182        @copyright GNU/GPLv2
183        @date 24-04-2017
184        @param self <b>{object}</b> Objeto que instancia la clase
185        @param request <b>{object}</b> Objeto que contiene la petición
186        @param args <b>{object}</b> Objeto que contiene los argumentos
187        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
[e26ee47]188        @return Direcciona al 403 si no es su perfil
[be8d917]189        """
[e26ee47]190        if int(self.request.user.id) != int(self.kwargs['pk']):
191           return redirect('base_403')
[be8d917]192        return super(PerfilUpdate, self).dispatch(request, *args, **kwargs)
193   
[e26ee47]194    def get_object(self, queryset=None):
195        """
196        Metodo para obtener el objeto de la consulta
[0b2127c]197   
198        @author Rodrigo Boet (rboet at cenditel.gob.ve)
199        @copyright GNU/GPLv2
[e26ee47]200        @date 24-05-2017
[0b2127c]201        @param self <b>{object}</b> Objeto que instancia la clase
[e26ee47]202        @param queryset <b>{object}</b> Objeto que contiene una consulta
203        @return El objeto del perfil
[0b2127c]204        """
[e26ee47]205        obj = Perfil.objects.get(user_id=self.kwargs['pk'])
206        return obj
[0b2127c]207   
[be8d917]208    def get_success_url(self):
209        """!
210        Metodo que permite definir la url de dirección al ser válido el formulario
211   
212        @author Rodrigo Boet (rboet at cenditel.gob.ve)
213        @copyright GNU/GPLv2
214        @date 24-04-2017
215        @param self <b>{object}</b> Objeto que instancia la clase
216        @return Retorna la url
217        """
218        return reverse_lazy('update',
219                            kwargs={'pk': self.kwargs['pk']})
220   
221    def get_initial(self):
222        """!
223        Metodo para agregar valores de inicio al formulario
224   
225        @author Rodrigo Boet (rboet at cenditel.gob.ve)
226        @copyright GNU/GPLv2
227        @date 24-04-2017
228        @param self <b>{object}</b> Objeto que instancia la clase
229        @return Retorna los valores iniciales
230        """
231        initial = super(PerfilUpdate, self).get_initial()
[e26ee47]232        perfil = Perfil.objects.get(user_id=self.kwargs['pk'])
[be8d917]233        initial['parroquia'] = perfil.parroquia_id
234        initial['municipio'] = perfil.parroquia.municipio_id
235        initial['estado'] = perfil.parroquia.municipio.entidad_id
[0b2127c]236        initial['sector'] = perfil.sector
237        initial['participacion'] = perfil.participacion
238        initial['colectivo'] = perfil.colectivo
[be8d917]239   
240        return initial
241   
242    def form_valid(self,form):
243        """!
244        Metodo que valida si el formulario es valido
245   
246        @author Rodrigo Boet (rboet at cenditel.gob.ve)
247        @copyright GNU/GPLv2
248        @date 24-04-2017
249        @param self <b>{object}</b> Objeto que instancia la clase
250        @param form <b>{object}</b> Objeto que contiene el formulario de registro
251        @return Retorna el formulario validado
252        """
253        parroquia = Parroquia.objects.get(id=form.cleaned_data['parroquia'])
254       
255        self.object = form.save()
256        self.object.cedula = form.cleaned_data['cedula']
[0b2127c]257        self.sector = form.cleaned_data['sector']
258        if(self.sector=='TR'):
259            self.sector_trabajador = form.cleaned_data['sector_trabajador']
260        elif(self.sector=='ES'):
261            self.sector_estudiante = form.cleaned_data['sector_estudiante']
[7095598]262            universidad = Universidades.objects.get(pk=form.cleaned_data['universidad'])
263            self.universidad = universidad
[0b2127c]264        self.participacion = form.cleaned_data['participacion']
265        if(self.participacion=='CO'):
266            self.colectivo = form.cleaned_data['colectivo']
[be8d917]267        self.object.parroquia = parroquia
268        self.object.save()
269       
[66ac3fc]270        return super(PerfilUpdate, self).form_valid(form)
271   
272class MiParticipacion(LoginRequiredMixin,ListView):
273    """!
274    Clase que gestiona la el listado de las participaciones en los aportes
275    de la consulta
276
277    @author Rodrigo Boet (rboet at cenditel.gob.ve)
278    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
279    @date 07-09-2017
280    @version 1.0.0
281    """
282    model = RespuestaAbierta
283    template_name = "mi_participacion.html"
284    paginate_by = 5
285   
286    def get_context_data(self, **kwargs):
287        """!
288        Metodo para cargar/obtener valores en el contexto de la vista
289   
290        @author Rodrigo Boet (rboet at cenditel.gob.ve)
291        @copyright GNU/GPLv2
292        @date 28-03-2017
293        @param self <b>{object}</b> Objeto que instancia la clase
294        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
295        @return Retorna los datos de contexto
296        """
297        context = super(MiParticipacion, self).get_context_data(**kwargs)
298        context['object_list'] = RespuestaAbierta.objects.filter(user_id=self.request.user.id).all()
299        context['objetivos'] = OBJETIVOS_DICT
300        ## Implementación del paginador
301        paginator = Paginator(context['object_list'], self.paginate_by)
302        page = self.request.GET.get('page')
303        try:
304            kwargs['page_obj'] = paginator.page(page)
305        except PageNotAnInteger:
306            kwargs['page_obj'] = paginator.page(1)
307        except EmptyPage:
308            kwargs['page_obj'] = paginator.page(paginator.num_pages)
309        return context
310   
311class Certificado(PDFTemplateView):
312    """!
313    Clase que gestiona la generación en pdf de los certificados de participacion
314
315    @author Rodrigo Boet (rboet at cenditel.gob.ve)
316    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
317    @date 07-09-2017
318    @version 1.0.0
319    """
320    template_name = "certificado.template.html"
321   
322    def get_context_data(self, **kwargs):
323        """!
324        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
325   
326        @author Rodrigo Boet (rboet at cenditel.gob.ve)
327        @copyright GNU/GPLv2
328        @date 07-09-2017
329        @param self <b>{object}</b> Objeto que instancia la clase
330        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
331        @return Retorna los datos de contexto
332        """
333        participacionid = int(self.kwargs['pk'])
334        participacion = RespuestaAbierta.objects.filter(pk=participacionid)
335        if(participacion):
336            participacion = participacion.get()
337            kwargs['user'] = participacion.user.first_name + " " + participacion.user.last_name
338            kwargs['nro_obj'] = participacion.objetivo
339            kwargs['objetivo'] = OBJETIVOS_DICT[participacion.objetivo]
340            perfil = Perfil.objects.get(user_id = participacion.user_id)
341            SECTOR = dict(SECTORES)
342            kwargs['sector'] = SECTOR[perfil.sector]
343            if(perfil.sector_trabajador!=''):
344                ST = dict(SECTOR_TRABAJADOR)
345                kwargs['subsector'] = ST[perfil.sector_trabajador]
346            elif (perfil.sector_estudiante!=''):
347                SE = dict(SECTOR_ESTUDIANTE)
348                kwargs['subsector'] = SE[perfil.sector_estudiante]
349            kwargs['aporte_num'] = str(participacionid).zfill(10)
350        return super(Certificado, self).get_context_data(**kwargs)
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.