source: consulta_publica/consulta/views.py @ b7d24ad

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

Solucionado bug en las estadísticas de las preguntas abiertas

  • Propiedad mode establecida a 100644
File size: 32.8 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='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
14# @version 1.0
15import json
16from django.shortcuts import render
17from django.conf import settings
18from django.core.urlresolvers import reverse_lazy
19from django.http import JsonResponse
20from django.contrib.auth.models import User
21from django.views.generic import (
22    CreateView, ListView, TemplateView, DeleteView,
23    DetailView, UpdateView, FormView
24    )
25from django.contrib.messages.views import SuccessMessageMixin
26from django.contrib.auth.mixins import LoginRequiredMixin
27from braces.views import GroupRequiredMixin
28from easy_pdf.views import PDFTemplateView
29from .models import Consulta, Pregunta, TipoPregunta, Opcion
30from .forms import ConsultaForm, ConsultaPreguntaForm, ConsultaSearchForm
31from participacion.models import RespuestaSino, RespuestaOpciones, RespuestaAbierta
32from users.models import Perfil
33from base.constant import OBJETIVOS, SECTORES, SECTOR_ESTUDIANTE, SECTOR_TRABAJADOR
34from base.models import Entidad, Municipio, Parroquia
35 
36class ConsultaIndex(GroupRequiredMixin, LoginRequiredMixin, TemplateView):
37    """!
38    Clase que gestiona la vista principal de la consulta
39
40    @author Rodrigo Boet (rboet at cenditel.gob.ve)
41    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
42    @date 15-02-2017
43    @version 1.0.0
44    """
45    template_name = "consulta.index.html"
46    group_required = u"Administrador"
47
48
49class ConsultaCreate(GroupRequiredMixin, LoginRequiredMixin,SuccessMessageMixin,CreateView):
50    """!
51    Clase que gestiona la creación de consultas
52
53    @author Rodrigo Boet (rboet at cenditel.gob.ve)
54    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
55    @date 15-02-2017
56    @version 1.0.0
57    """
58    model = Consulta
59    form_class = ConsultaPreguntaForm
60    template_name = "consulta.create.html"
61    success_message = "Se creó la consulta con éxito"
62    success_url = reverse_lazy('consulta_index')
63    group_required = u"Administrador"
64   
65    def get_context_data(self, **kwargs):
66        """!
67        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
68   
69        @author Rodrigo Boet (rboet at cenditel.gob.ve)
70        @copyright GNU/GPLv2
71        @date 16-02-2017
72        @param self <b>{object}</b> Objeto que instancia la clase
73        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
74        @return Retorna los datos de contexto
75        """
76        if 'tipo_pregunta_modal' in self.request.POST and 'texto_pregunta_modal' in self.request.POST:
77            post_data = dict(self.request.POST.lists())
78            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']))):
79                valores = {}
80                for i in range(len(post_data['tipo_pregunta_modal'])):
81                    valores[i] = {'texto_pregunta':post_data['texto_pregunta_modal'][i],'tipo_pregunta':post_data['tipo_pregunta_modal'][i]}
82                kwargs['opciones'] = json.dumps(valores)
83        return super(ConsultaCreate, self).get_context_data(**kwargs)
84       
85   
86    def form_valid(self,form):
87        """!
88        Metodo que valida si el formulario es valido
89   
90        @author Rodrigo Boet (rboet at cenditel.gob.ve)
91        @copyright GNU/GPLv2
92        @date 15-02-2017
93        @param self <b>{object}</b> Objeto que instancia la clase
94        @param form <b>{object}</b> Objeto que contiene el formulario de registro
95        @return Retorna el formulario validado
96        """
97       
98        post_data = dict(self.request.POST.lists())
99        user = User.objects.get(pk=self.request.user.id)
100       
101        ## Se crea el objeto de la consulta
102        self.object = form.save(commit=False)
103        self.object.nombre_consulta = form.cleaned_data['nombre_consulta']
104        self.object.activa = form.cleaned_data['activa']
105        self.object.user = user
106        self.object.save()
107       
108        ## Se crea la pregunta que se pide por defecto
109        tipo = TipoPregunta.objects.get(pk=form.cleaned_data['tipo_pregunta'])
110        pregunta = Pregunta()
111        pregunta.texto_pregunta = form.cleaned_data['texto_pregunta']
112        pregunta.tipo_pregunta = tipo
113        pregunta.consulta = self.object
114        pregunta.save()
115         
116        ## Si se agregaron más preguntas se crean
117        if 'tipo_pregunta_modal' in self.request.POST and 'texto_pregunta_modal' in self.request.POST:
118            self.create_questions(self.object,post_data)
119       
120        return super(ConsultaCreate, self).form_valid(form)
121   
122   
123    def create_questions(self,objeto,data):
124        """!
125        Metodo para crear preguntas adicionales
126   
127        @author Rodrigo Boet (rboet at cenditel.gob.ve)
128        @copyright GNU/GPLv2
129        @date 16-02-2017
130        @param self <b>{object}</b> Objeto que instancia la clase
131        @param objeto <b>{object}</b> Objeto de la consulta
132        @param data <b>{dict}</b> Diccionario con los valores a guardar
133        """
134        if len(data['texto_pregunta_modal']) == len(data['tipo_pregunta_modal']):
135            print data['texto_pregunta_modal']
136            for i in range(len(data['texto_pregunta_modal'])):
137                tipo = TipoPregunta.objects.get(pk=data['tipo_pregunta_modal'][i])
138                pregunta = Pregunta()
139                pregunta.texto_pregunta = data['texto_pregunta_modal'][i]
140                pregunta.tipo_pregunta = tipo
141                pregunta.consulta = objeto
142                pregunta.save()
143   
144class ConsultaList(GroupRequiredMixin, LoginRequiredMixin,ListView):
145    """!
146    Clase que gestiona la lista de consultas
147
148    @author Rodrigo Boet (rboet at cenditel.gob.ve)
149    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
150    @date 15-02-2017
151    @version 1.0.0
152    """
153    model = Consulta
154    template_name = "consulta.list.html"
155    group_required = u"Administrador"
156   
157   
158class ConsultaDetail(GroupRequiredMixin, LoginRequiredMixin,DetailView):
159    """!
160    Clase que gestiona el detalle de una consulta
161
162    @author Rodrigo Boet (rboet at cenditel.gob.ve)
163    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
164    @date 17-02-2017
165    @version 1.0.0
166    """
167    model = Consulta
168    template_name = "consulta.detail.html"
169    group_required = u"Administrador"
170   
171    def get_context_data(self, **kwargs):
172        """!
173        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
174   
175        @author Rodrigo Boet (rboet at cenditel.gob.ve)
176        @copyright GNU/GPLv2
177        @date 17-02-2017
178        @param self <b>{object}</b> Objeto que instancia la clase
179        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
180        @return Retorna los datos de contexto
181        """
182        kwargs['preguntas'] = Pregunta.objects.filter(consulta_id=kwargs['object'].id).all()
183        kwargs['respuestas'] = True if RespuestaSino.objects.filter(pregunta__consulta=kwargs['object'].id) else False
184        kwargs['respuestas'] = True if RespuestaOpciones.objects.filter(opcion__pregunta__consulta=kwargs['object'].id) else kwargs['respuestas']
185        kwargs['respuestas_abierta'] = True if RespuestaAbierta.objects.filter(pregunta__consulta=kwargs['object'].id) else False
186        return super(ConsultaDetail, self).get_context_data(**kwargs)
187   
188class ConsultaDelete(GroupRequiredMixin, LoginRequiredMixin,SuccessMessageMixin,DeleteView):
189    """!
190    Clase que gestiona el borrado de consultas
191
192    @author Rodrigo Boet (rboet at cenditel.gob.ve)
193    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
194    @date 15-02-2017
195    @version 1.0.0
196    """
197    model = Consulta
198    template_name = "consulta.delete.html"
199    success_message = "Se eliminó la consulta con éxito"
200    success_url = reverse_lazy('consulta_index')
201    group_required = u"Administrador"
202   
203   
204class ConsultaUpdate(GroupRequiredMixin, LoginRequiredMixin,SuccessMessageMixin,UpdateView):
205    """!
206    Clase que gestiona la actualización de consultas
207
208    @author Rodrigo Boet (rboet at cenditel.gob.ve)
209    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
210    @date 17-02-2017
211    @version 1.0.0
212    """
213    model = Consulta
214    form_class = ConsultaForm
215    template_name = "consulta.update.html"
216    success_message = "Se actualizó la consulta con éxito"
217    success_url = reverse_lazy('consulta_list')
218    group_required = u"Administrador"
219   
220   
221    def get_context_data(self, **kwargs):
222        """!
223        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
224   
225        @author Rodrigo Boet (rboet at cenditel.gob.ve)
226        @copyright GNU/GPLv2
227        @date 17-02-2017
228        @param self <b>{object}</b> Objeto que instancia la clase
229        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
230        @return Retorna los datos de contexto
231        """
232        preguntas = Pregunta.objects.filter(consulta_id=self.object.id).all()
233        kwargs['preguntas'] = preguntas
234        return super(ConsultaUpdate, self).get_context_data(**kwargs)
235       
236       
237class ConsultaStats(GroupRequiredMixin, LoginRequiredMixin,TemplateView):
238    """!
239    Clase que gestiona las estadísticas de la consulta
240
241    @author Rodrigo Boet (rboet at cenditel.gob.ve)
242    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
243    @date 18-04-2017
244    @version 1.0.0
245    """
246    template_name = "consulta.stats.html"
247    group_required = u"Administrador"
248   
249    def get_context_data(self, **kwargs):
250        """!
251        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
252   
253        @author Rodrigo Boet (rboet at cenditel.gob.ve)
254        @copyright GNU/GPLv2
255        @date 18-04-2017
256        @param self <b>{object}</b> Objeto que instancia la clase
257        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
258        @return Retorna los datos de contexto
259        """
260        participacion = {}
261        opciones = []
262        valores = []
263        kwargs['participacion'] = []
264        if RespuestaAbierta.objects.filter(pregunta__consulta_id=self.kwargs['pk']):
265            for item in OBJETIVOS:
266                respuesta = RespuestaAbierta.objects.filter(pregunta__consulta_id=self.kwargs['pk'],objetivo=item[0]).count()
267                opciones.append(item[1].encode('utf8'))
268                valores.append(respuesta)
269            kwargs['participacion'].append({'titulo':'Respuestas por Objetivo de la Constituyente','opciones':opciones,'valores':valores})
270        if RespuestaSino.objects.filter(pregunta__consulta_id=self.kwargs['pk']):
271            kwargs['participacion'].append(self.get_pregunta_sino(self.kwargs['pk']))
272        if RespuestaOpciones.objects.filter(opcion__pregunta__consulta_id=self.kwargs['pk']):
273            for item in self.get_pregunta_opciones(self.kwargs['pk']):
274                kwargs['participacion'].append(item)
275        kwargs['usuarios'] = [self.get_users()]
276        return super(ConsultaStats, self).get_context_data(**kwargs)
277   
278    def get_users(self):
279        """!
280        Metodo que permite cargar los usuarios por grupos de roles
281   
282        @author Rodrigo Boet (rboet at cenditel.gob.ve)
283        @copyright GNU/GPLv2
284        @date 31-05-2017
285        @param self <b>{object}</b> Objeto que instancia la clase
286        @return Retorna los datos del usuario
287        """
288        participantes = User.objects.filter(groups__name='Participante').count()
289        administradores = User.objects.filter(groups__name='Administrador').count()
290        data = {}
291        data['titulo'] = 'Usuarios Registrados'
292        data['opciones'] = ['Participante','Administrador']
293        data['valores'] = [participantes, administradores]
294        return data
295       
296   
297    def get_pregunta_opciones(self,id,titulo=''):
298        """!
299        Metodo que permite cargar las opciones para una pregunta simple o múltiple
300   
301        @author Rodrigo Boet (rboet at cenditel.gob.ve)
302        @copyright GNU/GPLv2
303        @date 18-04-2017
304        @param self <b>{object}</b> Objeto que instancia la clase
305        @param id <b>{int}</b> Entero con el id de la consulta
306        @return Retorna los datos de contexto
307        """
308        datos = []
309        for pregunta in Pregunta.objects.filter(consulta_id=id,tipo_pregunta_id__in=[1,2]).all():
310            options = []
311            values = []
312            for opciones in Opcion.objects.filter(pregunta_id=pregunta.id).all():
313                options.append(opciones.texto_opcion.encode('utf8'))
314                values.append(RespuestaOpciones.objects.filter(opcion_id=opciones.id).count())
315            if titulo=='':
316                titulo = pregunta.texto_pregunta
317            data = {}
318            data['titulo'] = titulo
319            data['opciones'] = options
320            data['valores'] = values
321            datos.append(data)
322        return datos
323   
324    def get_pregunta_sino(self,id,titulo=''):
325        """!
326        Metodo que permite cargar las opciones para una pregunta si o no
327   
328        @author Rodrigo Boet (rboet at cenditel.gob.ve)
329        @copyright GNU/GPLv2
330        @date 18-04-2017
331        @param self <b>{object}</b> Objeto que instancia la clase
332        @param id <b>{int}</b> Entero con el id de la consulta
333        @return Retorna los datos de contexto
334        """
335        if titulo=='':
336            opc = RespuestaSino.objects.filter(pregunta__consulta_id=id).first()
337            titulo = opc.pregunta.texto_pregunta
338        Si = RespuestaSino.objects.filter(respuesta=True,pregunta__consulta_id=id).count()
339        No = RespuestaSino.objects.filter(respuesta=False,pregunta__consulta_id=id).count()
340        data = {}
341        data['titulo'] = titulo
342        data['opciones'] = ['Si','No']
343        data['valores'] = [Si, No]
344        return data
345   
346class ConsultaReport(GroupRequiredMixin, LoginRequiredMixin, FormView):
347    """!
348    Clase que gestiona la vista principal de los reportes
349
350    @author Rodrigo Boet (rboet at cenditel.gob.ve)
351    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
352    @date 31-05-2017
353    @version 1.0.0
354    """
355    template_name = "consulta.report.html"
356    group_required = u"Administrador"
357    form_class = ConsultaSearchForm
358   
359    def get_success_url(self):
360        """!
361        Metodo que permite definir la url de dirección al ser válido el formulario
362       
363        @author Rodrigo Boet (rboet at cenditel.gob.ve)
364        @copyright GNU/GPLv2
365        @date 01-06-2017
366        @param self <b>{object}</b> Objeto que instancia la clase
367        @return Retorna la url
368        """
369        tipo_pregunta = self.request.POST['tipo_pregunta']
370        objetivo = self.request.POST.get('objetivo','')
371        estado = self.request.POST.get('estado','')
372        municipio = self.request.POST.get('municipio','')
373        parroquia = self.request.POST.get('parroquia','')
374        sector = self.request.POST.get('sector','')
375        sector_trabajador = self.request.POST.get('sector_trabajador','')
376        sector_estudiante = self.request.POST.get('sector_estudiante','')
377        url = '%s?objetivo=%s&estado=%s&municipio=%s&parroquia=%s&sector=%s&sector_trabajador=%s&sector_estudiante=%s' % (reverse_lazy('consulta_pdf',
378            kwargs={'pk': self.kwargs['pk'],'tipo_pregunta': tipo_pregunta}),
379            objetivo,estado,municipio,parroquia,sector,sector_trabajador,sector_estudiante)
380        return url
381   
382    def get_context_data(self, **kwargs):
383        """!
384        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
385   
386        @author Rodrigo Boet (rboet at cenditel.gob.ve)
387        @copyright GNU/GPLv2
388        @date 17-02-2017
389        @param self <b>{object}</b> Objeto que instancia la clase
390        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
391        @return Retorna los datos de contexto
392        """
393        kwargs['pk'] = self.kwargs['pk']
394        return super(ConsultaReport, self).get_context_data(**kwargs)
395   
396class ConsultaPdf(PDFTemplateView):
397    """!
398    Clase que gestiona la renderización de reportes en PDF
399
400    @author Rodrigo Boet (rboet at cenditel.gob.ve)
401    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
402    @date 01-06-2017
403    @version 1.0.0
404    """
405    template_name = 'consulta.pdf.template.html'
406
407    def get_context_data(self, **kwargs):
408        """!
409        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
410   
411        @author Rodrigo Boet (rboet at cenditel.gob.ve)
412        @copyright GNU/GPLv2
413        @date 01-06-2017
414        @param self <b>{object}</b> Objeto que instancia la clase
415        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
416        @return Retorna los datos de contexto
417        """
418        pk = int(self.kwargs['pk'])
419        tipo_pregunta = int(self.kwargs['tipo_pregunta'])
420        ## Variables por get
421        objetivo = self.request.GET['objetivo']
422        estado = self.request.GET['estado']
423        municipio = self.request.GET['municipio']
424        parroquia = self.request.GET['parroquia']
425        sector = self.request.GET['sector']
426        sector_trabajador = self.request.GET['sector_trabajador']
427        sector_estudiante = self.request.GET['sector_estudiante']
428        resp = 0
429        est, mun, parr = 0, 0, 0
430        preg = Pregunta.objects.get(pk=tipo_pregunta)
431        if preg.tipo_pregunta_id >=1 and preg.tipo_pregunta_id <3:
432            resp = RespuestaOpciones.objects.filter(opcion__pregunta_id=tipo_pregunta)
433        elif preg.tipo_pregunta_id >2 and preg.tipo_pregunta_id <5:
434            resp = RespuestaSino.objects.filter(pregunta__id=tipo_pregunta)
435        elif preg.tipo_pregunta_id == 5:
436            resp = RespuestaAbierta.objects.filter(pregunta_id=tipo_pregunta,objetivo=objetivo)
437        ## Se validan los filtros por territorio
438        if estado == '':
439            datos = []
440            for estado in Entidad.objects.all():
441                data = Perfil.objects.filter(parroquia__municipio__entidad_id=estado.id,user_id__in=resp.values_list('user_id',flat=True)).count()
442                datos.append([estado.nombre,data])
443            kwargs['estados'] = datos
444        elif estado !='' and (municipio=='' and parroquia==''):
445            est = Perfil.objects.filter(parroquia__municipio__entidad_id=estado,user_id__in=resp.values_list('user_id',flat=True))
446            kwargs['lugar'] = est.count()
447            kwargs['ubicacion'] = Entidad.objects.get(pk=estado)
448            ## Muestra los datos por los municipios del estado
449            datos = []
450            for municipio in Municipio.objects.filter(entidad_id=estado).all():
451                data = Perfil.objects.filter(parroquia__municipio_id=municipio.id,user_id__in=resp.values_list('user_id',flat=True)).count()
452                datos.append([municipio.nombre,data])
453            kwargs['municipios'] = datos
454        elif municipio!='' and parroquia=='':
455            mun = Perfil.objects.filter(parroquia__municipio_id=municipio,user_id__in=resp.values_list('user_id',flat=True))
456            kwargs['lugar'] = mun.count()
457            kwargs['ubicacion'] = Municipio.objects.get(pk=municipio)
458            ## Muestra los datos por la parroquia
459            datos = []
460            for parroquia in Parroquia.objects.filter(municipio_id=municipio).all():
461                data = Perfil.objects.filter(parroquia_id=parroquia.id,user_id__in=resp.values_list('user_id',flat=True)).count()
462                datos.append([parroquia.nombre,data])
463            kwargs['parroquias'] = datos
464        elif parroquia!='':
465            parr = Perfil.objects.filter(parroquia_id=parroquia,user_id__in=resp.values_list('user_id',flat=True))
466            kwargs['lugar'] = parr.count()
467            kwargs['ubicacion'] = Parroquia.objects.get(pk=parroquia)
468        ## Se validan los filtros por sector
469        SECTOR = dict(SECTORES)
470        ST = dict(SECTOR_TRABAJADOR)
471        SE = dict(SECTOR_ESTUDIANTE)
472        if sector=='':
473            datos = []
474            for sec in SECTOR:
475                data = Perfil.objects.filter(sector=sec,user_id__in=resp.values_list('user_id',flat=True)).count()
476                datos.append([SECTOR[sec],data])
477            kwargs['sectores'] = datos
478        elif sector == 'TR' and sector_trabajador!='':
479            sec = Perfil.objects.filter(sector=sector,user_id__in=resp.values_list('user_id',flat=True))
480            kwargs['sector'] = sec.count()
481            kwargs['sector_texto'] = SECTOR[sector]
482            sec = sec.filter(sector_trabajador=sector_trabajador)
483            kwargs['sector_trabajador'] = sec.count()
484            kwargs['sector_trabajador_texto'] = ST[sector_trabajador]
485        elif sector == 'ES' and sector_estudiante!='':
486            sec = Perfil.objects.filter(sector=sector,user_id__in=resp.values_list('user_id',flat=True))
487            kwargs['sector'] = sec.count()
488            kwargs['sector_texto'] = SECTOR[sector]
489            sec = sec.filter(sector_estudiante=sector_estudiante)
490            kwargs['sector_estudiante'] = sec.count()
491            kwargs['sector_estudiante_texto'] = SE[sector_estudiante]
492        else:
493            sec = Perfil.objects.filter(sector=sector,user_id__in=resp.values_list('user_id',flat=True))
494            kwargs['sector'] = sec.count()
495            kwargs['sector_texto'] = SECTOR[sector]
496        kwargs['respuestas'] = resp.count()
497        kwargs['pregunta_texto'] = preg.texto_pregunta
498        kwargs['objetivo_texto'] = OBJETIVOS[int(objetivo)-1][1] if objetivo else None
499        return super(ConsultaPdf, self).get_context_data(**kwargs)
500
501   
502class OpcionesCreate(GroupRequiredMixin, LoginRequiredMixin,CreateView):
503    """!
504    Clase que gestiona la creación de opciones
505
506    @author Rodrigo Boet (rboet at cenditel.gob.ve)
507    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
508    @date 20-02-2017
509    @version 1.0.0
510    """
511    model = Opcion
512    fields = ['texto_opcion']
513    template_name = "consulta.create.html"
514    group_required = u"Administrador"
515           
516   
517    def form_valid(self,form):
518        """!
519        Metodo que valida si el formulario es valido
520   
521        @author Rodrigo Boet (rboet at cenditel.gob.ve)
522        @copyright GNU/GPLv2
523        @date 20-02-2017
524        @param self <b>{object}</b> Objeto que instancia la clase
525        @param form <b>{object}</b> Objeto que contiene el formulario de registro
526        @return Retorna el formulario validado
527        """
528        post_data = dict(self.request.POST.lists())
529        pregunta = Pregunta.objects.get(id=int(self.kwargs['pk']))
530       
531        ## Se guarda la primera opcion
532        self.object = form.save(commit=False)
533        self.object.texto_opcion = post_data['texto_opcion'][0]
534        self.object.pregunta = pregunta
535        self.object.save()
536       
537        ## Se guardan las demás opciones si existen
538        for i in range(1,len(post_data['texto_opcion'])):
539            opcion = Opcion()
540            opcion.texto_opcion = post_data['texto_opcion'][i]
541            opcion.pregunta = pregunta
542            opcion.save()
543           
544        if self.request.is_ajax():
545            return JsonResponse({"code":True})
546           
547        return super(OpcionesCreate, self).form_valid(form)
548   
549    def form_invalid(self,form):
550        """!
551        Metodo que valida si el formulario es invalido
552   
553        @author Rodrigo Boet (rboet at cenditel.gob.ve)
554        @copyright GNU/GPLv2
555        @date 20-02-2017
556        @param self <b>{object}</b> Objeto que instancia la clase
557        @param form <b>{object}</b> Objeto que contiene el formulario de registro
558        @return Retorna el formulario inválido
559        """
560        if self.request.is_ajax():
561            return JsonResponse({"code":False,'errors':form.errors})
562        return super(OpcionesCreate, self).form_invalid(form)
563   
564   
565class OpcionesUpdate(GroupRequiredMixin, LoginRequiredMixin,UpdateView):
566    """!
567    Clase que gestiona la actualización de las opciones
568
569    @author Rodrigo Boet (rboet at cenditel.gob.ve)
570    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
571    @date 20-02-2017
572    @version 1.0.0
573    """
574    model = Opcion
575    fields = ['texto_opcion']
576    template_name = "consulta.update.html"
577    success_url = reverse_lazy('consulta_list')
578    group_required = u"Administrador"
579   
580   
581    def post(self, request):
582        """!
583        Metodo que sobreescribe la acción por POST
584   
585        @author Rodrigo Boet (rboet at cenditel.gob.ve)
586        @copyright GNU/GPLv2
587        @date 20-02-2017
588        @param self <b>{object}</b> Objeto que instancia la clase
589        @param request <b>{object}</b> Objeto que contiene la petición
590        @return Retorna los datos de contexto
591        """
592        post_data = dict(self.request.POST.lists())
593        for i in range(len(post_data['texto_opcion'])):
594            opcion = Opcion.objects.filter(id=int(post_data['texto_opcion_id'][i]))
595            if(opcion):
596                opcion = opcion.get()
597                opcion.texto_opcion = post_data['texto_opcion'][i]
598                opcion.save()
599
600        if self.request.is_ajax():
601            return JsonResponse({"code":True})
602       
603class OpcionesDelete(GroupRequiredMixin, LoginRequiredMixin,DeleteView):
604    """!
605    Clase que gestiona el borrado de una opción
606
607    @author Rodrigo Boet (rboet at cenditel.gob.ve)
608    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
609    @date 20-02-2017
610    @version 1.0.0
611    """
612    model = Opcion
613    template_name = "consulta.update.html"
614    success_url = reverse_lazy('consulta_list')
615    group_required = u"Administrador"
616   
617    def post(self, request, pk):
618        """!
619        Metodo que sobreescribe la acción por POST
620   
621        @author Rodrigo Boet (rboet at cenditel.gob.ve)
622        @copyright GNU/GPLv2
623        @date 20-02-2017
624        @param self <b>{object}</b> Objeto que instancia la clase
625        @param request <b>{object}</b> Objeto que contiene la petición
626        @param pk <b>{int}</b> Recibe el id para filtrar
627        @return Retorna los datos de contexto
628        """
629        opcion = Opcion.objects.filter(id=int(pk))
630        if(opcion):
631            opcion = opcion.get()
632            opcion.delete()
633            return JsonResponse({'success':True})
634        return JsonResponse({'success':False,'mensaje':'Opción inválida'})
635           
636           
637class PreguntaDelete(GroupRequiredMixin, LoginRequiredMixin,DeleteView):
638    """!
639    Clase que gestiona el borrado de una pregunta
640
641    @author Rodrigo Boet (rboet at cenditel.gob.ve)
642    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
643    @date 20-02-2017
644    @version 1.0.0
645    """
646    model = Pregunta
647    template_name = "consulta.update.html"
648    success_url = reverse_lazy('consulta_list')
649    group_required = u"Administrador"
650   
651    def post(self, request, pk):
652        """!
653        Metodo que sobreescribe la acción por POST
654   
655        @author Rodrigo Boet (rboet at cenditel.gob.ve)
656        @copyright GNU/GPLv2
657        @date 20-02-2017
658        @param self <b>{object}</b> Objeto que instancia la clase
659        @param request <b>{object}</b> Objeto que contiene la petición
660        @param pk <b>{int}</b> Recibe el id para filtrar
661        @return Retorna los datos de contexto
662        """
663        pregunta = Pregunta.objects.filter(id=int(pk))
664        if(pregunta):
665            pregunta = pregunta.get()
666            ## Si tiene opciones, se buscan y se borran
667            if(pregunta.tipo_pregunta_id==1):
668                opciones = Opcion.objects.filter(pregunta_id=pregunta.id)
669                if (opciones):
670                    for item in opciones.all():
671                        item.delete()               
672            pregunta.delete()
673            return JsonResponse({'success':True})
674        return JsonResponse({'success':False,'mensaje':'Pregunta inválida'})
675   
676   
677class PreguntaCreate(GroupRequiredMixin, LoginRequiredMixin,CreateView):
678    """!
679    Clase que gestiona la creación de preguntas
680
681    @author Rodrigo Boet (rboet at cenditel.gob.ve)
682    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
683    @date 21-02-2017
684    @version 1.0.0
685    """
686    model = Pregunta
687    fields = ['texto_pregunta','tipo_pregunta']
688    template_name = "consulta.create.html"
689    success_url = reverse_lazy('consulta_index')
690    group_required = u"Administrador"
691   
692    def form_valid(self,form):
693        """!
694        Metodo que valida si el formulario es valido
695   
696        @author Rodrigo Boet (rboet at cenditel.gob.ve)
697        @copyright GNU/GPLv2
698        @date 21-02-2017
699        @param self <b>{object}</b> Objeto que instancia la clase
700        @param form <b>{object}</b> Objeto que contiene el formulario de registro
701        @return Retorna el formulario validado
702        """
703        post_data = dict(self.request.POST.lists())
704        consulta = Consulta.objects.get(id=int(self.kwargs['pk']))
705       
706        ## Se guarda la primera opcion
707        self.object = form.save(commit=False)
708        self.object.texto_opcion = form.cleaned_data['texto_pregunta']
709        self.object.tipo_pregunta = form.cleaned_data['tipo_pregunta']
710        self.object.consulta = consulta
711        self.object.save()
712       
713        ## Se guardan las demás opciones si existen
714        for i in range(len(post_data['texto_pregunta'])-1):
715            tipo_pregunta = TipoPregunta.objects.get(id=int(post_data['tipo_pregunta'][i]))
716            pregunta = Pregunta()
717            pregunta.texto_opcion = post_data['texto_pregunta'][i]
718            pregunta.tipo_pregunta = post_data['tipo_pregunta'][i]
719            pregunta.consulta = consulta
720            pregunta.save()
721           
722        if self.request.is_ajax():
723            return JsonResponse({"code":True})
724           
725        return super(OpcionesCreate, self).form_valid(form)
726   
727    def form_invalid(self,form):
728        """!
729        Metodo que valida si el formulario es invalido
730   
731        @author Rodrigo Boet (rboet at cenditel.gob.ve)
732        @copyright GNU/GPLv2
733        @date 21-02-2017
734        @param self <b>{object}</b> Objeto que instancia la clase
735        @param form <b>{object}</b> Objeto que contiene el formulario de registro
736        @return Retorna el formulario inválido
737        """
738        if self.request.is_ajax():
739            return JsonResponse({"code":False,'errors':form.errors})
740        return super(OpcionesCreate, self).form_invalid(form)
741   
742class PreguntaUpdate(GroupRequiredMixin, LoginRequiredMixin, UpdateView):
743    """!
744    Clase que gestiona la actualización de las preguntas
745
746    @author Rodrigo Boet (rboet at cenditel.gob.ve)
747    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
748    @date 23-02-2017
749    @version 1.0.0
750    """
751    model = Pregunta
752    fields = ['texto_pregunta','tipo_pregunta']
753    template_name = "consulta.update.html"
754    success_url = reverse_lazy('consulta_list')
755    group_required = u"Administrador"
756   
757    def post(self, request):
758        """!
759        Metodo que sobreescribe la acción por POST
760   
761        @author Rodrigo Boet (rboet at cenditel.gob.ve)
762        @copyright GNU/GPLv2
763        @date 23-02-2017
764        @param self <b>{object}</b> Objeto que instancia la clase
765        @param request <b>{object}</b> Objeto que contiene la petición
766        @return Retorna los datos de contexto
767        """
768        post_data = dict(self.request.POST.lists())
769        for i in range(len(post_data['texto_pregunta_modal'])):
770            pregunta = Pregunta.objects.filter(id=int(post_data['texto_pregunta_id'][i]))
771            if(pregunta):
772                pregunta = pregunta.get()
773                salvar = False
774                if(pregunta.texto_pregunta != post_data['texto_pregunta_modal'][i]):
775                    pregunta.texto_pregunta = post_data['texto_pregunta_modal'][i]
776                    salvar = True
777                if(pregunta.tipo_pregunta != post_data['tipo_pregunta_modal'][i]):
778                    tipo_pregunta = TipoPregunta.objects.filter(id=int(post_data['tipo_pregunta_modal'][i])).get()
779                    pregunta.tipo_pregunta = tipo_pregunta
780                    salvar = True
781                if(salvar):   
782                    pregunta.save()
783
784        if self.request.is_ajax():
785            return JsonResponse({"code":True})
786   
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.