1 | # -*- coding: utf-8 -*- |
---|
2 | """ |
---|
3 | Sistema de Consulta Pública |
---|
4 | |
---|
5 | Copyleft (@) 2017 CENDITEL nodo Mérida - https://planificacion.cenditel.gob.ve/trac/wiki/ModeladoTopicos_2017 |
---|
6 | """ |
---|
7 | ## @package base.functions |
---|
8 | # |
---|
9 | # Clases genéricas de la 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 |
---|
15 | from __future__ import unicode_literals |
---|
16 | from django.http import HttpResponseServerError |
---|
17 | from django.contrib.auth.models import User |
---|
18 | from consulta.models import Consulta,TipoPregunta, Pregunta |
---|
19 | from participacion.models import RespuestaAbierta |
---|
20 | from procesamiento.models import Procesamiento |
---|
21 | from consulta_publica.settings import PROCESAMIENTO_PATH |
---|
22 | from .models import Entidad, Municipio, Parroquia |
---|
23 | from users.models import Perfil |
---|
24 | import requests |
---|
25 | import copy |
---|
26 | import os |
---|
27 | import shutil |
---|
28 | |
---|
29 | def cargar_tipo_pregunta(): |
---|
30 | """! |
---|
31 | Función que permite cargar los tipos de preguntas que existen |
---|
32 | |
---|
33 | @author Rodrigo Boet (rboet at cenditel.gob.ve) |
---|
34 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
35 | @date 15-02-2017 |
---|
36 | @return Devuelve una tupla con los tipos de pregunta |
---|
37 | """ |
---|
38 | |
---|
39 | lista = ('', 'Seleccione...'), |
---|
40 | |
---|
41 | try: |
---|
42 | for tipo_pregunta in TipoPregunta.objects.all(): |
---|
43 | lista += (tipo_pregunta.id, tipo_pregunta.tipo), |
---|
44 | except Exception as e: |
---|
45 | pass |
---|
46 | |
---|
47 | return lista |
---|
48 | |
---|
49 | def cargar_consulta(): |
---|
50 | """! |
---|
51 | Función que permite cargar las 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 22-02-2017 |
---|
56 | @return Devuelve una tupla con las consultas |
---|
57 | """ |
---|
58 | |
---|
59 | lista = ('', 'Seleccione...'), |
---|
60 | |
---|
61 | try: |
---|
62 | for consulta in Consulta.objects.filter(activa=True).all(): |
---|
63 | lista += (consulta.id, consulta.nombre_consulta), |
---|
64 | except Exception as e: |
---|
65 | pass |
---|
66 | |
---|
67 | return lista |
---|
68 | |
---|
69 | |
---|
70 | def cargar_ministerios(): |
---|
71 | """! |
---|
72 | Función que permite cargar los ministerios |
---|
73 | |
---|
74 | @author Antonio Araujo (aaraujo at cenditel.gob.ve) |
---|
75 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
76 | @date 15-03-2017 |
---|
77 | @return Devuelve una tupla con los ministerios |
---|
78 | """ |
---|
79 | |
---|
80 | # TODO: especificar la URL del servicio a traves de una configuracion y gestion |
---|
81 | # de error en solicitud http |
---|
82 | url = 'http://192.168.12.152:8080/services_sipes/entes_planificadores/views/servicios_webs?display_id=page_1' |
---|
83 | r = requests.get(url) |
---|
84 | |
---|
85 | if not r.status_code == 200: |
---|
86 | print "ERROR:" |
---|
87 | return ('', 'ocurrio error...'), |
---|
88 | |
---|
89 | data = r.json() |
---|
90 | # tupla de entes |
---|
91 | tuplaNameEntity = ('', 'Ministerios '), |
---|
92 | uniqueEntities = [] |
---|
93 | nidEntities = [] |
---|
94 | |
---|
95 | for dicc in data: |
---|
96 | tmpEntity = dicc['name_ente'] |
---|
97 | tmpNidEntity = dicc['nid'] |
---|
98 | if tmpEntity.startswith('Ministerio') and tmpEntity not in uniqueEntities: |
---|
99 | uniqueEntities.append(tmpEntity) |
---|
100 | nidEntities.append(tmpNidEntity) |
---|
101 | else: |
---|
102 | continue |
---|
103 | |
---|
104 | for i in range(0, len(uniqueEntities)) : |
---|
105 | tuplaNameEntity += (nidEntities[i], uniqueEntities[i]), |
---|
106 | |
---|
107 | return tuplaNameEntity |
---|
108 | |
---|
109 | |
---|
110 | def cargar_vicepresidencias(): |
---|
111 | """! |
---|
112 | Función que permite cargar las vicepresidencias |
---|
113 | |
---|
114 | @author Antonio Araujo (aaraujo at cenditel.gob.ve) |
---|
115 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
116 | @date 15-03-2017 |
---|
117 | @return Devuelve una tupla con las vicepresidencias |
---|
118 | """ |
---|
119 | |
---|
120 | # TODO: especificar la URL del servicio a traves de una configuracion y gestion |
---|
121 | # de error en solicitud http |
---|
122 | url = 'http://192.168.12.152:8080/services_sipes/entes_planificadores/views/servicios_webs?display_id=page_1' |
---|
123 | r = requests.get(url) |
---|
124 | if not r.status_code == 200: |
---|
125 | print "ERROR:" |
---|
126 | return ('', 'ocurrio error...'), |
---|
127 | |
---|
128 | data = r.json() |
---|
129 | |
---|
130 | # tupla de sectores |
---|
131 | tuplaSector = ('', 'Vicepresidencias'), |
---|
132 | uniqueSectors = [] |
---|
133 | nidEntities = [] |
---|
134 | |
---|
135 | for dicc in data: |
---|
136 | tmpSector = dicc['sector'] |
---|
137 | tmpNidEntity = dicc['nid'] |
---|
138 | if tmpSector.startswith('Vicepresidencia') and tmpSector not in uniqueSectors: |
---|
139 | uniqueSectors.append(tmpSector) |
---|
140 | nidEntities.append(tmpNidEntity) |
---|
141 | else: |
---|
142 | continue |
---|
143 | |
---|
144 | for i in range(0, len(uniqueSectors)) : |
---|
145 | tuplaSector += (nidEntities[i], uniqueSectors[i]), |
---|
146 | |
---|
147 | return tuplaSector |
---|
148 | |
---|
149 | |
---|
150 | def cargar_ambitos(): |
---|
151 | """! |
---|
152 | Función que permite cargar los ambitos |
---|
153 | |
---|
154 | @author Antonio Araujo (aaraujo at cenditel.gob.ve) |
---|
155 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
156 | @date 22-03-2017 |
---|
157 | @return Devuelve una tupla con los ambitos |
---|
158 | """ |
---|
159 | |
---|
160 | # TODO: especificar la URL del servicio a traves de una configuracion y gestion |
---|
161 | # de error en solicitud http |
---|
162 | url = 'http://192.168.12.152:8080/services_sipes/entes_planificadores/views/lista_ambitos_y_sectores?display_id=ambitos' |
---|
163 | r = requests.get(url) |
---|
164 | if not r.status_code == 200: |
---|
165 | print "ERROR:" |
---|
166 | return ('', 'ocurrio error...'), |
---|
167 | |
---|
168 | data = r.json() |
---|
169 | |
---|
170 | tuplaScope = ('', 'Seleccione...'), |
---|
171 | |
---|
172 | for dicc in data: |
---|
173 | if dicc['parent_id'] == '0' : |
---|
174 | tuplaScope += (dicc['id'], dicc['nombre']), |
---|
175 | |
---|
176 | return tuplaScope |
---|
177 | |
---|
178 | def cargar_sectores(): |
---|
179 | """! |
---|
180 | Función que permite cargar los sectores |
---|
181 | |
---|
182 | @author Antonio Araujo (aaraujo at cenditel.gob.ve) |
---|
183 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
184 | @date 22-03-2017 |
---|
185 | @return Devuelve una tupla con los ambitos |
---|
186 | """ |
---|
187 | |
---|
188 | # TODO: especificar la URL del servicio a traves de una configuracion y gestion |
---|
189 | # de error en solicitud http |
---|
190 | url = 'http://192.168.12.152:8080/services_sipes/entes_planificadores/views/lista_ambitos_y_sectores?display_id=ambitos' |
---|
191 | r = requests.get(url) |
---|
192 | if not r.status_code == 200: |
---|
193 | print "ERROR:" |
---|
194 | return ('', 'ocurrio error...'), |
---|
195 | |
---|
196 | data = r.json() |
---|
197 | tuplaSector = ('', 'Seleccione...'), |
---|
198 | |
---|
199 | for dicc in data: |
---|
200 | if dicc['parent_id'] != '0' : |
---|
201 | tuplaSector += (dicc['parent_id'], dicc['nombre']), |
---|
202 | return tuplaSector |
---|
203 | |
---|
204 | def cargar_procesamiento(pk=None): |
---|
205 | """! |
---|
206 | Función que permite cargar los procesamientos |
---|
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 28-03-2017 |
---|
211 | @return Devuelve una tupla con los perfiles de procesamiento |
---|
212 | """ |
---|
213 | |
---|
214 | lista = ('', 'Seleccione...'), |
---|
215 | |
---|
216 | Pro = Procesamiento.objects.filter(consulta_id=pk) if pk else Procesamiento.objects |
---|
217 | try: |
---|
218 | for procesamiento in Pro.all(): |
---|
219 | lista += (procesamiento.id, procesamiento.procesamiento_dir), |
---|
220 | except Exception as e: |
---|
221 | pass |
---|
222 | |
---|
223 | return lista |
---|
224 | |
---|
225 | |
---|
226 | def dump_exception(): |
---|
227 | """! |
---|
228 | Función para captar los errores e imprimirlos |
---|
229 | |
---|
230 | @author Jorge Redondo (jredondo at cenditel.gob.ve) |
---|
231 | @copyright GNU/GPLv2 |
---|
232 | @param request <b>{object}</b> Objeto que mantiene la peticion |
---|
233 | @return Retorna una respuesta http con el error |
---|
234 | """ |
---|
235 | import sys,traceback |
---|
236 | exc_type, exc_value, exc_traceback = sys.exc_info() |
---|
237 | print "*** print_tb:" |
---|
238 | traceback.print_tb(exc_traceback, limit=1, file=sys.stdout) |
---|
239 | print "*** print_exception:" |
---|
240 | traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout) |
---|
241 | return HttpResponseServerError(str(exc_value)) |
---|
242 | |
---|
243 | |
---|
244 | |
---|
245 | def createPreprocessingFiles(id): |
---|
246 | """! |
---|
247 | Crea los archivos necesarios del preprocesamiento a partir de las respuestas |
---|
248 | abiertas de una consulta. |
---|
249 | |
---|
250 | La función creará el directorio consulta_publica/static/procesamiento_files/nombre_consulta/orig |
---|
251 | con un conjunto de archivos de texto que representan cada una de las repuestas |
---|
252 | abiertas de la consulta. Por ejemplo: |
---|
253 | . |
---|
254 | miconsulta |
---|
255 | |---orig |
---|
256 | |--- respuesta_5.txt |
---|
257 | |--- respuesta_6.txt |
---|
258 | |
---|
259 | En caso de existir el directorio al momento de ejecutarse esta función será |
---|
260 | borrado. |
---|
261 | |
---|
262 | @author Antonio Araujo (aaraujo at cenditel.gob.ve) |
---|
263 | @copyright GNU/GPLv2 |
---|
264 | @param id Identificador de la consulta para obtener respuestas abiertas |
---|
265 | """ |
---|
266 | |
---|
267 | try: |
---|
268 | # obtener la consulta con id pasado como argumento |
---|
269 | consulta = Consulta.objects.get(id=id) |
---|
270 | |
---|
271 | ## Se crea un nombre sin espacios en blanco |
---|
272 | nombre = "_".join(consulta.nombre_consulta.split(" ")) |
---|
273 | |
---|
274 | # crear un directorio con el nombre de la consulta en consulta_publica/static/procesamiento_files/ |
---|
275 | processingDirectory = PROCESAMIENTO_PATH + '/' + nombre + '/orig' |
---|
276 | |
---|
277 | # borrar directorio en el caso de existir |
---|
278 | if os.path.isdir(processingDirectory) : |
---|
279 | shutil.rmtree(processingDirectory) |
---|
280 | os.makedirs(processingDirectory) |
---|
281 | |
---|
282 | # obtener las preguntas |
---|
283 | for pregunta in Pregunta.objects.filter(consulta_id=consulta.id).all() : |
---|
284 | if pregunta.tipo_pregunta_id==5 : |
---|
285 | # ubicar la respuesta |
---|
286 | for respuesta in RespuestaAbierta.objects.filter(pregunta_id=pregunta.id).all(): |
---|
287 | # escribir archivo a disco |
---|
288 | filePath = processingDirectory + '/' + 'respuesta_' + str(respuesta.id)+".txt" |
---|
289 | fo = open(filePath, "w") |
---|
290 | fo.write(respuesta.texto_respuesta.encode('utf8')); |
---|
291 | fo.close() |
---|
292 | |
---|
293 | return True |
---|
294 | |
---|
295 | except Exception as e: |
---|
296 | print "La consulta con identificado "+ str(id) + " no existe" |
---|
297 | print e |
---|
298 | return False |
---|
299 | pass |
---|
300 | |
---|
301 | def validate_dir(pk): |
---|
302 | """! |
---|
303 | Función que permite cargar las consultas con directorios creados |
---|
304 | |
---|
305 | @author Rodrigo Boet (rboet at cenditel.gob.ve) |
---|
306 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
307 | @date 17-04-2017 |
---|
308 | @param pk {int} Recibe id de la consulta |
---|
309 | @return Devuelve una tupla con las consultas que tienen directorios |
---|
310 | """ |
---|
311 | |
---|
312 | consulta = Consulta.objects.filter(pk=pk) |
---|
313 | if consulta: |
---|
314 | consulta = consulta.get() |
---|
315 | nombre = "_".join(consulta.nombre_consulta.split(" ")) |
---|
316 | consulta_dir = PROCESAMIENTO_PATH+"/"+nombre |
---|
317 | if os.path.exists(consulta_dir): |
---|
318 | return True |
---|
319 | return False |
---|
320 | else: |
---|
321 | return False |
---|
322 | |
---|
323 | def cargar_entidad(): |
---|
324 | """! |
---|
325 | Función que permite cargar todas las entidades |
---|
326 | |
---|
327 | @author Rodrigo Boet (rboet at cenditel.gob.ve) |
---|
328 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
329 | @date 20-04-2017 |
---|
330 | @return Devuelve una tupla con las entidades |
---|
331 | """ |
---|
332 | |
---|
333 | lista = ('', 'Seleccione...'), |
---|
334 | |
---|
335 | try: |
---|
336 | for entidad in Entidad.objects.all(): |
---|
337 | lista += (entidad.codigo, entidad.nombre), |
---|
338 | except Exception as e: |
---|
339 | pass |
---|
340 | |
---|
341 | return lista |
---|
342 | |
---|
343 | |
---|
344 | def cargar_municipios(): |
---|
345 | """! |
---|
346 | Función que permite cargar todas los municipios |
---|
347 | |
---|
348 | @author Rodrigo Boet (rboet at cenditel.gob.ve) |
---|
349 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
350 | @date 20-04-2017 |
---|
351 | @return Devuelve una tupla con los municipios |
---|
352 | """ |
---|
353 | |
---|
354 | lista = ('', 'Seleccione...'), |
---|
355 | |
---|
356 | try: |
---|
357 | for municipio in Municipio.objects.all(): |
---|
358 | lista += (municipio.codigo, municipio.nombre), |
---|
359 | except Exception as e: |
---|
360 | pass |
---|
361 | |
---|
362 | return lista |
---|
363 | |
---|
364 | |
---|
365 | def cargar_parroquias(): |
---|
366 | """! |
---|
367 | Función que permite cargar todas las parroquias |
---|
368 | |
---|
369 | @author Rodrigo Boet (rboet at cenditel.gob.ve) |
---|
370 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
371 | @date 20-04-2017 |
---|
372 | @return Devuelve una tupla con las parroquias |
---|
373 | """ |
---|
374 | |
---|
375 | lista = ('', 'Seleccione...'), |
---|
376 | |
---|
377 | try: |
---|
378 | for parroquia in Parroquia.objects.all(): |
---|
379 | lista += (parroquia.codigo, parroquia.nombre), |
---|
380 | except Exception as e: |
---|
381 | pass |
---|
382 | |
---|
383 | return lista |
---|
384 | |
---|
385 | |
---|
386 | def validate_cedula(cedula): |
---|
387 | """! |
---|
388 | Función que permite validar la cedula |
---|
389 | |
---|
390 | @author Rodrigo Boet (rboet at cenditel.gob.ve) |
---|
391 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
392 | @date 20-04-2017 |
---|
393 | @param cedula {str} Recibe el número de cédula |
---|
394 | @return Devuelve verdadero o falso |
---|
395 | """ |
---|
396 | |
---|
397 | cedula = Perfil.objects.filter(cedula=cedula) |
---|
398 | if cedula: |
---|
399 | return True |
---|
400 | else: |
---|
401 | return False |
---|
402 | |
---|
403 | def validate_email(email): |
---|
404 | """! |
---|
405 | Función que permite validar la cedula |
---|
406 | |
---|
407 | @author Rodrigo Boet (rboet at cenditel.gob.ve) |
---|
408 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
409 | @date 20-04-2017 |
---|
410 | @param cedula {str} Recibe el número de cédula |
---|
411 | @return Devuelve verdadero o falso |
---|
412 | """ |
---|
413 | |
---|
414 | email = User.objects.filter(email=email) |
---|
415 | if email: |
---|
416 | return True |
---|
417 | else: |
---|
418 | return False |
---|