Przeglądaj źródła

comenzando a hacer pdf

rodzic
commit
a5cd354d47

BIN
__pycache__/adminver.cpython-36.pyc Wyświetl plik


BIN
__pycache__/enfermeriaver.cpython-36.pyc Wyświetl plik


BIN
__pycache__/transcripcionmaker.cpython-36.pyc Wyświetl plik


+ 118
- 23
adminver.py Wyświetl plik

@@ -1,17 +1,6 @@
1
-# import sqlalchemy as db
2
-#
3
-# # connect to server
4
-# engine = db.create_engine('mysql+pymysql://root:@0.0.0.0/registro_escolar_1')
5
-#
6
-# connection = engine.connect()
7
-#
8
-# ######################################### lo viejo arriba,
9
-######################################### lo nuevo abajo
10
-
11 1
 from connect import connection
12 2
 import sqlalchemy as db
13 3
 
14
-#########################################
15 4
 
16 5
 
17 6
 # esta funcion se obtiene cuando un administrador quiere ver los perfiles de administradores
@@ -85,7 +74,9 @@ def admin():
85 74
     info += ','
86 75
     info += '"add_link":"/admin/forma/add/administracion/"'
87 76
     info += ','
88
-    info += '"dir1":"#"'
77
+    info += '"bot1":"Ver Mas"' #texto del primer boton en una fila
78
+    info += ','
79
+    info += '"bot2":"Editar"' #texto del segundo boton en una fila
89 80
     info += ','
90 81
     info += '"dir2":"/admin/forma/edit/administracion/"'
91 82
     info += '}'
@@ -174,7 +165,9 @@ def encargados():
174 165
     info += ','
175 166
     info += '"add_link":"/admin/forma/add/madre/"'
176 167
     info += ','
177
-    info += '"dir1":"#"'
168
+    info += '"bot1":"Ver Mas"' #texto del primer boton en una fila
169
+    info += ','
170
+    info += '"bot2":"Editar"' #texto del segundo boton en una fila
178 171
     info += ','
179 172
     info += '"dir2":"/admin/forma/edit/madre/"'
180 173
     info += '}'
@@ -264,7 +257,9 @@ def enfermeria():
264 257
     info += ','
265 258
     info += '"add_link":"/admin/forma/add/enfermera/"'
266 259
     info += ','
267
-    info += '"dir1":"#"'
260
+    info += '"bot1":"Ver Mas"' #texto del primer boton en una fila
261
+    info += ','
262
+    info += '"bot2":"Editar"' #texto del segundo boton en una fila
268 263
     info += ','
269 264
     info += '"dir2":"/admin/forma/edit/enfermera/"'
270 265
     info += '}'
@@ -345,19 +340,21 @@ def estudiantes():
345 340
     ###### info
346 341
 
347 342
     info = '{'
348
-    info += '"dash_name":"Manejar Estudiantes"'
343
+    info += '"dash_name":"Manejar Estudiantes"' #nombre en el header
349 344
     info += ','
350
-    info += '"dash_link":"/admin/ver/"'
345
+    info += '"dash_link":"/admin/ver/"' #link al click el header
346
+    info += ','
347
+    info += '"dash_sub_name":"Estudiantes Registrados"' #titulo grande de la pagina
351 348
     info += ','
352
-    info += '"dash_sub_name":"Estudiantes Registrados"'
349
+    info += '"add":"Anadir Estudiantes"' #texto en el boton para a~nadir perfil
353 350
     info += ','
354
-    info += '"add":"Anadir Estudiantes"'
351
+    info += '"add_link":"/admin/forma/add/estudiante/"' #direccion para el boton para a~nadir perfil
355 352
     info += ','
356
-    info += '"add_link":"/admin/forma/add/estudiante/"'
353
+    info += '"bot1":"Ver Mas"' #texto del primer boton en una fila
357 354
     info += ','
358
-    info += '"dir1":"#"'
355
+    info += '"bot2":"Editar"' #texto del segundo boton en una fila
359 356
     info += ','
360
-    info += '"dir2":"/admin/forma/edit/estudiante/"'
357
+    info += '"dir2":"/admin/forma/edit/estudiante/"' #direccion del segundo boton
361 358
     info += '}'
362 359
 
363 360
     ###### modal
@@ -449,7 +446,9 @@ def facultad():
449 446
     info += ','
450 447
     info += '"add_link":"/admin/forma/add/facultad/"'
451 448
     info += ','
452
-    info += '"dir1":"#"'
449
+    info += '"bot1":"Ver Mas"' #texto del primer boton en una fila
450
+    info += ','
451
+    info += '"bot2":"Editar"' #texto del segundo boton en una fila
453 452
     info += ','
454 453
     info += '"dir2":"/admin/forma/edit/facultad/"'
455 454
     info += '}'
@@ -556,7 +555,9 @@ def visita():
556 555
     info += ','
557 556
     info += '"add_link":"/admin/forma/add/visitas_oficina/"'
558 557
     info += ','
559
-    info += '"dir1":"#"'
558
+    info += '"bot1":"Ver Mas"' #texto del primer boton en una fila
559
+    info += ','
560
+    info += '"bot2":"Editar"' #texto del segundo boton en una fila
560 561
     info += ','
561 562
     info += '"dir2":"/admin/forma/edit/visitas_oficina/"'
562 563
     info += '}'
@@ -572,3 +573,97 @@ def visita():
572 573
 
573 574
     # print(result)
574 575
     return(result)
576
+
577
+
578
+# esta funcion se obtiene cuando un administrador quiere ver las visitas a la oficina
579
+#   url: /admin/ver/visitas_oficina
580
+
581
+def transcripcion():
582
+    query = 'SELECT u.id, u.nombres, u.apellidos, u.email FROM usuarios u, estudiantes m WHERE u.id = m.user_id'
583
+    result_db = connection.execute(query).fetchall()
584
+
585
+    ###### headers
586
+
587
+    headers = '['
588
+    headers += '{"nombre":"Nombre"}'
589
+    headers += ','
590
+    headers += '{"nombre":"Grado"}'
591
+    headers += ','
592
+    headers += '{"nombre":"Email"}'
593
+    headers += ','
594
+    headers += '{"nombre":"Informacion"}'
595
+    headers += ','
596
+    headers += '{"nombre":"Transcripción"}'
597
+    headers += ']'
598
+    # headers = '[{"nombre":"Nombre"},{"nombre":"Posicion"},{"nombre":"Informacion"},{"nombre":"Editar"}]'
599
+
600
+    ###### tabla
601
+
602
+
603
+    tabla = '['
604
+    modal_content = '['
605
+    i = 0
606
+    len_result = len(result_db)
607
+    for q in result_db:
608
+        i = i+1
609
+        tabla += '{'
610
+        modal_content += '{'
611
+        tabla += '"Nombre":"'+(q[1])+' '+(q[2])+'"'
612
+        modal_content += '"Nombre":"'+(q[1])+' '+(q[2])+'"'
613
+        tabla += ','
614
+        modal_content += ','
615
+
616
+        query = 'SELECT grado FROM estudiantes e WHERE e.user_id = ' + str(q[0])
617
+        total_hijos = connection.execute(query).fetchall()
618
+
619
+        tabla += '"Grado":"'+str(total_hijos[0][0])+'"'
620
+        modal_content += '"Grado":"'+str(total_hijos[0][0])+'"'
621
+
622
+        tabla += ','
623
+        modal_content += ','
624
+        tabla += '"Email":"'+(q[3])+'"'
625
+        modal_content += '"Email":"'+(q[3])+'"'
626
+        tabla += ','
627
+        modal_content += ','
628
+        tabla += '"user_id":"'+str(q[0])+'"'
629
+        modal_content += '"user_id":"'+str(q[0])+'"'
630
+        tabla += '}'
631
+        modal_content += '}'
632
+        if i < len_result:
633
+            tabla += ','
634
+            modal_content += ','
635
+    tabla += ']'
636
+    modal_content += ']'
637
+
638
+    ###### info
639
+
640
+    info = '{'
641
+    info += '"dash_name":"Manejar Estudiantes"' #nombre en el header
642
+    info += ','
643
+    info += '"dash_link":"/admin/ver/"' #link al click el header
644
+    info += ','
645
+    info += '"dash_sub_name":"Estudiantes Registrados"' #titulo grande de la pagina
646
+    info += ','
647
+    info += '"add":"Anadir Estudiantes"' #texto en el boton para a~nadir perfil
648
+    info += ','
649
+    info += '"add_link":"/admin/forma/add/estudiante/"' #direccion para el boton para a~nadir perfil
650
+    info += ','
651
+    info += '"bot1":"Ver Mas"' #texto del primer boton en una fila
652
+    info += ','
653
+    info += '"bot2":"Generar"' #texto del segundo boton en una fila
654
+    info += ','
655
+    info += '"dir2":"/admin/forma/crear/transcripcion/"' #direccion del segundo boton
656
+    info += '}'
657
+
658
+    ###### modal
659
+
660
+    modal = '{'
661
+    modal += '"infoName":"Ver informacion"'
662
+    modal += ','
663
+    modal += '"editName":"/admin/ver/"'
664
+    modal += '}'
665
+
666
+    result = '{"headers":'+headers+',"tabla":'+tabla+',"modal_content":'+modal_content+',"info":'+info+',"modal":'+modal+'}'
667
+
668
+    # print(result)
669
+    return(result)

+ 14
- 4
dash-run.py Wyświetl plik

@@ -4,6 +4,7 @@ import os
4 4
 
5 5
 import adminver
6 6
 import enfermeriaver
7
+import transcripcionmaker
7 8
 
8 9
 
9 10
 app = Flask(__name__)
@@ -20,7 +21,7 @@ def perfil(perfil, pagina=None):
20 21
     if (perfil=='admin'):
21 22
         if (pagina==None):
22 23
             return render_template('dash.html', jscript="admin.js", pagina=pagina)
23
-        if(pagina in ['admin','facultad','enfermeria','encargados','estudiantes','visita']):
24
+        if(pagina in ['admin','facultad','enfermeria','encargados','estudiantes','visita','transcripcion']):
24 25
             return render_template('table.html', jscript="adminver.js", pagina=pagina)
25 26
     if (perfil=='enfermeria'):
26 27
         if (pagina==None):
@@ -55,6 +56,8 @@ def datos(perfil, pagina=None):
55 56
             return adminver.estudiantes()
56 57
         if(pagina=="visita"):
57 58
             return adminver.visita()
59
+        if(pagina=="transcripcion"):
60
+            return adminver.transcripcion()
58 61
     if(perfil=="enfermeria"):
59 62
         if(pagina=="visitas"):
60 63
             return enfermeriaver.visitas()
@@ -92,21 +95,25 @@ def procesaUser(user_type):
92 95
 def formas(perfil, accion,tipo,id=None):
93 96
     if perfil not in ["enfermera", "enfermeria", "admin", "administracion", "estudiante", "madre", "facultad"]:
94 97
         return {"error":True,"tipo":"tipo_incorrecto","opcion":tipo,"user_type":"admin"}
98
+    if (accion == 'crear'):
99
+        if (tipo == 'transcripcion'):
100
+            if(id):
101
+                return render_template('transcripcion.html', id=id)
95 102
     return render_template('forma.html', tipo=tipo, accion=accion, id=id, user_type=perfil)
96 103
 ##################
97 104
 
98 105
 @app.route('/<perfil>/formaDatos/<accion>/<tipo>/', methods=['GET', 'POST'])
99
-@app.route('/<perfil>/formaDatos/<accion>/<tipo>/<id>', methods=['GET', 'POST'])
106
+@app.route('/<perfil>/formaDatos/<accion>/<tipo>/<id>/', methods=['GET', 'POST'])
100 107
 def formaEst(perfil, accion, tipo, id=None):
101 108
     # 	data = json.loads('formaEstudiantes.json')
102 109
     # print 'perfil'
103 110
     if perfil not in ["enfermera", "enfermeria", "admin", "administracion", "estudiante", "madre", "facultad"]:
104 111
         return {"error":True,"tipo":"tipo_incorrecto","opcion":tipo,"user_type":"<perfil>"}
105 112
     # print 'tipo'
106
-    if tipo not in ["enfermera", "enfermeria", "administracion", "estudiante", "madre", "facultad", 'visitas_oficina', 'visitas_enfermeria']:
113
+    if tipo not in ["enfermera", "enfermeria", "administracion", "estudiante", "madre", "facultad", 'visitas_oficina', 'visitas_enfermeria', 'transcripcion']:
107 114
         return {"error":True,"tipo":"tipo_incorrecto","opcion":tipo,"user_type":"<perfil>"}
108 115
     # print 'accion'
109
-    if accion not in ["edit", "add", "view"]:
116
+    if accion not in ["edit", "add", "view", "crear"]:
110 117
         return {"error":True,"tipo":"accion_incorrecta","opcion":accion,"user_type":"<perfil>"}
111 118
     # print 'add'
112 119
     if (accion=="add"):
@@ -125,6 +132,9 @@ def formaEst(perfil, accion, tipo, id=None):
125 132
             return {"error":True,"tipo":"usuario_incorrecto","opcion":tipo,"user_type":"<perfil>"}
126 133
         else:
127 134
             return resultado
135
+    if (accion=="crear"):
136
+        return transcripcionmaker.crear_transcripcion(id)
137
+
128 138
 
129 139
 @app.route('/admin/dashAdmin', methods=['GET', 'POST'])
130 140
 def dashAdmin():

+ 3
- 1
enfermeriaver.py Wyświetl plik

@@ -86,7 +86,9 @@ def visitas():
86 86
     info += ','
87 87
     info += '"add_link":"/enfermeria/forma/add/visitas_enfermeria/"'
88 88
     info += ','
89
-    info += '"dir1":"#"'
89
+    info += '"bot1":"Ver Mas"' #texto del primer boton en una fila
90
+    info += ','
91
+    info += '"bot2":"Editar"' #texto del segundo boton en una fila
90 92
     info += ','
91 93
     info += '"dir2":"/enfermeria/forma/edit/visitas_enfermeria/"'
92 94
     info += '}'

+ 49
- 0
pdf2.py Wyświetl plik

@@ -0,0 +1,49 @@
1
+# https://www.blog.pythonlibrary.org/2018/06/05/creating-pdfs-with-pyfpdf-and-python/
2
+from fpdf import FPDF, HTMLMixin
3
+
4
+class HTML2PDF(FPDF, HTMLMixin):
5
+    pass
6
+
7
+html = '''<h1 align="center">PyFPDF HTML Demo</h1>
8
+<p>This is regular text</p>
9
+<p>You can also <b>bold</b>, <i>italicize</i> or <u>underline</u>
10
+'''
11
+pdf = HTML2PDF()
12
+pdf.add_page()
13
+pdf.write_html(html)
14
+# pdf.output('html2pdf.pdf')
15
+
16
+##########
17
+
18
+# pdf = FPDF()
19
+# pdf.add_page()
20
+pdf.set_font("Arial", size=12)
21
+pdf.cell(200, 10, txt="Welcome to Python!", ln=1, align="C")
22
+pdf.cell(200, 10, txt="Welcome to Python!", ln=1, align="C")
23
+pdf.cell(0, 15, txt="Welcome to Python!", ln=1, align="C")
24
+pdf.rect(20, 20, 100, 50)
25
+
26
+###########
27
+spacing=1
28
+data = [['First Name', 'Last Name', 'email', 'zip'],
29
+        ['Mike', 'Driscoll', 'mike@somewhere.com', '55555'],
30
+        ['John', 'Doe', 'jdoe@doe.com', '12345'],
31
+        ['Nina', 'Ma', 'inane@where.com', '54321']
32
+        ]
33
+
34
+# pdf = FPDF()
35
+pdf.set_font("Arial", size=12)
36
+# pdf.add_page()
37
+
38
+col_width = pdf.w / 4.5
39
+row_height = pdf.font_size
40
+for row in data:
41
+    for item in row:
42
+        pdf.cell(col_width, row_height*spacing,
43
+                 txt=item, border=1)
44
+    pdf.ln(row_height*spacing)
45
+
46
+
47
+###########
48
+
49
+pdf.output("simple_demo.pdf")

+ 1
- 1
static/admin.js Wyświetl plik

@@ -44,7 +44,7 @@ dash.controller('dashController', function($scope){
44 44
     }
45 45
     ,{
46 46
       nombre:'Generar Transcripciones',
47
-      dir:'#9',
47
+      dir:'/admin/ver/transcripcion',
48 48
     }
49 49
     ,{
50 50
       nombre:'Visitas oficina',

+ 30
- 0
static/transcripcion.js Wyświetl plik

@@ -0,0 +1,30 @@
1
+var table = angular.module('table',['ngSanitize']);
2
+// var table = angular.module('table',[]);
3
+
4
+table.controller('tableController', function tableController($http, $scope, id){
5
+
6
+
7
+  var url = '/admin/formaDatos/crear/transcripcion/'+ id +'/'
8
+  console.log(',datos,admin,transcripcion');
9
+
10
+  $http.get(url).then(function(response) {
11
+    if(response.data.error!==true)
12
+    {
13
+      // document.write('if');
14
+      $scope.headers = response.data.headers;
15
+      $scope.estudiante = response.data.estudiante;
16
+      $scope.semestres = response.data.semestres;
17
+      console.log(response.data);
18
+
19
+      // document.write(response.data.headers);
20
+      // document.write(response.data.estudiante);
21
+      // document.write(response.data.semestres);
22
+    }
23
+    else
24
+    {
25
+      // document.write('else');
26
+      $window.location.href = '/'+user_type+'/error/'+response.data.tipo;
27
+      console.log(response.data);
28
+    }
29
+  });
30
+});

+ 2
- 2
templates/table.html Wyświetl plik

@@ -114,8 +114,8 @@
114 114
               <td ng-repeat="stat in row" ng-if="stat != row.user_id">
115 115
                 <div ng-bind-html="stat"></div>
116 116
               </td>
117
-              <td><button type="button" class="btn2 boton mr-4" name="button" data-toggle="modal" data-target="#myModalv{{row.user_id}}">Ver mas</button></td>
118
-              <td><a type="button" class="btn2 boton mr-4" href="{{info.dir2}}{{row.user_id}}">Editar</a></td>
117
+              <td><button type="button" class="btn2 boton mr-4" name="button" data-toggle="modal" data-target="#myModalv{{row.user_id}}">{{info.bot1}}</button></td>
118
+              <td><a type="button" class="btn2 boton mr-4" href="{{info.dir2}}{{row.user_id}}">{{info.bot2}}</a></td>
119 119
 
120 120
               {% endraw %}
121 121
             </tr>

+ 129
- 0
templates/transcripcion.html Wyświetl plik

@@ -0,0 +1,129 @@
1
+<html>
2
+
3
+  <!-- empieza los includes -->
4
+  <head>
5
+    <title>Draft</title>
6
+    <meta name="viewport" content="width=device-width, initial-scale=1">
7
+    <meta charset="UTF-8">
8
+    <link rel="icon" href="/../Icon.ico" sizes="32x32">
9
+    <!-- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"> -->
10
+    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
11
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
12
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
13
+    <!-- <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> -->
14
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
15
+    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
16
+    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular-sanitize.js"></script>
17
+
18
+    <!-- el .css -->
19
+    <link rel="stylesheet" href="{{ url_for('static', filename='estilo.css') }}" />
20
+
21
+    <!-- los .js que quiero usar -->
22
+    <script type="text/javascript" src="{{ url_for('static', filename='transcripcion.js') }}"></script>
23
+    <script>
24
+    // la variable 'pagina' la usa el javascript para que el run.py sepa cual python file abrir.
25
+    //        este python file se encarga de comunicarse con la base de datos.
26
+      table.value("id", "{{id}}")
27
+    </script>
28
+
29
+  </head>
30
+  <!-- termina los includes -->
31
+
32
+
33
+  <body ng-app="table" ng-controller="tableController">
34
+    <!-- <nav class="navbar navbar-dark bg-dark navbar-expand">
35
+      {% raw %}
36
+      <a class="navbar-brand" href="{{info.dash_link}}">Transcripción: {{estudiante.nombres}} {{estudiante.apellidos}}</a>
37
+      {% endraw %}
38
+    </nav> -->
39
+
40
+    <div class="container-fluid">
41
+      <div class="row" >
42
+        <h1 class='text-center'>
43
+          Transcripción del estudiante {% raw %}{{estudiante.nombres}} {{estudiante.apellidos}}{% endraw %}
44
+        </h1>
45
+      </div>
46
+      <div class="row" >
47
+        {% raw %}
48
+        <div class="col-6" >
49
+          <div class="row" >
50
+            <b>Nombre</b>: {{estudiante.nombres}}
51
+          </div>
52
+          <div class="row" >
53
+            <b>Apellidos</b>: {{estudiante.apellidos}}
54
+          </div>
55
+          <div class="row" >
56
+            <b>email</b>: {{estudiante.email}}
57
+          </div>
58
+          <div class="row" >
59
+            <b>Fecha nacimiento</b>: {{estudiante.fecha_nacimiento}}
60
+          </div>
61
+          <div class="row" >
62
+            <b>Dirección</b>: {{estudiante.direccion1}}
63
+          </div>
64
+          <div class="row" >
65
+            <b>Ciudad</b>: {{estudiante.ciudad}}
66
+          </div>
67
+        </div>
68
+        <div class="col" >
69
+          <div class="row" >
70
+            <b>Pais</b>: {{estudiante.pais}}
71
+          </div>
72
+          <div class="row" >
73
+            <b>Dirección</b>: {{estudiante.direccion2}}
74
+          </div>
75
+          <div class="row" >
76
+            <b>Telefono (1)</b>: {{estudiante.telefono1}}
77
+          </div>
78
+          <div class="row" >
79
+            <b>Telefono (2)</b>: {{estudiante.zipcode}}
80
+          </div>
81
+          {% endraw %}
82
+        </div>
83
+      </div>
84
+
85
+      <div class="row " >
86
+        <div class="col" >
87
+
88
+          <div ng-repeat="(key, value) in semestres">
89
+            <table id='tabla'>
90
+              <tr>
91
+                {% raw %}
92
+                <th colspan="4" class="header2 text-center">{{key}}</th>
93
+                {% endraw %}
94
+              </tr>
95
+              <tr>
96
+                {% raw %}
97
+                <th ng-repeat="header in headers" class="header2">{{header}}</th>
98
+                {% endraw %}
99
+              </tr>
100
+              <tr ng-repeat="cla in value">{{stat}}
101
+                {% raw %}
102
+                <!-- la proxima linea asume que las entradas en la tabla tienen un id unico con -->
103
+                <!-- el mismo nombre de identificador a traves de los javascript, json, etc. -->
104
+                <td>
105
+                  <div ng-bind-html="cla.codigo"></div>
106
+                </td>
107
+                <td>
108
+                  <div ng-bind-html="cla.nombre"></div>
109
+                </td>
110
+                <td>
111
+                  <div ng-bind-html="cla.Nota"></div>
112
+                </td>
113
+                <td>
114
+                  <div ng-bind-html="cla.Creditos"></div>
115
+                </td>
116
+
117
+                {% endraw %}
118
+              </tr>
119
+            </table>
120
+            <br>
121
+          </div>
122
+
123
+        </div>
124
+      </div>
125
+    </div>
126
+  </body>
127
+
128
+
129
+</html>

+ 126
- 0
transcripcionmaker.py Wyświetl plik

@@ -0,0 +1,126 @@
1
+def crear_transcripcion(id):
2
+
3
+    from connect import connection
4
+    import sqlalchemy as db
5
+    from flask import jsonify
6
+
7
+
8
+    ###### headers
9
+    headers={}
10
+    headers.update({"1":"Codigo"})
11
+    headers.update({"2":"Curso"})
12
+    headers.update({"3":"Nota"})
13
+    headers.update({"4":"Creditos"})
14
+
15
+    ###### estudiante
16
+
17
+    query = 'SELECT nombres, apellidos, email, fecha_nacimiento, direccion1, direccion2, ciudad, pais, zipcode,\
18
+                telefono1, telefono2\
19
+            FROM usuarios u, estudiantes m \
20
+            WHERE u.id = '+id+ ' AND u.id = m.user_id'
21
+    result_db = connection.execute(query).fetchall()
22
+
23
+    q = result_db
24
+    q = q[0]
25
+
26
+    estudiante={}
27
+    estudiante.update({"nombres":str(q[0])})
28
+    estudiante.update({"apellidos":str(q[1])})
29
+    estudiante.update({"email":str(q[2])})
30
+    estudiante.update({"fecha_nacimiento":str(q[3])})
31
+    estudiante.update({"direccion1":str(q[4])})
32
+    estudiante.update({"direccion2":str(q[5])})
33
+    estudiante.update({"ciudad":str(q[6])})
34
+    estudiante.update({"pais":str(q[7])})
35
+    estudiante.update({"zipcode":str(q[8])})
36
+    estudiante.update({"telefono1":str(q[9])})
37
+    estudiante.update({"telefono2":str(q[10])})
38
+
39
+    ###### semestres
40
+
41
+    q = result_db
42
+    semestres={}
43
+
44
+    semestre = ('1', '2', '3', '4', )
45
+    clases = ('ingles', 'espa~Nol', 'arte', 'mate', )
46
+    for num in semestre:
47
+        cursos = {}
48
+        for clase in clases:
49
+            curso = {}
50
+            curso.update({"codigo":'33'})
51
+            curso.update({"Nota":'A'})
52
+            curso.update({"Creditos":'3'})
53
+            curso.update({"nombre":clase})
54
+            cursos.update({clase:curso})
55
+        semestres.update({"semestre "+num:cursos})
56
+
57
+
58
+    result = {}
59
+    result.update({"headers":headers})
60
+    result.update({"estudiante":estudiante})
61
+    result.update({"semestres":semestres})
62
+
63
+    # print(result)
64
+
65
+    #####################################################################
66
+    #####################################################################
67
+    #####################################################################
68
+
69
+
70
+    # https://www.blog.pythonlibrary.org/2018/06/05/creating-pdfs-with-pyfpdf-and-python/
71
+    from fpdf import FPDF, HTMLMixin
72
+
73
+    class HTML2PDF(FPDF, HTMLMixin):
74
+        pass
75
+
76
+    html = '''<h1 align="center">PyFPDF HTML Demo</h1>
77
+    <p>This is regular text</p>
78
+    <p>You can also <b>bold</b>, <i>italicize</i> or <u>underline</u>
79
+    '''
80
+    pdf = HTML2PDF()
81
+    pdf.add_page()
82
+    pdf.write_html(html)
83
+    # pdf.output('html2pdf.pdf')
84
+
85
+    ##########
86
+
87
+    # pdf = FPDF()
88
+    # pdf.add_page()
89
+    pdf.set_font("Arial", size=12)
90
+    pdf.cell(200, 10, txt="Welcome to Python!", ln=1, align="C")
91
+    pdf.cell(200, 10, txt="Welcome to Python!", ln=1, align="C")
92
+    pdf.cell(200, 10, txt="Welcome to Python!", ln=1, align="C")
93
+    pdf.rect(20, 20, 100, 50)
94
+
95
+    ###########
96
+    spacing=1
97
+    data = [['First Name', 'Last Name', 'email', 'zip'],
98
+            ['Mike', 'Driscoll', 'mike@somewhere.com', '55555'],
99
+            ['John', 'Doe', 'jdoe@doe.com', '12345'],
100
+            ['Nina', 'Ma', 'inane@where.com', '54321']
101
+            ]
102
+
103
+    # pdf = FPDF()
104
+    pdf.set_font("Arial", size=12)
105
+    # pdf.add_page()
106
+
107
+    col_width = pdf.w / 4.5
108
+    row_height = pdf.font_size
109
+    for row in data:
110
+        for item in row:
111
+            pdf.cell(col_width, row_height*spacing,
112
+                     txt=item, border=1)
113
+        pdf.ln(row_height*spacing)
114
+
115
+
116
+    ###########
117
+
118
+    pdf.output("simple_demo.pdf")
119
+
120
+
121
+
122
+    #####################################################################
123
+    #####################################################################
124
+    #####################################################################
125
+
126
+    return jsonify(result)