source: consulta_publica/users/views.py @ 66ac3fc

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

Agregado paginador, listado de participacion en la consulta, añadida generación del certificado de participación, agregado botón para compartir por twitter

  • Propiedad mode establecida a 100644
File size: 13.6 KB
Línea 
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
15from django.shortcuts import render, redirect
16from django.views.generic import FormView, RedirectView, CreateView, UpdateView, ListView
17from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
18from django.contrib.auth.mixins import LoginRequiredMixin
19from django.contrib.messages.views import SuccessMessageMixin
20from django.contrib.auth import authenticate, logout, login
21from django.core.urlresolvers import reverse_lazy
22from django.contrib.auth.models import User, Group
23from django.contrib import messages
24from .forms import LoginForm, UserRegisterForm, PerfilForm
25from .models import Perfil
26from base.models import Parroquia
27from base.constant import OBJETIVOS_DICT, SECTORES, SECTOR_ESTUDIANTE, SECTOR_TRABAJADOR
28from participacion.models import RespuestaAbierta
29from easy_pdf.views import PDFTemplateView
30
31class LoginView(FormView):
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'
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')
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']
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)
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
106class RegisterView(SuccessMessageMixin,FormView):
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
117    success_url = reverse_lazy('login')
118    success_message = "Se registró con éxito"
119    model = User
120
121    def form_valid(self, form, **kwargs):
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
131        """
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']
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']
152        perfil.participacion = form.cleaned_data['participacion']
153        if(perfil.participacion=='CO'):
154            perfil.colectivo = form.cleaned_data['colectivo']
155        perfil.parroquia = parroquia
156        perfil.user = self.object
157        perfil.save() 
158       
159        return super(RegisterView, self).form_valid(form)
160   
161class PerfilUpdate(SuccessMessageMixin,LoginRequiredMixin,UpdateView):
162    """!
163    Clase que gestiona la actualización del perfil
164
165    @author Rodrigo Boet (rboet at cenditel.gob.ve)
166    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
167    @date 24-04-2017
168    @version 1.0.0
169    """
170    model = Perfil
171    template_name = "perfil.update.html"
172    form_class = PerfilForm
173    success_message = "Se actualizó el perfil con éxito"
174   
175    def dispatch(self, request, *args, **kwargs):
176        """
177        Metodo que redirecciona al usuario si no cuenta con los permisos
178   
179        @author Rodrigo Boet (rboet at cenditel.gob.ve)
180        @copyright GNU/GPLv2
181        @date 24-04-2017
182        @param self <b>{object}</b> Objeto que instancia la clase
183        @param request <b>{object}</b> Objeto que contiene la petición
184        @param args <b>{object}</b> Objeto que contiene los argumentos
185        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
186        @return Direcciona al 403 si no es su perfil
187        """
188        if int(self.request.user.id) != int(self.kwargs['pk']):
189           return redirect('base_403')
190        return super(PerfilUpdate, self).dispatch(request, *args, **kwargs)
191   
192    def get_object(self, queryset=None):
193        """
194        Metodo para obtener el objeto de la consulta
195   
196        @author Rodrigo Boet (rboet at cenditel.gob.ve)
197        @copyright GNU/GPLv2
198        @date 24-05-2017
199        @param self <b>{object}</b> Objeto que instancia la clase
200        @param queryset <b>{object}</b> Objeto que contiene una consulta
201        @return El objeto del perfil
202        """
203        obj = Perfil.objects.get(user_id=self.kwargs['pk'])
204        return obj
205   
206    def get_success_url(self):
207        """!
208        Metodo que permite definir la url de dirección al ser válido el formulario
209   
210        @author Rodrigo Boet (rboet at cenditel.gob.ve)
211        @copyright GNU/GPLv2
212        @date 24-04-2017
213        @param self <b>{object}</b> Objeto que instancia la clase
214        @return Retorna la url
215        """
216        return reverse_lazy('update',
217                            kwargs={'pk': self.kwargs['pk']})
218   
219    def get_initial(self):
220        """!
221        Metodo para agregar valores de inicio al formulario
222   
223        @author Rodrigo Boet (rboet at cenditel.gob.ve)
224        @copyright GNU/GPLv2
225        @date 24-04-2017
226        @param self <b>{object}</b> Objeto que instancia la clase
227        @return Retorna los valores iniciales
228        """
229        initial = super(PerfilUpdate, self).get_initial()
230        perfil = Perfil.objects.get(user_id=self.kwargs['pk'])
231        initial['parroquia'] = perfil.parroquia_id
232        initial['municipio'] = perfil.parroquia.municipio_id
233        initial['estado'] = perfil.parroquia.municipio.entidad_id
234        initial['sector'] = perfil.sector
235        initial['participacion'] = perfil.participacion
236        initial['colectivo'] = perfil.colectivo
237   
238        return initial
239   
240    def form_valid(self,form):
241        """!
242        Metodo que valida si el formulario es valido
243   
244        @author Rodrigo Boet (rboet at cenditel.gob.ve)
245        @copyright GNU/GPLv2
246        @date 24-04-2017
247        @param self <b>{object}</b> Objeto que instancia la clase
248        @param form <b>{object}</b> Objeto que contiene el formulario de registro
249        @return Retorna el formulario validado
250        """
251        parroquia = Parroquia.objects.get(id=form.cleaned_data['parroquia'])
252       
253        self.object = form.save()
254        self.object.cedula = form.cleaned_data['cedula']
255        self.sector = form.cleaned_data['sector']
256        if(self.sector=='TR'):
257            self.sector_trabajador = form.cleaned_data['sector_trabajador']
258        elif(self.sector=='ES'):
259            self.sector_estudiante = form.cleaned_data['sector_estudiante']
260        self.participacion = form.cleaned_data['participacion']
261        if(self.participacion=='CO'):
262            self.colectivo = form.cleaned_data['colectivo']
263        self.object.parroquia = parroquia
264        self.object.save()
265       
266        return super(PerfilUpdate, self).form_valid(form)
267   
268class MiParticipacion(LoginRequiredMixin,ListView):
269    """!
270    Clase que gestiona la el listado de las participaciones en los aportes
271    de la consulta
272
273    @author Rodrigo Boet (rboet at cenditel.gob.ve)
274    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
275    @date 07-09-2017
276    @version 1.0.0
277    """
278    model = RespuestaAbierta
279    template_name = "mi_participacion.html"
280    paginate_by = 5
281   
282    def get_context_data(self, **kwargs):
283        """!
284        Metodo para cargar/obtener valores en el contexto de la vista
285   
286        @author Rodrigo Boet (rboet at cenditel.gob.ve)
287        @copyright GNU/GPLv2
288        @date 28-03-2017
289        @param self <b>{object}</b> Objeto que instancia la clase
290        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
291        @return Retorna los datos de contexto
292        """
293        context = super(MiParticipacion, self).get_context_data(**kwargs)
294        context['object_list'] = RespuestaAbierta.objects.filter(user_id=self.request.user.id).all()
295        context['objetivos'] = OBJETIVOS_DICT
296        ## Implementación del paginador
297        paginator = Paginator(context['object_list'], self.paginate_by)
298        page = self.request.GET.get('page')
299        try:
300            kwargs['page_obj'] = paginator.page(page)
301        except PageNotAnInteger:
302            kwargs['page_obj'] = paginator.page(1)
303        except EmptyPage:
304            kwargs['page_obj'] = paginator.page(paginator.num_pages)
305        return context
306   
307class Certificado(PDFTemplateView):
308    """!
309    Clase que gestiona la generación en pdf de los certificados de participacion
310
311    @author Rodrigo Boet (rboet at cenditel.gob.ve)
312    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
313    @date 07-09-2017
314    @version 1.0.0
315    """
316    template_name = "certificado.template.html"
317   
318    def get_context_data(self, **kwargs):
319        """!
320        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
321   
322        @author Rodrigo Boet (rboet at cenditel.gob.ve)
323        @copyright GNU/GPLv2
324        @date 07-09-2017
325        @param self <b>{object}</b> Objeto que instancia la clase
326        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
327        @return Retorna los datos de contexto
328        """
329        participacionid = int(self.kwargs['pk'])
330        participacion = RespuestaAbierta.objects.filter(pk=participacionid)
331        if(participacion):
332            participacion = participacion.get()
333            kwargs['user'] = participacion.user.first_name + " " + participacion.user.last_name
334            kwargs['nro_obj'] = participacion.objetivo
335            kwargs['objetivo'] = OBJETIVOS_DICT[participacion.objetivo]
336            perfil = Perfil.objects.get(user_id = participacion.user_id)
337            SECTOR = dict(SECTORES)
338            kwargs['sector'] = SECTOR[perfil.sector]
339            if(perfil.sector_trabajador!=''):
340                ST = dict(SECTOR_TRABAJADOR)
341                kwargs['subsector'] = ST[perfil.sector_trabajador]
342            elif (perfil.sector_estudiante!=''):
343                SE = dict(SECTOR_ESTUDIANTE)
344                kwargs['subsector'] = SE[perfil.sector_estudiante]
345            kwargs['aporte_num'] = str(participacionid).zfill(10)
346        return super(Certificado, self).get_context_data(**kwargs)
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.