source: consulta_publica/users/views.py @ 7095598

estudiantesgeneralplan_patria
Last change on this file since 7095598 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
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, Universidades
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            universidad = Universidades.objects.get(pk=form.cleaned_data['universidad'])
153            perfil.universidad = universidad
154        perfil.participacion = form.cleaned_data['participacion']
155        if(perfil.participacion=='CO'):
156            perfil.colectivo = form.cleaned_data['colectivo']
157        perfil.parroquia = parroquia
158        perfil.user = self.object
159        perfil.save() 
160       
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
188        @return Direcciona al 403 si no es su perfil
189        """
190        if int(self.request.user.id) != int(self.kwargs['pk']):
191           return redirect('base_403')
192        return super(PerfilUpdate, self).dispatch(request, *args, **kwargs)
193   
194    def get_object(self, queryset=None):
195        """
196        Metodo para obtener el objeto de la consulta
197   
198        @author Rodrigo Boet (rboet at cenditel.gob.ve)
199        @copyright GNU/GPLv2
200        @date 24-05-2017
201        @param self <b>{object}</b> Objeto que instancia la clase
202        @param queryset <b>{object}</b> Objeto que contiene una consulta
203        @return El objeto del perfil
204        """
205        obj = Perfil.objects.get(user_id=self.kwargs['pk'])
206        return obj
207   
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()
232        perfil = Perfil.objects.get(user_id=self.kwargs['pk'])
233        initial['parroquia'] = perfil.parroquia_id
234        initial['municipio'] = perfil.parroquia.municipio_id
235        initial['estado'] = perfil.parroquia.municipio.entidad_id
236        initial['sector'] = perfil.sector
237        initial['participacion'] = perfil.participacion
238        initial['colectivo'] = perfil.colectivo
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']
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']
262            universidad = Universidades.objects.get(pk=form.cleaned_data['universidad'])
263            self.universidad = universidad
264        self.participacion = form.cleaned_data['participacion']
265        if(self.participacion=='CO'):
266            self.colectivo = form.cleaned_data['colectivo']
267        self.object.parroquia = parroquia
268        self.object.save()
269       
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.