source: gestor_consulta/consulta/views.py

Last change on this file was 113e101, checked in by rudmanmrrod <rudman22@…>, 7 años ago

Agregada GPL V3 en todos los métodos y clases, añadida funcionalidad para retornar los datos del usuario autenticado

  • Propiedad mode establecida a 100644
File size: 21.5 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 consulta.views
8#
9# Vistas correspondientes a la aplicación consulta
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='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
14# @version 1.0
15import json
16from django.shortcuts import render
17from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
18from django.core.urlresolvers import reverse_lazy
19from django.http import JsonResponse
20from django.contrib.auth.models import User
21from django.views.generic import CreateView, ListView, TemplateView, DeleteView, DetailView, UpdateView
22from django.contrib.messages.views import SuccessMessageMixin
23from django.contrib.auth.mixins import LoginRequiredMixin
24
25from base.functions import generar_token
26from .models import Consulta, Pregunta, TipoPregunta, Opcion
27from .forms import ConsultaForm, ConsultaPreguntaForm
28 
29class ConsultaIndex(LoginRequiredMixin, TemplateView):
30    """!
31    Clase que gestiona la vista principal de la consulta
32
33    @author Rodrigo Boet (rboet at cenditel.gob.ve)
34    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
35    @date 15-02-2017
36    @version 1.0.0
37    """
38    template_name = "consulta.index.html"
39
40
41class ConsultaCreate(LoginRequiredMixin,SuccessMessageMixin,CreateView):
42    """!
43    Clase que gestiona la creación de consultas
44
45    @author Rodrigo Boet (rboet at cenditel.gob.ve)
46    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
47    @date 15-02-2017
48    @version 1.0.0
49    """
50    model = Consulta
51    form_class = ConsultaPreguntaForm
52    template_name = "consulta.create.html"
53    success_message = "Se creó la consulta con éxito"
54    success_url = reverse_lazy('consulta_index')
55   
56    def get_context_data(self, **kwargs):
57        """!
58        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
59   
60        @author Rodrigo Boet (rboet at cenditel.gob.ve)
61        @copyright GNU/GPLv2
62        @date 16-02-2017
63        @param self <b>{object}</b> Objeto que instancia la clase
64        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
65        @return Retorna los datos de contexto
66        """
67        if 'tipo_pregunta_modal' in self.request.POST and 'texto_pregunta_modal' in self.request.POST:
68            post_data = dict(self.request.POST.lists())
69            if ((len(post_data['tipo_pregunta_modal'])>0 and len(post_data['texto_pregunta_modal'])>0) and (len(post_data['texto_pregunta_modal']) == len(post_data['tipo_pregunta_modal']))):
70                valores = {}
71                for i in range(len(post_data['tipo_pregunta_modal'])):
72                    valores[i] = {'texto_pregunta':post_data['texto_pregunta_modal'][i],'tipo_pregunta':post_data['tipo_pregunta_modal'][i]}
73                kwargs['opciones'] = json.dumps(valores)
74        return super(ConsultaCreate, self).get_context_data(**kwargs)
75       
76   
77    def form_valid(self,form):
78        """!
79        Metodo que valida si el formulario es valido
80   
81        @author Rodrigo Boet (rboet at cenditel.gob.ve)
82        @copyright GNU/GPLv2
83        @date 15-02-2017
84        @param self <b>{object}</b> Objeto que instancia la clase
85        @param form <b>{object}</b> Objeto que contiene el formulario de registro
86        @return Retorna el formulario validado
87        """
88       
89        post_data = dict(self.request.POST.lists())
90        user = User.objects.get(pk=self.request.user.id)
91       
92        ## Se crea el objeto de la consulta
93        self.object = form.save(commit=False)
94        self.object.nombre_consulta = form.cleaned_data['nombre_consulta']
95        self.object.activa = form.cleaned_data['activa']
96        self.object.token = generar_token(self.request.user.id)
97        self.object.user = user
98        self.object.save()
99       
100        ## Se crea la pregunta que se pide por defecto
101        tipo = TipoPregunta.objects.get(pk=form.cleaned_data['tipo_pregunta'])
102        pregunta = Pregunta()
103        pregunta.texto_pregunta = form.cleaned_data['texto_pregunta']
104        pregunta.tipo_pregunta = tipo
105        pregunta.consulta = self.object
106        pregunta.save()
107         
108        ## Si se agregaron más preguntas se crean
109        if 'tipo_pregunta_modal' in self.request.POST and 'texto_pregunta_modal' in self.request.POST:
110            self.create_questions(self.object,post_data)
111       
112        return super(ConsultaCreate, self).form_valid(form)
113   
114   
115    def create_questions(self,objeto,data):
116        """!
117        Metodo para crear preguntas adicionales
118   
119        @author Rodrigo Boet (rboet at cenditel.gob.ve)
120        @copyright GNU/GPLv2
121        @date 16-02-2017
122        @param self <b>{object}</b> Objeto que instancia la clase
123        @param objeto <b>{object}</b> Objeto de la consulta
124        @param data <b>{dict}</b> Diccionario con los valores a guardar
125        """
126        if len(data['texto_pregunta_modal']) == len(data['tipo_pregunta_modal']):
127            for i in range(len(data['texto_pregunta_modal'])):
128                tipo = TipoPregunta.objects.get(pk=data['tipo_pregunta_modal'][i])
129                pregunta = Pregunta()
130                pregunta.texto_pregunta = data['texto_pregunta_modal'][i]
131                pregunta.tipo_pregunta = tipo
132                pregunta.consulta = objeto
133                pregunta.save()
134   
135class ConsultaList(LoginRequiredMixin,ListView):
136    """!
137    Clase que gestiona la lista de consultas
138
139    @author Rodrigo Boet (rboet at cenditel.gob.ve)
140    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
141    @date 15-02-2017
142    @version 1.0.0
143    """
144    model = Consulta
145    template_name = "consulta.list.html"
146    paginate_by = 5
147   
148    def get_context_data(self, **kwargs):
149        """!
150        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
151   
152        @author Rodrigo Boet (rboet at cenditel.gob.ve)
153        @copyright GNU/GPLv2
154        @date 20-06-2017
155        @param self <b>{object}</b> Objeto que instancia la clase
156        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
157        @return Retorna los datos de contexto
158        """
159        kwargs['object_list'] = Consulta.objects.filter(user_id=self.request.user.id).order_by('nombre_consulta').all()
160        ## Implementación del paginador
161        paginator = Paginator(kwargs['object_list'], self.paginate_by)
162        page = self.request.GET.get('page')
163        try:
164            kwargs['page_obj'] = paginator.page(page)
165        except PageNotAnInteger:
166            kwargs['page_obj'] = paginator.page(1)
167        except EmptyPage:
168            kwargs['page_obj'] = paginator.page(paginator.num_pages)
169        return super(ConsultaList, self).get_context_data(**kwargs)
170   
171   
172class ConsultaDetail(LoginRequiredMixin,DetailView):
173    """!
174    Clase que gestiona el detalle de una consulta
175
176    @author Rodrigo Boet (rboet at cenditel.gob.ve)
177    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
178    @date 17-02-2017
179    @version 1.0.0
180    """
181    model = Consulta
182    template_name = "consulta.detail.html"
183   
184    def get_context_data(self, **kwargs):
185        """!
186        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
187   
188        @author Rodrigo Boet (rboet at cenditel.gob.ve)
189        @copyright GNU/GPLv2
190        @date 17-02-2017
191        @param self <b>{object}</b> Objeto que instancia la clase
192        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
193        @return Retorna los datos de contexto
194        """
195        kwargs['preguntas'] = Pregunta.objects.filter(consulta_id=kwargs['object'].id).all()
196        return super(ConsultaDetail, self).get_context_data(**kwargs)
197   
198class ConsultaDelete(LoginRequiredMixin,SuccessMessageMixin,DeleteView):
199    """!
200    Clase que gestiona el borrado de consultas
201
202    @author Rodrigo Boet (rboet at cenditel.gob.ve)
203    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
204    @date 15-02-2017
205    @version 1.0.0
206    """
207    model = Consulta
208    template_name = "consulta.delete.html"
209    success_message = "Se eliminó la consulta con éxito"
210    success_url = reverse_lazy('consulta_index')
211   
212   
213class ConsultaUpdate(LoginRequiredMixin,SuccessMessageMixin,UpdateView):
214    """!
215    Clase que gestiona la actualización de consultas
216
217    @author Rodrigo Boet (rboet at cenditel.gob.ve)
218    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
219    @date 17-02-2017
220    @version 1.0.0
221    """
222    model = Consulta
223    form_class = ConsultaForm
224    template_name = "consulta.update.html"
225    success_message = "Se actualizó la consulta con éxito"
226    success_url = reverse_lazy('consulta_list')
227   
228   
229    def get_context_data(self, **kwargs):
230        """!
231        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
232   
233        @author Rodrigo Boet (rboet at cenditel.gob.ve)
234        @copyright GNU/GPLv2
235        @date 17-02-2017
236        @param self <b>{object}</b> Objeto que instancia la clase
237        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
238        @return Retorna los datos de contexto
239        """
240        preguntas = Pregunta.objects.filter(consulta_id=self.object.id).all()
241        kwargs['preguntas'] = preguntas
242        return super(ConsultaUpdate, self).get_context_data(**kwargs)
243   
244class ConsultaGenerateToken(LoginRequiredMixin,UpdateView):
245    """!
246    Clase que gestiona la actualización de consultas
247
248    @author Rodrigo Boet (rboet at cenditel.gob.ve)
249    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
250    @date 22-06-2017
251    @version 1.0.0
252    """
253    template_name = "consulta.update.html"
254    success_url = reverse_lazy('consulta_list')
255   
256    def post(self, request, pk):
257        """!
258        Metodo que sobreescribe la acción por POST
259   
260        @author Rodrigo Boet (rboet at cenditel.gob.ve)
261        @copyright GNU/GPLv2
262        @date 22-06-2017
263        @param self <b>{object}</b> Objeto que instancia la clase
264        @param request <b>{object}</b> Objeto que contiene la petición
265        @param pk <b>{int}</b> Id de la consulta
266        @return Retorna los datos de la petición post
267        """
268        if self.request.is_ajax():
269            model = Consulta.objects.filter(pk=pk)
270            if(model):
271                model = model.get()
272                model.token = generar_token(self.request.user.id)
273                model.save()
274                return JsonResponse({"code":True})
275            return JsonResponse({"code":False,"errors":"La Consulta solicitada no existe"})
276
277
278class OpcionesCreate(LoginRequiredMixin,CreateView):
279    """!
280    Clase que gestiona la creación de opciones
281
282    @author Rodrigo Boet (rboet at cenditel.gob.ve)
283    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
284    @date 20-02-2017
285    @version 1.0.0
286    """
287    model = Opcion
288    fields = ['texto_opcion']
289    template_name = "consulta.create.html"
290    success_url = reverse_lazy('consulta_index')
291           
292   
293    def form_valid(self,form):
294        """!
295        Metodo que valida si el formulario es valido
296   
297        @author Rodrigo Boet (rboet at cenditel.gob.ve)
298        @copyright GNU/GPLv2
299        @date 20-02-2017
300        @param self <b>{object}</b> Objeto que instancia la clase
301        @param form <b>{object}</b> Objeto que contiene el formulario de registro
302        @return Retorna el formulario validado
303        """
304        post_data = dict(self.request.POST.lists())
305        pregunta = Pregunta.objects.get(id=int(self.kwargs['pk']))
306       
307        ## Se guarda la primera opcion
308        self.object = form.save(commit=False)
309        self.object.texto_opcion = post_data['texto_opcion'][0]
310        self.object.pregunta = pregunta
311        self.object.save()
312       
313        ## Se guardan las demás opciones si existen
314        for i in range(1,len(post_data['texto_opcion'])):
315            opcion = Opcion()
316            opcion.texto_opcion = post_data['texto_opcion'][i]
317            opcion.pregunta = pregunta
318            opcion.save()
319           
320        if self.request.is_ajax():
321            return JsonResponse({"code":True})
322           
323        return super(OpcionesCreate, self).form_valid(form)
324   
325    def form_invalid(self,form):
326        """!
327        Metodo que valida si el formulario es invalido
328   
329        @author Rodrigo Boet (rboet at cenditel.gob.ve)
330        @copyright GNU/GPLv2
331        @date 20-02-2017
332        @param self <b>{object}</b> Objeto que instancia la clase
333        @param form <b>{object}</b> Objeto que contiene el formulario de registro
334        @return Retorna el formulario inválido
335        """
336        if self.request.is_ajax():
337            return JsonResponse({"code":False,'errors':form.errors})
338        return super(OpcionesCreate, self).form_invalid(form)
339   
340   
341class OpcionesUpdate(LoginRequiredMixin,UpdateView):
342    """!
343    Clase que gestiona la actualización de las opciones
344
345    @author Rodrigo Boet (rboet at cenditel.gob.ve)
346    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
347    @date 20-02-2017
348    @version 1.0.0
349    """
350    model = Opcion
351    fields = ['texto_opcion']
352    template_name = "consulta.update.html"
353    success_url = reverse_lazy('consulta_list')
354   
355   
356    def post(self, request):
357        """!
358        Metodo que sobreescribe la acción por POST
359   
360        @author Rodrigo Boet (rboet at cenditel.gob.ve)
361        @copyright GNU/GPLv2
362        @date 20-02-2017
363        @param self <b>{object}</b> Objeto que instancia la clase
364        @param request <b>{object}</b> Objeto que contiene la petición
365        @return Retorna los datos de contexto
366        """
367        post_data = dict(self.request.POST.lists())
368        for i in range(len(post_data['texto_opcion'])):
369            opcion = Opcion.objects.filter(id=int(post_data['texto_opcion_id'][i]))
370            if(opcion):
371                opcion = opcion.get()
372                opcion.texto_opcion = post_data['texto_opcion'][i]
373                opcion.save()
374
375        if self.request.is_ajax():
376            return JsonResponse({"code":True})
377       
378class OpcionesDelete(LoginRequiredMixin,DeleteView):
379    """!
380    Clase que gestiona el borrado de una opción
381
382    @author Rodrigo Boet (rboet at cenditel.gob.ve)
383    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
384    @date 20-02-2017
385    @version 1.0.0
386    """
387    model = Opcion
388    template_name = "consulta.update.html"
389    success_url = reverse_lazy('consulta_list')
390   
391    def post(self, request, pk):
392        """!
393        Metodo que sobreescribe la acción por POST
394   
395        @author Rodrigo Boet (rboet at cenditel.gob.ve)
396        @copyright GNU/GPLv2
397        @date 20-02-2017
398        @param self <b>{object}</b> Objeto que instancia la clase
399        @param request <b>{object}</b> Objeto que contiene la petición
400        @param pk <b>{int}</b> Recibe el id para filtrar
401        @return Retorna los datos de contexto
402        """
403        opcion = Opcion.objects.filter(id=int(pk))
404        if(opcion):
405            opcion = opcion.get()
406            opcion.delete()
407            return JsonResponse({'success':True})
408        return JsonResponse({'success':False,'mensaje':'Opción inválida'})
409           
410           
411class PreguntaDelete(LoginRequiredMixin,DeleteView):
412    """!
413    Clase que gestiona el borrado de una pregunta
414
415    @author Rodrigo Boet (rboet at cenditel.gob.ve)
416    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
417    @date 20-02-2017
418    @version 1.0.0
419    """
420    model = Pregunta
421    template_name = "consulta.update.html"
422    success_url = reverse_lazy('consulta_list')
423   
424    def post(self, request, pk):
425        """!
426        Metodo que sobreescribe la acción por POST
427   
428        @author Rodrigo Boet (rboet at cenditel.gob.ve)
429        @copyright GNU/GPLv2
430        @date 20-02-2017
431        @param self <b>{object}</b> Objeto que instancia la clase
432        @param request <b>{object}</b> Objeto que contiene la petición
433        @param pk <b>{int}</b> Recibe el id para filtrar
434        @return Retorna los datos de contexto
435        """
436        pregunta = Pregunta.objects.filter(id=int(pk))
437        if(pregunta):
438            pregunta = pregunta.get()
439            ## Si tiene opciones, se buscan y se borran
440            if(pregunta.tipo_pregunta_id==1):
441                opciones = Opcion.objects.filter(pregunta_id=pregunta.id)
442                if (opciones):
443                    for item in opciones.all():
444                        item.delete()               
445            pregunta.delete()
446            return JsonResponse({'success':True})
447        return JsonResponse({'success':False,'mensaje':'Pregunta inválida'})
448   
449   
450class PreguntaCreate(LoginRequiredMixin,CreateView):
451    """!
452    Clase que gestiona la creación de preguntas
453
454    @author Rodrigo Boet (rboet at cenditel.gob.ve)
455    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
456    @date 21-02-2017
457    @version 1.0.0
458    """
459    model = Pregunta
460    fields = ['texto_pregunta','tipo_pregunta']
461    template_name = "consulta.create.html"
462    success_url = reverse_lazy('consulta_index')
463   
464    def form_valid(self,form):
465        """!
466        Metodo que valida si el formulario es valido
467   
468        @author Rodrigo Boet (rboet at cenditel.gob.ve)
469        @copyright GNU/GPLv2
470        @date 21-02-2017
471        @param self <b>{object}</b> Objeto que instancia la clase
472        @param form <b>{object}</b> Objeto que contiene el formulario de registro
473        @return Retorna el formulario validado
474        """
475        post_data = dict(self.request.POST.lists())
476        consulta = Consulta.objects.get(id=int(self.kwargs['pk']))
477       
478        ## Se guarda la primera opcion
479        self.object = form.save(commit=False)
480        self.object.texto_opcion = form.cleaned_data['texto_pregunta']
481        self.object.tipo_pregunta = form.cleaned_data['tipo_pregunta']
482        self.object.consulta = consulta
483        self.object.save()
484       
485        ## Se guardan las demás opciones si existen
486        for i in range(len(post_data['texto_pregunta'])-1):
487            tipo_pregunta = TipoPregunta.objects.get(id=int(post_data['tipo_pregunta'][i]))
488            pregunta = Pregunta()
489            pregunta.texto_opcion = post_data['texto_pregunta'][i]
490            pregunta.tipo_pregunta = post_data['tipo_pregunta'][i]
491            pregunta.consulta = consulta
492            pregunta.save()
493           
494        if self.request.is_ajax():
495            return JsonResponse({"code":True})
496           
497        return super(OpcionesCreate, self).form_valid(form)
498   
499    def form_invalid(self,form):
500        """!
501        Metodo que valida si el formulario es invalido
502   
503        @author Rodrigo Boet (rboet at cenditel.gob.ve)
504        @copyright GNU/GPLv2
505        @date 21-02-2017
506        @param self <b>{object}</b> Objeto que instancia la clase
507        @param form <b>{object}</b> Objeto que contiene el formulario de registro
508        @return Retorna el formulario inválido
509        """
510        if self.request.is_ajax():
511            return JsonResponse({"code":False,'errors':form.errors})
512        return super(OpcionesCreate, self).form_invalid(form)
513   
514class PreguntaUpdate(LoginRequiredMixin, UpdateView):
515    """!
516    Clase que gestiona la actualización de las preguntas
517
518    @author Rodrigo Boet (rboet at cenditel.gob.ve)
519    @copyright <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>GNU Public License versión 3 (GPLv3)</a>
520    @date 23-02-2017
521    @version 1.0.0
522    """
523    model = Pregunta
524    fields = ['texto_pregunta','tipo_pregunta']
525    template_name = "consulta.update.html"
526    success_url = reverse_lazy('consulta_list')
527   
528    def post(self, request):
529        """!
530        Metodo que sobreescribe la acción por POST
531   
532        @author Rodrigo Boet (rboet at cenditel.gob.ve)
533        @copyright GNU/GPLv2
534        @date 23-02-2017
535        @param self <b>{object}</b> Objeto que instancia la clase
536        @param request <b>{object}</b> Objeto que contiene la petición
537        @return Retorna los datos de contexto
538        """
539        post_data = dict(self.request.POST.lists())
540        for i in range(len(post_data['texto_pregunta_modal'])):
541            pregunta = Pregunta.objects.filter(id=int(post_data['texto_pregunta_id'][i]))
542            if(pregunta):
543                pregunta = pregunta.get()
544                salvar = False
545                if(pregunta.texto_pregunta != post_data['texto_pregunta_modal'][i]):
546                    pregunta.texto_pregunta = post_data['texto_pregunta_modal'][i]
547                    salvar = True
548                if(pregunta.tipo_pregunta != post_data['tipo_pregunta_modal'][i]):
549                    tipo_pregunta = TipoPregunta.objects.filter(id=int(post_data['tipo_pregunta_modal'][i])).get()
550                    pregunta.tipo_pregunta = tipo_pregunta
551                    salvar = True
552                if(salvar):   
553                    pregunta.save()
554
555        if self.request.is_ajax():
556            return JsonResponse({"code":True})
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.