source: consulta_publica/participacion/views.py @ be8d917

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

Agregada la permisología de roles al sistema

  • Propiedad mode establecida a 100644
File size: 13.4 KB
Línea 
1# -*- coding: utf-8 -*-
2"""
3Sistema de Consulta Pública
4
5Copyleft (@) 2017 CENDITEL nodo Mérida - https://planificacion.cenditel.gob.ve/trac/wiki/ModeladoTopicos_2017
6"""
7## @package participacion.views
8#
9# Vistas correspondientes a la aplicación participacion
10# @author Rodrigo Boet (rboet at cenditel.gob.ve)
11# @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres
12# (CENDITEL) nodo Mérida - Venezuela</a>
13# @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
14# @version 1.0
15import json
16from django.shortcuts import render, redirect
17from django.core.urlresolvers import reverse_lazy
18from django.http import JsonResponse
19from django.views.generic import FormView, TemplateView
20from django.contrib.auth.models import User
21from django.contrib.auth.mixins import LoginRequiredMixin
22from braces.views import GroupRequiredMixin
23from .forms import ParticipacionSelectForm, ParticipacionSearchForm
24from .models import RespuestaAbierta, RespuestaOpciones, RespuestaSino
25from consulta.models import Pregunta, Opcion
26import requests
27
28class ParticipacionIndex(GroupRequiredMixin,LoginRequiredMixin,FormView):
29    """!
30    Clase que gestiona la vista principal de la participación
31
32    @author Rodrigo Boet (rboet at cenditel.gob.ve)
33    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
34    @date 22-02-2017
35    @version 1.0.0
36    """
37    template_name = "participacion.index.html"
38    form_class = ParticipacionSelectForm
39    group_required = u"Participante"
40   
41    def get_success_url(self):
42        """!
43        Metodo que permite definir la url de dirección al ser válido el formulario
44   
45        @author Rodrigo Boet (rboet at cenditel.gob.ve)
46        @copyright GNU/GPLv2
47        @date 22-02-2017
48        @param self <b>{object}</b> Objeto que instancia la clase
49        @return Retorna la url
50        """
51        consulta = self.request.POST['consultas']
52        return reverse_lazy('participacion_busqueda',
53                            kwargs={'pk': consulta})
54
55
56class ParticipacionSearch(GroupRequiredMixin,LoginRequiredMixin,FormView):
57    """!
58    Clase que gestiona la busqueda para la participación
59
60    @author Rodrigo Boet (rboet at cenditel.gob.ve)
61    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
62    @date 23-02-2017
63    @version 1.0.0
64    """
65    template_name = "participacion.search.html"
66    form_class = ParticipacionSearchForm
67    group_required = u"Participante"
68   
69    def get_success_url(self):
70        """!
71        Metodo que permite definir la url de dirección al ser válido el formulario
72   
73        @author Rodrigo Boet (rboet at cenditel.gob.ve)
74        @copyright GNU/GPLv2
75        @date 23-02-2017
76        @param self <b>{object}</b> Objeto que instancia la clase
77        @return Retorna la url
78        """
79        entes = self.request.POST['entes']
80        return reverse_lazy('participacion_entes', kwargs={'pk': self.kwargs['pk'],'id_ente':entes})
81
82class ParticipacionCreate(GroupRequiredMixin,LoginRequiredMixin,TemplateView):
83    """!
84    Clase que gestiona la vista principal de la participación
85
86    @author Rodrigo Boet (rboet at cenditel.gob.ve)
87    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
88    @date 22-02-2017
89    @version 1.0.0
90    """
91    template_name = "participacion.create.html"
92    group_required = u"Participante"
93   
94    def get_context_data(self, **kwargs):
95        """!
96        Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
97   
98        @author Rodrigo Boet (rboet at cenditel.gob.ve)
99        @copyright GNU/GPLv2
100        @date 23-02-2017
101        @param self <b>{object}</b> Objeto que instancia la clase
102        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
103        @return Retorna los datos de contexto
104        """
105        valores = {}
106        for pregunta in Pregunta.objects.filter(consulta_id=kwargs['pk']).all():
107            label = '<label>'+pregunta.texto_pregunta+'</label>'
108            campo = ''
109            if pregunta.tipo_pregunta.id == 1:
110                campo = ''
111                for opcion in Opcion.objects.filter(pregunta_id=pregunta.id).all():
112                    campo += '<label for="'+kwargs['pk']+'">'+opcion.texto_opcion+'</label><input type="radio" name="consulta_respuesta_radio_'+str(pregunta.id)+'" id="'+kwargs['pk']+'"value="'+str(opcion.id)+'" class="icheck">'
113            elif pregunta.tipo_pregunta.id == 2:
114                campo = ''
115                for opcion in Opcion.objects.filter(pregunta_id=pregunta.id).all():
116                    campo += '<label for="'+kwargs['pk']+'">'+opcion.texto_opcion+'</label><input type="checkbox" name="consulta_respuesta_check_'+kwargs['pk']+'" id="'+kwargs['pk']+'"value="'+str(opcion.id)+'" class="icheck">'
117            elif pregunta.tipo_pregunta.id > 2 and pregunta.tipo_pregunta.id < 5:
118                campo += '<label for="'+kwargs['pk']+'">Si</label><input type="radio" name="consulta_respuesta_sino_'+str(pregunta.id)+'" id="'+kwargs['pk']+'"value="Si" class="icheck">'
119                if(pregunta.tipo_pregunta.id == 3):
120                    campo += '<label for="'+kwargs['pk']+'">No</label><input type="radio" name="consulta_respuesta_sino_'+str(pregunta.id)+'" id="'+kwargs['pk']+'"value="No" class="icheck">'
121                else:
122                    campo += '<label for="'+kwargs['pk']+'">No</label><input type="radio" name="consulta_respuesta_sino_'+str(pregunta.id)+'" id="'+kwargs['pk']+'"value="No" class="icheck need_justification">'
123                    campo += '<div id="div_justificar_'+kwargs['pk']+'" style="display:none;"><label>Justifique su Respuesta</label>'
124                    campo += '<textarea class="form-control" id="respuesta_justificar_'+kwargs['pk']+'" name="consulta_respuesta_justificar_'+str(pregunta.id)+'">'
125                    campo += '</textarea></div>'
126            else:
127                campo = '<textarea class="form-control" name="consulta_respuesta_abierta_'+str(pregunta.id)+'"></textarea>'
128            valores[pregunta.id] = {'label':label,'field':campo}
129            kwargs['preguntas'] = valores
130        return super(ParticipacionCreate, self).get_context_data(**kwargs)
131   
132    def post(self,request,pk,id_ente,ente_adscrito):
133        """!
134        Metodo que sobreescribe el post del formulario
135   
136        @author Rodrigo Boet (rboet at cenditel.gob.ve)
137        @copyright GNU/GPLv2
138        @date 20-03-2017
139        @param self <b>{object}</b> Objeto que instancia la clase
140        @param request <b>{object}</b> Objeto que instancia la petición
141        @param pk <b>{int}</b> Recibe el id de la consulta
142        @param id_ente <b>{int}</b> Recibe el id del ente
143        @return Retorna los datos de contexto
144        """
145        data = dict(request.POST)
146        del data['csrfmiddlewaretoken']
147        if self.request.is_ajax():
148            for key in data.keys():
149                parent_id = key.split("_")[-1]
150                if 'sino' in key:
151                    value = True if data[key][0] == 'Si' else False
152                    justify_id = 'consulta_respuesta_justificar_'+str(parent_id)
153                    self.crear_respuesta_sino(parent_id,value,ente_adscrito,self.request.user.id)
154                    if(not value and justify_id in data.keys()):
155                        respuesta = data[justify_id][0]
156                        self.crear_respuesta_abierta(parent_id,respuesta,ente_adscrito,self.request.user.id,True)
157                elif 'radio' in key or 'check' in key:
158                    for value in data[key]:
159                        self.crear_respuesta_opciones(value,ente_adscrito,self.request.user.id)
160                elif 'abierta' in key:
161                    value = data[key][0]
162                    self.crear_respuesta_abierta(parent_id,value,ente_adscrito,self.request.user.id)
163            return JsonResponse({"code":True})
164        return redirect(reverse_lazy('participacion_busqueda',kwargs={'pk':pk}))
165   
166    def crear_respuesta_sino(self,parent_id,value,ente,user_id):
167        """!
168        Metodo para crear una respuesta de si/no
169   
170        @author Rodrigo Boet (rboet at cenditel.gob.ve)
171        @copyright GNU/GPLv2
172        @date 27-03-2017
173        @param self <b>{object}</b> Objeto que instancia la clase
174        @param parent_id <b>{int}</b> Recibe el número del id del padre
175        @param value <b>{bool}</b> Recibe el valor de la respuesta
176        @param ente <b>{int}</b> Recibe el id del ente
177        @param user_id <b>{int}</b> Recibe el id del user
178        @return Retorna los datos de contexto
179        """
180        user = User.objects.get(id=user_id)
181        parent = Pregunta.objects.get(pk=parent_id)
182        respuesta = RespuestaSino()
183        respuesta.pregunta = parent
184        respuesta.ente_adscrito = ente
185        respuesta.respuesta = value
186        respuesta.user = user
187        respuesta.save()
188       
189    def crear_respuesta_opciones(self,parent_id,ente,user_id):
190        """!
191        Metodo para crear una respuesta de selección simple y múltiple
192   
193        @author Rodrigo Boet (rboet at cenditel.gob.ve)
194        @copyright GNU/GPLv2
195        @date 28-03-2017
196        @param self <b>{object}</b> Objeto que instancia la clase
197        @param parent_id <b>{int}</b> Recibe el número del id del padre
198        @param ente <b>{int}</b> Recibe el id del ente
199        @param user_id <b>{int}</b> Recibe el id del user
200        @return Retorna los datos de contexto
201        """
202        user = User.objects.get(id=user_id)
203        parent = Opcion.objects.get(pk=parent_id)
204        respuesta = RespuestaOpciones()
205        respuesta.opcion = parent
206        respuesta.ente_adscrito = ente
207        respuesta.user = user
208        respuesta.save()
209       
210    def crear_respuesta_abierta(self,parent_id,value,ente,user_id,es_justificacion = False):
211        """!
212        Metodo para crear una respuesta abierta
213   
214        @author Rodrigo Boet (rboet at cenditel.gob.ve)
215        @copyright GNU/GPLv2
216        @date 28-03-2017
217        @param self <b>{object}</b> Objeto que instancia la clase
218        @param parent_id <b>{int}</b> Recibe el número del id del padre
219        @param value <b>{str}</b> Recibe el valor de la respuesta
220        @param ente <b>{int}</b> Recibe el id del ente
221        @param user_id <b>{int}</b> Recibe el id del user
222        @param es_justificacion <b>{bool}</b> Recibe el párametro que indica si es una justifiación
223        @return Retorna los datos de contexto
224        """
225        user = User.objects.get(id=user_id)
226        parent = Pregunta.objects.get(pk=parent_id)
227        respuesta = RespuestaAbierta()
228        respuesta.pregunta = parent
229        respuesta.ente_adscrito = ente
230        respuesta.texto_respuesta = value
231        respuesta.user = user
232        respuesta.es_justificacion = es_justificacion
233        respuesta.save()
234
235
236class ParticipacionEntes(GroupRequiredMixin,LoginRequiredMixin,TemplateView):
237    """!
238    Clase que gestiona la vista de los entes adscritos
239
240    @author Argenis Osorio (aosorio at cenditel.gob.ve)
241    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
242    @date 07-04-2017
243    @version 1.0.0
244    """
245    template_name = "participacion.entes.html"
246    group_required = u"Participante"
247
248    def get_context_data(self, **kwargs):
249        """!
250        Metodo que permite cargar los datos de los entes adscritos
251
252        @author Argenis Osorio (aosorio at cenditel.gob.ve)
253        @copyright GNU/GPLv2
254        @date 07-04-2017
255        @param self <b>{object}</b> Objeto que instancia la clase
256        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
257        @return Retorna los datos de contexto
258        """
259        url = "http://192.168.12.152:8080/services_sipes/entes_planificadores/views/servicios_webs?display_id=page_2&parent="+str(kwargs['id_ente'])
260        url += '&estado=0&municipio=0&parroquia=0&ambito=0&sector=0'
261
262        r = requests.get(url)
263        if not r.status_code == 200:
264            print "ERROR:"
265            return ('', 'ocurrio error...'),
266        data = r.json()
267        kwargs['data'] = data
268        return super(ParticipacionEntes, self).get_context_data(**kwargs)
269
270def validar_participacion(request):
271    """!
272    Función que valida si un usuario ya participó en la consulta con un ente en particular
273
274    @author Rodrigo Boet (rboet at cenditel.gob.ve)
275    @copyright GNU/GPLv2
276    @date 21-04-2017
277    @param request <b>{object}</b> Objeto que contiene la petición
278    @return Retorna un json con la respuesta
279    """
280    if not request.is_ajax():
281        return JsonResponse({'mensaje': False, 'error': str('La solicitud no es ajax')})
282    ente = request.GET.get('ente', None)
283    consulta = request.GET.get('consulta', None)
284    if(ente and consulta):
285        respuesta_sino = RespuestaSino.objects.filter(pregunta__consulta=consulta,ente_adscrito=ente)
286        respuesta_abierta = RespuestaAbierta.objects.filter(pregunta__consulta=consulta,ente_adscrito=ente)
287        respuesta_opciones = RespuestaOpciones.objects.filter(opcion__pregunta__consulta=consulta,ente_adscrito=ente)
288        if(respuesta_sino or respuesta_abierta or respuesta_opciones):
289            return JsonResponse({'mensaje': True,'participacion':True})
290        return JsonResponse({'mensaje': True,'participacion':False})
291    else:
292        return JsonResponse({'mensaje': False, 'error': str('No envío el ente y/o el id de la consulta')})
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.