No Description

transcripcionmaker.py 8.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. from flask import jsonify
  2. from connect import connection
  3. def crear_transcripcion(id):
  4. ###### headers
  5. # headers contiene los titulos de las columnas
  6. headers={}
  7. headers.update({"1":"Codigo"})
  8. headers.update({"2":"Curso"})
  9. headers.update({"3":"Nota"})
  10. headers.update({"4":"Porciento"})
  11. ###### estudiante
  12. # estudiante contiene la informacion del estudiante:
  13. # nombres, apellidos, email, fecha_nacimiento, direccion1, direccion2, ciudad
  14. # estudiante.update({"pais, zipcode, telefono1, telefono2
  15. query = 'SELECT nombres, apellidos, email, fecha_nacimiento, direccion1, direccion2, ciudad, pais, zipcode,\
  16. telefono1, telefono2\
  17. FROM usuarios u, estudiantes m \
  18. WHERE u.id = '+id+ ' AND u.id = m.user_id'
  19. q = connection.execute(query).fetchall()[0]
  20. estudiante={}
  21. estudiante.update({"nombres":str(q[0])})
  22. estudiante.update({"apellidos":str(q[1])})
  23. estudiante.update({"email":str(q[2])})
  24. estudiante.update({"fecha_nacimiento":str(q[3])})
  25. estudiante.update({"direccion1":str(q[4])})
  26. estudiante.update({"direccion2":str(q[5])})
  27. estudiante.update({"ciudad":str(q[6])})
  28. estudiante.update({"pais":str(q[7])})
  29. estudiante.update({"zipcode":str(q[8])})
  30. estudiante.update({"telefono1":str(q[9])})
  31. estudiante.update({"telefono2":str(q[10])})
  32. ###### semestres
  33. # semestres se encarga de agrupar las clases por semestre
  34. #funcion para obtener el promedio en un semestre dado
  35. def get_promedio_del_semestre(id, semestre):
  36. query = 'SELECT sum(n.valor)/sum(e.valor) as promedio \
  37. FROM matricula m, oferta o, cursos c, evaluaciones e, notas n \
  38. WHERE c.id = o.curso_id AND \
  39. o.id = m.oferta_id AND \
  40. n.evaluacion_id = e.id AND \
  41. e.oferta_id = o.id AND \
  42. m.estudiante_id = ' + id + ' \
  43. AND o.semestre = "' + semestre +'"'
  44. result = connection.execute(query).fetchall()
  45. return str((result[0][0]))
  46. def get_semestre(semestre):
  47. semestre = semestre.split('a')[1]
  48. semestre = semestre.split('s')
  49. year = semestre[0]
  50. semestre = semestre[1]
  51. if semestre == '1':
  52. semestre = 'Otoño'
  53. elif semestre == '2':
  54. semestre = 'Primavera'
  55. else:
  56. semestre = 'Verano'
  57. nombre = semestre + ' ' + year
  58. return nombre
  59. query = 'SELECT o.id, o.semestre, c.codigo, c.titulo, \
  60. sum(e.valor) as total, sum(n.valor) as puntos, \
  61. sum(n.valor)/sum(e.valor) as promedio\
  62. FROM matricula m, oferta o, cursos c, evaluaciones e, notas n\
  63. WHERE c.id = o.curso_id AND \
  64. o.id = m.oferta_id AND \
  65. n.evaluacion_id = e.id AND \
  66. e.oferta_id = o.id AND \
  67. m.estudiante_id =' + id +'\
  68. GROUP BY o.id ORDER BY o.semestre'
  69. clases = connection.execute(query).fetchall()
  70. promedio_acumulado = 0
  71. semestres={}
  72. semestre={}
  73. ctr=0
  74. ctr2=0
  75. ctr3=1
  76. if len(clases)>0:
  77. codigo_semestre = clases[0][1]
  78. # por cada clase en el resultado
  79. for clase in clases:
  80. #se agrupan las clases si el codigo del semestre es el mismo
  81. if codigo_semestre == clase[1]:
  82. curso = {}
  83. curso.update({"id":str(clase[0])})
  84. curso.update({"Semestre":str(clase[1])})
  85. curso.update({"codigo":str(clase[2])})
  86. curso.update({"nombre":str(clase[3])})
  87. curso.update({"total":str(clase[4])})
  88. curso.update({"obtenido":str(clase[5])})
  89. curso.update({"porciento":str(int(clase[6]*100))})
  90. semestre.update({codigo_semestre+'//'+str(ctr):curso})
  91. #si el semestre es distinto,
  92. #si el codigo del semestre cambia, se inserte el semestre con el codigo viejo en semestres,
  93. # y se comienza un semestre nuevo con el nuevo codigo
  94. elif codigo_semestre != clase[1]:
  95. # add semestre a semestres
  96. info = {}
  97. promedio_semestre = get_promedio_del_semestre(id, curso.get('Semestre'))
  98. promedio_acumulado += float(promedio_semestre)
  99. info.update({"promedio_acumulado":promedio_semestre[:4]})
  100. info.update({"promedio_total":str(promedio_acumulado/ctr3)[:4]})
  101. info.update({"nombre":get_semestre(codigo_semestre)})
  102. semestre.update({"info":info})
  103. semestres.update({"semestre "+codigo_semestre:semestre})
  104. # y vaciar semestre
  105. semestre={}
  106. codigo_semestre = clase[1]
  107. ctr = 0
  108. curso = {}
  109. curso.update({"id":str(clase[0])})
  110. curso.update({"Semestre":str(clase[1])})
  111. curso.update({"codigo":str(clase[2])})
  112. curso.update({"nombre":str(clase[3])})
  113. curso.update({"total":str(clase[4])})
  114. curso.update({"obtenido":str(clase[5])})
  115. curso.update({"porciento":str(int(clase[6]*100))})
  116. semestre.update({codigo_semestre+'//'+str(ctr):curso})
  117. ctr3 += 1
  118. ctr += 1
  119. ctr2 += 1
  120. # si estamo con la ultima clase, se inserte en el semestre actual, y el semestre en semestres
  121. if ctr2==len(clases):
  122. info = {}
  123. promedio_semestre = get_promedio_del_semestre(id, curso.get('Semestre'))
  124. promedio_acumulado += float(promedio_semestre)
  125. info.update({"promedio_acumulado":promedio_semestre[:4]})
  126. info.update({"promedio_total":str(promedio_acumulado/ctr3)[:4]})
  127. info.update({"nombre":get_semestre(str(clase[1]))})
  128. semestre.update({"info":info})
  129. semestres.update({"semestre "+clase[1]:semestre})
  130. estudiante.update({"promedio":str(promedio_acumulado/ctr3)[:4]+'%'})
  131. result = {}
  132. result.update({"headers":headers})
  133. result.update({"estudiante":estudiante})
  134. result.update({"semestres":semestres})
  135. # #####################################################################
  136. # #####################################################################
  137. # #####################################################################
  138. #
  139. #
  140. # # https://www.blog.pythonlibrary.org/2018/06/05/creating-pdfs-with-pyfpdf-and-python/
  141. # from fpdf import FPDF, HTMLMixin
  142. #
  143. # class HTML2PDF(FPDF, HTMLMixin):
  144. # pass
  145. #
  146. # html = '''<h1 align="center">PyFPDF HTML Demo</h1>
  147. # <p>This is regular text</p>
  148. # <p>You can also <b>bold</b>, <i>italicize</i> or <u>underline</u>
  149. # '''
  150. # pdf = HTML2PDF()
  151. # pdf.add_page()
  152. # pdf.write_html(html)
  153. # # pdf.output('html2pdf.pdf')
  154. #
  155. # ##########
  156. #
  157. # # pdf = FPDF()
  158. # # pdf.add_page()
  159. # pdf.set_font("Arial", size=12)
  160. # pdf.cell(200, 10, txt="Welcome to Python!", ln=1, align="C")
  161. # pdf.cell(200, 10, txt="Welcome to Python!", ln=1, align="C")
  162. # pdf.cell(200, 10, txt="Welcome to Python!", ln=1, align="C")
  163. # pdf.rect(20, 20, 100, 50)
  164. #
  165. # ###########
  166. # spacing=1
  167. # data = [['First Name', 'Last Name', 'email', 'zip'],
  168. # ['Mike', 'Driscoll', 'mike@somewhere.com', '55555'],
  169. # ['John', 'Doe', 'jdoe@doe.com', '12345'],
  170. # ['Nina', 'Ma', 'inane@where.com', '54321']
  171. # ]
  172. #
  173. # # pdf = FPDF()
  174. # pdf.set_font("Arial", size=12)
  175. # # pdf.add_page()
  176. #
  177. # col_width = pdf.w / 4.5
  178. # row_height = pdf.font_size
  179. # for row in data:
  180. # for item in row:
  181. # pdf.cell(col_width, row_height*spacing,
  182. # txt=item, border=1)
  183. # pdf.ln(row_height*spacing)
  184. #
  185. #
  186. # ###########
  187. #
  188. # pdf.output("simple_demo.pdf")
  189. #
  190. #
  191. #
  192. # #####################################################################
  193. # #####################################################################
  194. # #####################################################################
  195. return jsonify(result)