source: consulta_publica/consulta/views.py @ 32be06f

estudiantesgeneralplan_patria
Last change on this file since 32be06f 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: 33.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 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, Universidades
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        universidad = self.request.POST.get('universidad','')
378        url = '%s?objetivo=%s&estado=%s&municipio=%s&parroquia=%s&sector=%s&sector_trabajador=%s&sector_estudiante=%s&universidad=%s' % (reverse_lazy('consulta_pdf',
379            kwargs={'pk': self.kwargs['pk'],'tipo_pregunta': tipo_pregunta}),
380            objetivo,estado,municipio,parroquia,sector,sector_trabajador,sector_estudiante,universidad)
381        return url
382   
383    def get_context_data(self, **kwargs):
384        """!
385        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
386   
387        @author Rodrigo Boet (rboet at cenditel.gob.ve)
388        @copyright GNU/GPLv2
389        @date 17-02-2017
390        @param self <b>{object}</b> Objeto que instancia la clase
391        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
392        @return Retorna los datos de contexto
393        """
394        kwargs['pk'] = self.kwargs['pk']
395        return super(ConsultaReport, self).get_context_data(**kwargs)
396   
397class ConsultaPdf(PDFTemplateView):
398    """!
399    Clase que gestiona la renderización de reportes en PDF
400
401    @author Rodrigo Boet (rboet at cenditel.gob.ve)
402    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
403    @date 01-06-2017
404    @version 1.0.0
405    """
406    template_name = 'consulta.pdf.template.html'
407
408    def get_context_data(self, **kwargs):
409        """!
410        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
411   
412        @author Rodrigo Boet (rboet at cenditel.gob.ve)
413        @copyright GNU/GPLv2
414        @date 01-06-2017
415        @param self <b>{object}</b> Objeto que instancia la clase
416        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
417        @return Retorna los datos de contexto
418        """
419        pk = int(self.kwargs['pk'])
420        tipo_pregunta = int(self.kwargs['tipo_pregunta'])
421        ## Variables por get
422        objetivo = self.request.GET['objetivo']
423        estado = self.request.GET['estado']
424        municipio = self.request.GET['municipio']
425        parroquia = self.request.GET['parroquia']
426        sector = self.request.GET['sector']
427        sector_trabajador = self.request.GET['sector_trabajador']
428        sector_estudiante = self.request.GET['sector_estudiante']
429        universidad = self.request.GET['universidad']
430        resp = 0
431        est, mun, parr = 0, 0, 0
432        preg = Pregunta.objects.get(pk=tipo_pregunta)
433        if preg.tipo_pregunta_id >=1 and preg.tipo_pregunta_id <3:
434            resp = RespuestaOpciones.objects.filter(opcion__pregunta_id=tipo_pregunta)
435        elif preg.tipo_pregunta_id >2 and preg.tipo_pregunta_id <5:
436            resp = RespuestaSino.objects.filter(pregunta__id=tipo_pregunta)
437        elif preg.tipo_pregunta_id == 5:
438            resp = RespuestaAbierta.objects.filter(pregunta_id=tipo_pregunta,objetivo=objetivo)
439        ## Se validan los filtros por territorio
440        if estado == '':
441            datos = []
442            for estado in Entidad.objects.all():
443                data = Perfil.objects.filter(parroquia__municipio__entidad_id=estado.id,user_id__in=resp.values_list('user_id',flat=True)).count()
444                datos.append([estado.nombre,data])
445            kwargs['estados'] = datos
446        elif estado !='' and (municipio=='' and parroquia==''):
447            est = Perfil.objects.filter(parroquia__municipio__entidad_id=estado,user_id__in=resp.values_list('user_id',flat=True))
448            kwargs['lugar'] = est.count()
449            kwargs['ubicacion'] = Entidad.objects.get(pk=estado)
450            ## Muestra los datos por los municipios del estado
451            datos = []
452            for municipio in Municipio.objects.filter(entidad_id=estado).all():
453                data = Perfil.objects.filter(parroquia__municipio_id=municipio.id,user_id__in=resp.values_list('user_id',flat=True)).count()
454                datos.append([municipio.nombre,data])
455            kwargs['municipios'] = datos
456        elif municipio!='' and parroquia=='':
457            mun = Perfil.objects.filter(parroquia__municipio_id=municipio,user_id__in=resp.values_list('user_id',flat=True))
458            kwargs['lugar'] = mun.count()
459            kwargs['ubicacion'] = Municipio.objects.get(pk=municipio)
460            ## Muestra los datos por la parroquia
461            datos = []
462            for parroquia in Parroquia.objects.filter(municipio_id=municipio).all():
463                data = Perfil.objects.filter(parroquia_id=parroquia.id,user_id__in=resp.values_list('user_id',flat=True)).count()
464                datos.append([parroquia.nombre,data])
465            kwargs['parroquias'] = datos
466        elif parroquia!='':
467            parr = Perfil.objects.filter(parroquia_id=parroquia,user_id__in=resp.values_list('user_id',flat=True))
468            kwargs['lugar'] = parr.count()
469            kwargs['ubicacion'] = Parroquia.objects.get(pk=parroquia)
470        ## Se validan los filtros por sector
471        SECTOR = dict(SECTORES)
472        ST = dict(SECTOR_TRABAJADOR)
473        SE = dict(SECTOR_ESTUDIANTE)
474        if sector=='':
475            datos = []
476            for sec in SECTOR:
477                data = Perfil.objects.filter(sector=sec,user_id__in=resp.values_list('user_id',flat=True)).count()
478                datos.append([SECTOR[sec],data])
479            kwargs['sectores'] = datos
480        elif sector == 'TR' and sector_trabajador!='':
481            sec = Perfil.objects.filter(sector=sector,user_id__in=resp.values_list('user_id',flat=True))
482            kwargs['sector'] = sec.count()
483            kwargs['sector_texto'] = SECTOR[sector]
484            sec = sec.filter(sector_trabajador=sector_trabajador)
485            kwargs['sector_trabajador'] = sec.count()
486            kwargs['sector_trabajador_texto'] = ST[sector_trabajador]
487        elif sector == 'ES' and sector_estudiante!='':
488            sec = Perfil.objects.filter(sector=sector,user_id__in=resp.values_list('user_id',flat=True))
489            kwargs['sector'] = sec.count()
490            kwargs['sector_texto'] = SECTOR[sector]
491            sec = sec.filter(sector_estudiante=sector_estudiante)
492            kwargs['sector_estudiante'] = sec.count()
493            kwargs['sector_estudiante_texto'] = SE[sector_estudiante]
494            #universidades
495            if(universidad!=''):
496                uni = Universidades.objects.get(pk=universidad)
497                sec = sec.filter(universidad_id=universidad)
498                kwargs['universidad'] = sec.count()
499                kwargs['universidad_texto'] = uni.nombre
500            else:
501                datos = []
502                for uni in Universidades.objects.all():
503                    data = Perfil.objects.filter(universidad_id=uni.id,user_id__in=resp.values_list('user_id',flat=True)).count()
504                    datos.append([uni.nombre,data])
505                kwargs['universidades'] = datos
506        else:
507            sec = Perfil.objects.filter(sector=sector,user_id__in=resp.values_list('user_id',flat=True))
508            kwargs['sector'] = sec.count()
509            kwargs['sector_texto'] = SECTOR[sector]
510        kwargs['respuestas'] = resp.count()
511        kwargs['pregunta_texto'] = preg.texto_pregunta
512        kwargs['objetivo_texto'] = OBJETIVOS[int(objetivo)-1][1] if objetivo else None
513        return super(ConsultaPdf, self).get_context_data(**kwargs)
514
515   
516class OpcionesCreate(GroupRequiredMixin, LoginRequiredMixin,CreateView):
517    """!
518    Clase que gestiona la creación de opciones
519
520    @author Rodrigo Boet (rboet at cenditel.gob.ve)
521    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
522    @date 20-02-2017
523    @version 1.0.0
524    """
525    model = Opcion
526    fields = ['texto_opcion']
527    template_name = "consulta.create.html"
528    group_required = u"Administrador"
529           
530   
531    def form_valid(self,form):
532        """!
533        Metodo que valida si el formulario es valido
534   
535        @author Rodrigo Boet (rboet at cenditel.gob.ve)
536        @copyright GNU/GPLv2
537        @date 20-02-2017
538        @param self <b>{object}</b> Objeto que instancia la clase
539        @param form <b>{object}</b> Objeto que contiene el formulario de registro
540        @return Retorna el formulario validado
541        """
542        post_data = dict(self.request.POST.lists())
543        pregunta = Pregunta.objects.get(id=int(self.kwargs['pk']))
544       
545        ## Se guarda la primera opcion
546        self.object = form.save(commit=False)
547        self.object.texto_opcion = post_data['texto_opcion'][0]
548        self.object.pregunta = pregunta
549        self.object.save()
550       
551        ## Se guardan las demás opciones si existen
552        for i in range(1,len(post_data['texto_opcion'])):
553            opcion = Opcion()
554            opcion.texto_opcion = post_data['texto_opcion'][i]
555            opcion.pregunta = pregunta
556            opcion.save()
557           
558        if self.request.is_ajax():
559            return JsonResponse({"code":True})
560           
561        return super(OpcionesCreate, self).form_valid(form)
562   
563    def form_invalid(self,form):
564        """!
565        Metodo que valida si el formulario es invalido
566   
567        @author Rodrigo Boet (rboet at cenditel.gob.ve)
568        @copyright GNU/GPLv2
569        @date 20-02-2017
570        @param self <b>{object}</b> Objeto que instancia la clase
571        @param form <b>{object}</b> Objeto que contiene el formulario de registro
572        @return Retorna el formulario inválido
573        """
574        if self.request.is_ajax():
575            return JsonResponse({"code":False,'errors':form.errors})
576        return super(OpcionesCreate, self).form_invalid(form)
577   
578   
579class OpcionesUpdate(GroupRequiredMixin, LoginRequiredMixin,UpdateView):
580    """!
581    Clase que gestiona la actualización de las opciones
582
583    @author Rodrigo Boet (rboet at cenditel.gob.ve)
584    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
585    @date 20-02-2017
586    @version 1.0.0
587    """
588    model = Opcion
589    fields = ['texto_opcion']
590    template_name = "consulta.update.html"
591    success_url = reverse_lazy('consulta_list')
592    group_required = u"Administrador"
593   
594   
595    def post(self, request):
596        """!
597        Metodo que sobreescribe la acción por POST
598   
599        @author Rodrigo Boet (rboet at cenditel.gob.ve)
600        @copyright GNU/GPLv2
601        @date 20-02-2017
602        @param self <b>{object}</b> Objeto que instancia la clase
603        @param request <b>{object}</b> Objeto que contiene la petición
604        @return Retorna los datos de contexto
605        """
606        post_data = dict(self.request.POST.lists())
607        for i in range(len(post_data['texto_opcion'])):
608            opcion = Opcion.objects.filter(id=int(post_data['texto_opcion_id'][i]))
609            if(opcion):
610                opcion = opcion.get()
611                opcion.texto_opcion = post_data['texto_opcion'][i]
612                opcion.save()
613
614        if self.request.is_ajax():
615            return JsonResponse({"code":True})
616       
617class OpcionesDelete(GroupRequiredMixin, LoginRequiredMixin,DeleteView):
618    """!
619    Clase que gestiona el borrado de una opción
620
621    @author Rodrigo Boet (rboet at cenditel.gob.ve)
622    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
623    @date 20-02-2017
624    @version 1.0.0
625    """
626    model = Opcion
627    template_name = "consulta.update.html"
628    success_url = reverse_lazy('consulta_list')
629    group_required = u"Administrador"
630   
631    def post(self, request, pk):
632        """!
633        Metodo que sobreescribe la acción por POST
634   
635        @author Rodrigo Boet (rboet at cenditel.gob.ve)
636        @copyright GNU/GPLv2
637        @date 20-02-2017
638        @param self <b>{object}</b> Objeto que instancia la clase
639        @param request <b>{object}</b> Objeto que contiene la petición
640        @param pk <b>{int}</b> Recibe el id para filtrar
641        @return Retorna los datos de contexto
642        """
643        opcion = Opcion.objects.filter(id=int(pk))
644        if(opcion):
645            opcion = opcion.get()
646            opcion.delete()
647            return JsonResponse({'success':True})
648        return JsonResponse({'success':False,'mensaje':'Opción inválida'})
649           
650           
651class PreguntaDelete(GroupRequiredMixin, LoginRequiredMixin,DeleteView):
652    """!
653    Clase que gestiona el borrado de una pregunta
654
655    @author Rodrigo Boet (rboet at cenditel.gob.ve)
656    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
657    @date 20-02-2017
658    @version 1.0.0
659    """
660    model = Pregunta
661    template_name = "consulta.update.html"
662    success_url = reverse_lazy('consulta_list')
663    group_required = u"Administrador"
664   
665    def post(self, request, pk):
666        """!
667        Metodo que sobreescribe la acción por POST
668   
669        @author Rodrigo Boet (rboet at cenditel.gob.ve)
670        @copyright GNU/GPLv2
671        @date 20-02-2017
672        @param self <b>{object}</b> Objeto que instancia la clase
673        @param request <b>{object}</b> Objeto que contiene la petición
674        @param pk <b>{int}</b> Recibe el id para filtrar
675        @return Retorna los datos de contexto
676        """
677        pregunta = Pregunta.objects.filter(id=int(pk))
678        if(pregunta):
679            pregunta = pregunta.get()
680            ## Si tiene opciones, se buscan y se borran
681            if(pregunta.tipo_pregunta_id==1):
682                opciones = Opcion.objects.filter(pregunta_id=pregunta.id)
683                if (opciones):
684                    for item in opciones.all():
685                        item.delete()               
686            pregunta.delete()
687            return JsonResponse({'success':True})
688        return JsonResponse({'success':False,'mensaje':'Pregunta inválida'})
689   
690   
691class PreguntaCreate(GroupRequiredMixin, LoginRequiredMixin,CreateView):
692    """!
693    Clase que gestiona la creación de preguntas
694
695    @author Rodrigo Boet (rboet at cenditel.gob.ve)
696    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
697    @date 21-02-2017
698    @version 1.0.0
699    """
700    model = Pregunta
701    fields = ['texto_pregunta','tipo_pregunta']
702    template_name = "consulta.create.html"
703    success_url = reverse_lazy('consulta_index')
704    group_required = u"Administrador"
705   
706    def form_valid(self,form):
707        """!
708        Metodo que valida si el formulario es valido
709   
710        @author Rodrigo Boet (rboet at cenditel.gob.ve)
711        @copyright GNU/GPLv2
712        @date 21-02-2017
713        @param self <b>{object}</b> Objeto que instancia la clase
714        @param form <b>{object}</b> Objeto que contiene el formulario de registro
715        @return Retorna el formulario validado
716        """
717        post_data = dict(self.request.POST.lists())
718        consulta = Consulta.objects.get(id=int(self.kwargs['pk']))
719       
720        ## Se guarda la primera opcion
721        self.object = form.save(commit=False)
722        self.object.texto_opcion = form.cleaned_data['texto_pregunta']
723        self.object.tipo_pregunta = form.cleaned_data['tipo_pregunta']
724        self.object.consulta = consulta
725        self.object.save()
726       
727        ## Se guardan las demás opciones si existen
728        for i in range(len(post_data['texto_pregunta'])-1):
729            tipo_pregunta = TipoPregunta.objects.get(id=int(post_data['tipo_pregunta'][i]))
730            pregunta = Pregunta()
731            pregunta.texto_opcion = post_data['texto_pregunta'][i]
732            pregunta.tipo_pregunta = post_data['tipo_pregunta'][i]
733            pregunta.consulta = consulta
734            pregunta.save()
735           
736        if self.request.is_ajax():
737            return JsonResponse({"code":True})
738           
739        return super(OpcionesCreate, self).form_valid(form)
740   
741    def form_invalid(self,form):
742        """!
743        Metodo que valida si el formulario es invalido
744   
745        @author Rodrigo Boet (rboet at cenditel.gob.ve)
746        @copyright GNU/GPLv2
747        @date 21-02-2017
748        @param self <b>{object}</b> Objeto que instancia la clase
749        @param form <b>{object}</b> Objeto que contiene el formulario de registro
750        @return Retorna el formulario inválido
751        """
752        if self.request.is_ajax():
753            return JsonResponse({"code":False,'errors':form.errors})
754        return super(OpcionesCreate, self).form_invalid(form)
755   
756class PreguntaUpdate(GroupRequiredMixin, LoginRequiredMixin, UpdateView):
757    """!
758    Clase que gestiona la actualización de las preguntas
759
760    @author Rodrigo Boet (rboet at cenditel.gob.ve)
761    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
762    @date 23-02-2017
763    @version 1.0.0
764    """
765    model = Pregunta
766    fields = ['texto_pregunta','tipo_pregunta']
767    template_name = "consulta.update.html"
768    success_url = reverse_lazy('consulta_list')
769    group_required = u"Administrador"
770   
771    def post(self, request):
772        """!
773        Metodo que sobreescribe la acción por POST
774   
775        @author Rodrigo Boet (rboet at cenditel.gob.ve)
776        @copyright GNU/GPLv2
777        @date 23-02-2017
778        @param self <b>{object}</b> Objeto que instancia la clase
779        @param request <b>{object}</b> Objeto que contiene la petición
780        @return Retorna los datos de contexto
781        """
782        post_data = dict(self.request.POST.lists())
783        for i in range(len(post_data['texto_pregunta_modal'])):
784            pregunta = Pregunta.objects.filter(id=int(post_data['texto_pregunta_id'][i]))
785            if(pregunta):
786                pregunta = pregunta.get()
787                salvar = False
788                if(pregunta.texto_pregunta != post_data['texto_pregunta_modal'][i]):
789                    pregunta.texto_pregunta = post_data['texto_pregunta_modal'][i]
790                    salvar = True
791                if(pregunta.tipo_pregunta != post_data['tipo_pregunta_modal'][i]):
792                    tipo_pregunta = TipoPregunta.objects.filter(id=int(post_data['tipo_pregunta_modal'][i])).get()
793                    pregunta.tipo_pregunta = tipo_pregunta
794                    salvar = True
795                if(salvar):   
796                    pregunta.save()
797
798        if self.request.is_ajax():
799            return JsonResponse({"code":True})
800   
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.