1 | # -*- coding: utf-8 -*- |
---|
2 | """ |
---|
3 | Sistema de Consulta Pública |
---|
4 | |
---|
5 | Copyleft (@) 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 |
---|
15 | from django.shortcuts import render, redirect |
---|
16 | from django.views.generic import FormView, RedirectView, CreateView, UpdateView, ListView |
---|
17 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger |
---|
18 | from django.contrib.auth.mixins import LoginRequiredMixin |
---|
19 | from django.contrib.messages.views import SuccessMessageMixin |
---|
20 | from django.contrib.auth import authenticate, logout, login |
---|
21 | from django.core.urlresolvers import reverse_lazy |
---|
22 | from django.contrib.auth.models import User, Group |
---|
23 | from django.contrib import messages |
---|
24 | from .forms import LoginForm, UserRegisterForm, PerfilForm |
---|
25 | from .models import Perfil, Universidades |
---|
26 | from base.models import Parroquia |
---|
27 | from base.constant import OBJETIVOS_DICT, SECTORES, SECTOR_ESTUDIANTE, SECTOR_TRABAJADOR |
---|
28 | from participacion.models import RespuestaAbierta |
---|
29 | from easy_pdf.views import PDFTemplateView |
---|
30 | |
---|
31 | class 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 | |
---|
80 | class 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 | |
---|
106 | class 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 | |
---|
163 | class 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 | |
---|
272 | class 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 | |
---|
311 | class 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) |
---|