views.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. # -*- coding: utf-8 -*-
  2. from django.shortcuts import render
  3. from django.http import (HttpResponse, HttpResponseServerError,
  4. HttpResponseNotFound, HttpResponseRedirect)
  5. from django.template.response import TemplateResponse
  6. from django.core.exceptions import ObjectDoesNotExist
  7. from django.contrib.auth.models import User
  8. #from mezzanine.core.models import RichText
  9. from mezzanine.pages.models import RichTextPage
  10. from mezzanine.pages.models import Page
  11. from encuesta.models import Puntaje_Encuesta, Puntaje_Punto
  12. from encuesta.utils import ObtenerEvaluaciones, ExisteEvaluacion, ObtenerEvaluacion
  13. from encuesta.utils import IdUsuarioRequest, UsuarioRequest
  14. from encuesta.utils import PuntuacionTotal, NumEvaluaciones
  15. from encuesta.utils import OrdenarPuntos
  16. # para generacion de pdfs
  17. from reportlab.pdfgen import canvas
  18. from django.http import HttpResponse
  19. def DimensionDisplay(request, dimension):
  20. ''' Pagina que muestra la encuesta de la dimension dada
  21. '''
  22. if dimension == "r":
  23. return HttpResponseRedirect('/estadisticas_encuesta/')
  24. pages = Page.objects.filter(title__startswith="p_"+dimension)
  25. richTextPages = []
  26. paginas = []
  27. user = UsuarioRequest(request)
  28. user_id = IdUsuarioRequest(request)
  29. for page in pages:
  30. content = RichTextPage.objects.get(id=int(page.id)).content
  31. # busca puntuacion si existe
  32. puntuacion = ObtenerEvaluacion(user_id, punto=page.title[2:])
  33. puntaje = 0
  34. if puntuacion is not None:
  35. puntaje = puntuacion.puntuacion
  36. paginas.append({"titulo": page.title,
  37. "contenido": content,
  38. "puntaje": puntaje,
  39. "id_pagina": page.id})
  40. return TemplateResponse(request, "pages/encuesta_d"+dimension+".html",
  41. {"paginas": paginas } )
  42. def Dim1Display(request):
  43. ''' Pagina de la encuesta de la dimension 1 de la encuesta
  44. '''
  45. pages = Page.objects.filter(title__startswith="p_1")
  46. richTextPages = []
  47. paginas = []
  48. user = UsuarioRequest(request)
  49. user_id = IdUsuarioRequest(request)
  50. for page in pages:
  51. content = RichTextPage.objects.get(id=int(page.id)).content
  52. # busca puntuacion si existe
  53. puntuacion = ObtenerEvaluacion(user_id, punto=page.title[2:])
  54. puntaje = 0
  55. if puntuacion is not None:
  56. puntaje = puntuacion.puntuacion
  57. paginas.append({"titulo": page.title,
  58. "contenido": content,
  59. "puntaje": puntaje})
  60. return TemplateResponse(request, "pages/encuesta_d1.html",
  61. {"paginas": paginas } )
  62. def Evaluacion(request, dimension_encuesta):
  63. ''' Procesa en envio de una evaluacion de la encuesta
  64. de acreditacion
  65. '''
  66. id_usuario = -1
  67. try:
  68. id_usuario = request.user.id
  69. if id_usuario is None:
  70. id_usuario = 0
  71. except ObjectDoesNotExist:
  72. id_usuario = -1
  73. if id_usuario == 0: # usuario anonimo
  74. #TODO: Retornar enlace a login
  75. return HttpResponse('usuario Anonimo, por favor ingrese <a href="/accounts/login">con su cuenta de usuario</a>')
  76. user = User.objects.get(id=id_usuario)
  77. for punto, puntuacion in request.POST.items():
  78. Puntuacion = ObtenerEvaluacion(id_usuario,\
  79. punto=str(punto))
  80. # creando nuevo registro, este caso de da cuando
  81. # se ha agregado un punto a la encuesta.
  82. if Puntuacion is None:
  83. # filtrando primero valores en el request que tengan que ver con
  84. # la puntuacion, para excluir por ejemplo valores como el
  85. # token csrf
  86. if punto != 'csrfmiddlewaretoken':
  87. P = Puntaje_Encuesta()
  88. P.user = user
  89. P.punto = str(punto)
  90. P.puntuacion = int(str(puntuacion))
  91. P.save()
  92. else:
  93. # modificando registro existente
  94. Puntuacion.puntuacion = int(str(puntuacion))
  95. Puntuacion.save()
  96. # agregando/modificando registro de puntaje para resultados de la encuesta
  97. try:
  98. Puntaje = Puntaje_Punto.objects.get(punto=str(punto))
  99. Puntaje.actualizar(int(str(puntuacion)))
  100. Puntaje.save()
  101. #print ("actualizado puntaje:"+str(Puntaje))
  102. except ObjectDoesNotExist:
  103. # caso raro cuando se ha recibido un punto que no existia
  104. '''Puntaje = Puntaje_Punto()
  105. Puntaje.punto = str(punto)
  106. Puntaje.actualizar(int(str(puntuacion)))
  107. Puntaje.save()'''
  108. # en este caso no se hace nada ya que se supone que antes
  109. # se han creado registros para cada punto.
  110. pass
  111. #TODO: retornar Template
  112. #return TemplateResponse(request, "pages/encuesta_d"+dimension_encuesta+"1.html"
  113. #{})
  114. #return DimensionDisplay(request, dimension_encuesta)
  115. # retornando template referente a la dimension siguiente de la encuesta
  116. dim_siguiente = ""
  117. if dimension_encuesta == "1":
  118. dim_siguiente = "2"
  119. if dimension_encuesta == "2":
  120. dim_siguiente = "3"
  121. if dimension_encuesta == "3":
  122. dim_siguiente = "4"
  123. if dimension_encuesta == "4":
  124. dim_siguiente = "r"
  125. return DimensionDisplay(request, dim_siguiente)
  126. def EstadisticaEncuesta(request):
  127. ''' De la tabla puntaje_encuesta obtiene algunas estadisticas de las
  128. respuestas hechas, retorna ademas el template para que se renderize
  129. los resultados de las encuestas por cada punto y dimension.
  130. '''
  131. puntos = []
  132. puntajes_d1 = []
  133. puntajes_d2 = []
  134. puntajes_d3 = []
  135. puntajes_d4 = []
  136. Puntajes = Puntaje_Punto.objects.all()
  137. for P in Puntajes:
  138. if P.punto[0] == "1":
  139. puntajes_d1.append(
  140. {"punto": P.punto,
  141. "total": P.sumatoria,
  142. "num_evaluaciones": P.valoraciones,
  143. "porcentaje" : (P.promedio*100)/5,
  144. "promedio" : P.promedio
  145. }
  146. )
  147. if P.punto[0] == "2":
  148. puntajes_d2.append(
  149. {"punto": P.punto,
  150. "total": P.sumatoria,
  151. "num_evaluaciones": P.valoraciones,
  152. "porcentaje" : (P.promedio*100)/5,
  153. "promedio" : P.promedio
  154. }
  155. )
  156. if P.punto[0] == "3":
  157. puntajes_d3.append(
  158. {"punto": P.punto,
  159. "total": P.sumatoria,
  160. "num_evaluaciones": P.valoraciones,
  161. "porcentaje" : (P.promedio*100)/5,
  162. "promedio" : P.promedio
  163. }
  164. )
  165. if P.punto[0] == "4":
  166. puntajes_d4.append(
  167. {"punto": P.punto,
  168. "total": P.sumatoria,
  169. "num_evaluaciones": P.valoraciones,
  170. "porcentaje" : (P.promedio*100)/5,
  171. "promedio" : P.promedio
  172. }
  173. )
  174. # return ReporteComoPdf("pages/estadistica_encuesta.html",
  175. # {
  176. # "pagesize" : "A4",
  177. # "puntajes_d1": OrdenarPuntos(puntajes_d1),
  178. # "puntajes_d2": OrdenarPuntos(puntajes_d2),
  179. # "puntajes_d3": OrdenarPuntos(puntajes_d3),
  180. # "puntajes_d4": OrdenarPuntos(puntajes_d4),
  181. # })
  182. return TemplateResponse(request, "pages/estadistica_encuesta.html",
  183. {"puntajes_d1": OrdenarPuntos(puntajes_d1),
  184. "puntajes_d2": OrdenarPuntos(puntajes_d2),
  185. "puntajes_d3": OrdenarPuntos(puntajes_d3),
  186. "puntajes_d4": OrdenarPuntos(puntajes_d4),
  187. })
  188. def ReportePdf(request):
  189. ''' Renderiza un pdf con el reporte basico de la encuesta
  190. de acreditacion
  191. '''
  192. # preparando los datos
  193. puntos = []
  194. puntajes_d1 = []
  195. puntajes_d2 = []
  196. puntajes_d3 = []
  197. puntajes_d4 = []
  198. Puntajes = Puntaje_Punto.objects.all()
  199. for P in Puntajes:
  200. if P.punto[0] == "1":
  201. puntajes_d1.append(
  202. {"punto": P.punto,
  203. "total": P.sumatoria,
  204. "num_evaluaciones": P.valoraciones,
  205. "porcentaje" : (P.promedio*100)/5,
  206. "promedio" : P.promedio
  207. }
  208. )
  209. if P.punto[0] == "2":
  210. puntajes_d2.append(
  211. {"punto": P.punto,
  212. "total": P.sumatoria,
  213. "num_evaluaciones": P.valoraciones,
  214. "porcentaje" : (P.promedio*100)/5,
  215. "promedio" : P.promedio
  216. }
  217. )
  218. if P.punto[0] == "3":
  219. puntajes_d3.append(
  220. {"punto": P.punto,
  221. "total": P.sumatoria,
  222. "num_evaluaciones": P.valoraciones,
  223. "porcentaje" : (P.promedio*100)/5,
  224. "promedio" : P.promedio
  225. }
  226. )
  227. if P.punto[0] == "4":
  228. puntajes_d4.append(
  229. {"punto": P.punto,
  230. "total": P.sumatoria,
  231. "num_evaluaciones": P.valoraciones,
  232. "porcentaje" : (P.promedio*100)/5,
  233. "promedio" : P.promedio
  234. }
  235. )
  236. OrdenarPuntos(puntajes_d1)
  237. OrdenarPuntos(puntajes_d2)
  238. OrdenarPuntos(puntajes_d3)
  239. OrdenarPuntos(puntajes_d4)
  240. # Create the HttpResponse object with the appropriate PDF headers.
  241. response = HttpResponse(content_type='application/pdf')
  242. response['Content-Disposition'] = 'attachment; filename="reporte-acreditacion.pdf"'
  243. # Create the PDF object, using the response object as its "file."
  244. p = canvas.Canvas(response)
  245. p.drawString(100, 800, "Reporte - RESULTADOS DE LA ENCUESTA DE ACREDITACIÓN (MERCOSUR) ")
  246. p.drawString(100, 780, "INGENIERÍA INDUSTRIAL UMSA")
  247. p.drawString(100, 760, "_______________________________________________________________")
  248. # dimension 1
  249. p.drawString(100, 740, "DIMENSIÓN 1")
  250. p.drawString(70, 720, "Punto")
  251. p.drawString(140, 720, "Número de Valoraciones")
  252. p.drawString(300, 720, "Porcentaje de aceptación (%)")
  253. c = 0
  254. prom_porcentaje = 0
  255. for d1 in OrdenarPuntos(puntajes_d1):
  256. c += 1
  257. p.drawString(70, 720 - (c*15), str(d1['punto']))
  258. p.drawString(140,720 - (c*15), str(d1['num_evaluaciones']))
  259. p.drawString(300, 720 - (c*15), str(d1['porcentaje'])[0:4])
  260. prom_porcentaje += d1['porcentaje']
  261. prom_porcentaje /= len(puntajes_d1)
  262. p.drawString(300, 740, "Promedio aceptación: "+ str(prom_porcentaje)[0:4] +\
  263. " %")
  264. p.showPage() # termina la pagina actual
  265. # dimension 2
  266. p.drawString(100, 740, "DIMENSIÓN 2")
  267. p.drawString(70, 720, "Punto")
  268. p.drawString(140, 720, "Número de Valoraciones")
  269. p.drawString(300, 720, "Porcentaje de aceptación (%)")
  270. c = 0
  271. prom_porcentaje = 0
  272. for d2 in OrdenarPuntos(puntajes_d2):
  273. c += 1
  274. if c*15 >= 650:
  275. # nueva pagina
  276. p.showPage()
  277. p.drawString(100, 740, "DIMENSIÓN 2")
  278. p.drawString(70, 720, "Punto")
  279. p.drawString(140, 720, "Número de Valoraciones")
  280. p.drawString(300, 720, "Porcentaje de aceptación (%)")
  281. c = 1
  282. p.drawString(70, 720 - (c*15), str(d2['punto']))
  283. p.drawString(140,720 - (c*15), str(d2['num_evaluaciones']))
  284. p.drawString(300, 720 - (c*15), str(d2['porcentaje'])[0:4])
  285. prom_porcentaje += d2['porcentaje']
  286. prom_porcentaje /= len(puntajes_d2)
  287. p.drawString(300, 740, "Promedio aceptación: "+ str(prom_porcentaje)[0:4] +\
  288. " %")
  289. p.showPage() # termina pagina actual
  290. # dimension 3
  291. p.drawString(100, 740, "DIMENSIÓN 3")
  292. p.drawString(70, 720, "Punto")
  293. p.drawString(140, 720, "Número de Valoraciones")
  294. p.drawString(300, 720, "Porcentaje de aceptación (%)")
  295. c = 0
  296. prom_porcentaje = 0
  297. for d3 in OrdenarPuntos(puntajes_d3):
  298. c += 1
  299. if c*15 >= 650:
  300. # nueva pagina
  301. p.showPage()
  302. p.drawString(100, 740, "DIMENSIÓN 3")
  303. p.drawString(70, 720, "Punto")
  304. p.drawString(140, 720, "Número de Valoraciones")
  305. p.drawString(300, 720, "Porcentaje de aceptación (%)")
  306. c = 1
  307. p.drawString(70, 720 - (c*15), str(d3['punto']))
  308. p.drawString(140,720 - (c*15), str(d3['num_evaluaciones']))
  309. p.drawString(300, 720 - (c*15), str(d3['porcentaje'])[0:4])
  310. prom_porcentaje += d3['porcentaje']
  311. prom_porcentaje /= len(puntajes_d3)
  312. p.drawString(300, 740, "Promedio aceptación: "+ str(prom_porcentaje)[0:4] +\
  313. " %")
  314. p.showPage() # termina pagina actual
  315. # dimension 4
  316. p.drawString(100, 740, "DIMENSIÓN 4")
  317. p.drawString(70, 720, "Punto")
  318. p.drawString(140, 720, "Número de Valoraciones")
  319. p.drawString(300, 720, "Porcentaje de aceptación (%)")
  320. c = 0
  321. prom_porcentaje = 0
  322. for d4 in OrdenarPuntos(puntajes_d4):
  323. c += 1
  324. if c*15 >= 650:
  325. # nueva pagina
  326. p.showPage()
  327. p.drawString(100, 740, "DIMENSIÓN 4")
  328. p.drawString(70, 720, "Punto")
  329. p.drawString(140, 720, "Número de Valoraciones")
  330. p.drawString(300, 720, "Porcentaje de aceptación (%)")
  331. c = 1
  332. p.drawString(70, 720 - (c*15), str(d4['punto']))
  333. p.drawString(140,720 - (c*15), str(d4['num_evaluaciones']))
  334. p.drawString(300, 720 - (c*15), str(d4['porcentaje'])[0:4])
  335. prom_porcentaje += d4['porcentaje']
  336. prom_porcentaje /= len(puntajes_d4)
  337. p.drawString(300, 740, "Promedio aceptación: "+ str(prom_porcentaje)[0:4] +\
  338. " %")
  339. p.showPage() # termina pagina actual
  340. # Close the PDF object cleanly, and we're done.
  341. p.save()
  342. return response
  343. # la siguiente funcion esta solo de muestra no se utiliza realmente aqui
  344. def page(request, slug, template=u"pages/page.html", extra_context=None):
  345. """
  346. Select a template for a page and render it. The request
  347. object should have a ``page`` attribute that's added via
  348. ``mezzanine.pages.middleware.PageMiddleware``. The page is loaded
  349. earlier via middleware to perform various other functions.
  350. The urlpattern that maps to this view is a catch-all pattern, in
  351. which case the page attribute won't exist, so raise a 404 then.
  352. For template selection, a list of possible templates is built up
  353. based on the current page. This list is order from most granular
  354. match, starting with a custom template for the exact page, then
  355. adding templates based on the page's parent page, that could be
  356. used for sections of a site (eg all children of the parent).
  357. Finally at the broadest level, a template for the page's content
  358. type (it's model class) is checked for, and then if none of these
  359. templates match, the default pages/page.html is used.
  360. """
  361. from mezzanine.pages.middleware import PageMiddleware
  362. if not PageMiddleware.installed():
  363. raise ImproperlyConfigured("mezzanine.pages.middleware.PageMiddleware "
  364. "(or a subclass of it) is missing from " +
  365. "settings.MIDDLEWARE_CLASSES or " +
  366. "settings.MIDDLEWARE")
  367. if not hasattr(request, "page") or request.page.slug != slug:
  368. raise Http404
  369. # Check for a template name matching the page's slug. If the homepage
  370. # is configured as a page instance, the template "pages/index.html" is
  371. # used, since the slug "/" won't match a template name.
  372. template_name = str(slug) if slug != home_slug() else "index"
  373. templates = [u"pages/%s.html" % template_name]
  374. method_template = request.page.get_content_model().get_template_name()
  375. if method_template:
  376. templates.insert(0, method_template)
  377. if request.page.content_model is not None:
  378. templates.append(u"pages/%s/%s.html" % (template_name,
  379. request.page.content_model))
  380. for parent in request.page.get_ascendants(for_user=request.user):
  381. parent_template_name = str(parent.slug)
  382. # Check for a template matching the page's content model.
  383. if request.page.content_model is not None:
  384. templates.append(u"pages/%s/%s.html" % (parent_template_name,
  385. request.page.content_model))
  386. # Check for a template matching the page's content model.
  387. if request.page.content_model is not None:
  388. templates.append(u"pages/%s.html" % request.page.content_model)
  389. templates.append(template)
  390. return TemplateResponse(request, templates, extra_context or {})
  391. ##### Funciones extra de utilidad #########
  392. import csv
  393. import datetime
  394. import io
  395. def Comprobar_bd_ciru(request):
  396. ''' a partir del archivo datos.csv comprueba que existan usuarios
  397. y si no existe los crea
  398. El orden del csv esperado es:
  399. id_estudiante;ci;ru;nombre;paterno;materno
  400. 1;9170943;1680926;CRISTIAN ISAAC;AÑAMORO;ALVAREZ
  401. 2;10015481;1714266;JHESSICA JHANET;AGUILAR;CONDORI
  402. 3;8422342;1673676;MARISOL;ACHO;SARZURI
  403. 4;9214862;1679075;SHIRLEY PAMELA;ACHO;YUJRA
  404. '''
  405. archivo_csv = "encuesta/datos.csv"
  406. contenido_csv = []
  407. # lectura de archivo y parseado segun csv y utf-8
  408. # solucion extraida de https://stackoverflow.com/questions/17245415/read-and-write-csv-files-including-unicode-with-python-2-7#17246997
  409. with open(archivo_csv,'r') as fin:
  410. reader=csv.reader(fin)
  411. for row in reader:
  412. temp=list(row)
  413. #fmt=u'{:<15}'*len(temp)
  414. #print fmt.format(*[s.decode('utf-8') for s in temp])
  415. temp1=[]
  416. for s in temp:
  417. temp1.append(s.decode('utf-8'))
  418. contenido_csv.append(temp1)
  419. contenido_csv = contenido_csv[1:] # ignorando primera fila
  420. # insertando cada fila
  421. for c in contenido_csv:
  422. # buscando que el usuario no exista
  423. try:
  424. user = User.objects.get(username=c[1])
  425. print ("username: "+c[1]+" ya existe")
  426. except ObjectDoesNotExist:
  427. # agregando nuevo usuario
  428. user = User()
  429. user.username=c[1] # ci
  430. user.set_password(c[2]) # ru
  431. user.first_name=c[3] # nombres
  432. user.last_name =c[4] + " " + c[5] # apellidos
  433. user.is_staff = False
  434. user.save()
  435. print ("regsitro agregado:"+str(user))
  436. # for s in c:
  437. # print s
  438. print ("==")
  439. # for l in contenido_csv:
  440. # print (str(l))
  441. st = '<head><meta http-equiv="Content-type" content="text/html; charset=utf-8"></head>'
  442. return HttpResponse(st+str(contenido_csv).decode("utf-8"))
  443. ## muy temporal ##
  444. def PoblarPuntajePuntos(request):
  445. ''' Llena la tabla puntaje puntos con los promedios y
  446. valoraciones de cada punto de la encuesta
  447. '''
  448. try:
  449. P = Puntaje_Encuesta.objects.all()
  450. for p in P:
  451. # buscando puntaje de punto de encuesta
  452. try:
  453. # actualizando registro
  454. puntaje = Puntaje_Punto.objects.get(punto=p.punto)
  455. puntaje.actualizar(p.puntuacion)
  456. puntaje.save()
  457. print("Actualizado registro " + str(puntaje))
  458. except ObjectDoesNotExist:
  459. # creando registro
  460. puntaje = Puntaje_Punto()
  461. puntaje.punto = p.punto
  462. puntaje.actualizar(p.puntuacion)
  463. puntaje.save()
  464. print("Creando registro :" + str(puntaje))
  465. except ObjectDoesNotExist:
  466. pass
  467. # terminado ahora mostrando reportes
  468. Puntajes = Puntaje_Punto.objects.all()
  469. return HttpResponse(str(Puntajes))