Commit 0e95aad2c4dd6637d4955f76b4bdbecf25864236
1 parent
b1febcff
Exists in
master
and in
1 other branch
- /students shows active/inactive/finished in separate panels
Showing
3 changed files
with
109 additions
and
37 deletions
Show diff stats
database.py
| @@ -29,6 +29,21 @@ class Database(object): | @@ -29,6 +29,21 @@ class Database(object): | ||
| 29 | ORDER BY grade DESC, finish_time DESC;''' | 29 | ORDER BY grade DESC, finish_time DESC;''' |
| 30 | return c.execute(cmd, [test_id]).fetchall() | 30 | return c.execute(cmd, [test_id]).fetchall() |
| 31 | 31 | ||
| 32 | + # return list of students and their results for a given test | ||
| 33 | + def test_grades2(self, test_id): | ||
| 34 | + with sqlite3.connect(self.db) as c: | ||
| 35 | + # with all tests done by each student: | ||
| 36 | + # cmd = 'SELECT student_id,name,grade FROM students INNER JOIN tests ON students.number=tests.student_id WHERE test_id==? ORDER BY grade DESC;' | ||
| 37 | + | ||
| 38 | + # only the best result for each student | ||
| 39 | + cmd = ''' | ||
| 40 | + SELECT student_id, name, grade, start_time, finish_time | ||
| 41 | + FROM students INNER JOIN tests | ||
| 42 | + ON students.number=tests.student_id | ||
| 43 | + WHERE test_id==? | ||
| 44 | + ORDER BY finish_time ASC;''' | ||
| 45 | + return c.execute(cmd, [test_id]).fetchall() | ||
| 46 | + | ||
| 32 | # get list of students in the database | 47 | # get list of students in the database |
| 33 | def get_students(self): | 48 | def get_students(self): |
| 34 | with sqlite3.connect(self.db) as c: | 49 | with sqlite3.connect(self.db) as c: |
serve.py
| @@ -17,7 +17,6 @@ except ImportError: | @@ -17,7 +17,6 @@ except ImportError: | ||
| 17 | 17 | ||
| 18 | try: | 18 | try: |
| 19 | from mako.lookup import TemplateLookup | 19 | from mako.lookup import TemplateLookup |
| 20 | - import djks | ||
| 21 | except ImportError: | 20 | except ImportError: |
| 22 | print('The package "mako" is missing. See README.md for instructions.') | 21 | print('The package "mako" is missing. See README.md for instructions.') |
| 23 | sys.exit(1) | 22 | sys.exit(1) |
| @@ -78,9 +77,11 @@ class Root(object): | @@ -78,9 +77,11 @@ class Root(object): | ||
| 78 | for num in reset_pw: | 77 | for num in reset_pw: |
| 79 | cherrypy.log.error('Password updated for student %s.' % str(num), 'APPLICATION') | 78 | cherrypy.log.error('Password updated for student %s.' % str(num), 'APPLICATION') |
| 80 | 79 | ||
| 80 | + grades = self.database.test_grades2(self.testconf['ref']) | ||
| 81 | students = self.database.get_students() | 81 | students = self.database.get_students() |
| 82 | + | ||
| 82 | template = self.templates.get_template('/students.html') | 83 | template = self.templates.get_template('/students.html') |
| 83 | - return template.render(students=students, tags=self.tags) | 84 | + return template.render(students=students, tags=self.tags, grades=grades) |
| 84 | 85 | ||
| 85 | # --- RESULTS ------------------------------------------------------------ | 86 | # --- RESULTS ------------------------------------------------------------ |
| 86 | @cherrypy.expose | 87 | @cherrypy.expose |
templates/students.html
| @@ -33,46 +33,102 @@ | @@ -33,46 +33,102 @@ | ||
| 33 | <div class="container"> | 33 | <div class="container"> |
| 34 | <div class="panel panel-default drop-shadow"> | 34 | <div class="panel panel-default drop-shadow"> |
| 35 | <div class="panel-heading"> | 35 | <div class="panel-heading"> |
| 36 | - <span class="badge">${len(tags['online'])} online</span> <span class="badge">${len(tags['finished'])} finished</span> | 36 | + ${len(tags['finished'])} Terminado(s)</span> |
| 37 | </div> | 37 | </div> |
| 38 | - <!-- <div class="panel-body"> --> | ||
| 39 | - <table class="table"> | ||
| 40 | - <thead> | ||
| 41 | - <tr> | ||
| 42 | - <th>Tags</th> | ||
| 43 | - <th>Número</th> | ||
| 44 | - <th>Nome</th> | ||
| 45 | - <th>Password</th> | ||
| 46 | - </tr> | ||
| 47 | - </thead> | ||
| 48 | - <tbody> | ||
| 49 | - % for r in students: | 38 | + <div class="panel-body"> |
| 39 | + <table class="table"> | ||
| 40 | + <thead> | ||
| 50 | <tr> | 41 | <tr> |
| 51 | - <td> | ||
| 52 | - % if r[0] in tags['online']: | ||
| 53 | - <span class="label label-primary">online</span> | ||
| 54 | - % endif | 42 | + <th>Número</th> |
| 43 | + <th>Nome</th> | ||
| 44 | + <th>Login</th> | ||
| 45 | + <th>Logout</th> | ||
| 46 | + <th>Nota</th> | ||
| 47 | + </tr> | ||
| 48 | + </thead> | ||
| 49 | + <tbody> | ||
| 50 | + % for r in grades: | ||
| 51 | + <tr> | ||
| 55 | % if r[0] in tags['finished']: | 52 | % if r[0] in tags['finished']: |
| 56 | - <span class="label label-success">finished</span> | 53 | + <td>${r[0]}</td> <!-- numero --> |
| 54 | + <td>${r[1]}</td> <!-- nome --> | ||
| 55 | + <td>${r[3][:19]}</td> | ||
| 56 | + <td>${r[4][:19]}</td> | ||
| 57 | + <td>${r[2]}</td> | ||
| 58 | + | ||
| 57 | % endif | 59 | % endif |
| 58 | - </td> | ||
| 59 | - <td>${r[0]}</td> <!-- numero --> | ||
| 60 | - <td>${r[1]}</td> <!-- nome --> | ||
| 61 | - <td class="col-sm-3"> | ||
| 62 | - <form action="/students/" method="post" id="${r[0]}"> | ||
| 63 | - <div class="input-group"> | ||
| 64 | - <input type="password" class="form-control" placeholder="${r[2][:8]}" name="${r[0]}"> | ||
| 65 | - <span class="input-group-btn"> | ||
| 66 | - <button form="${r[0]}" type="submit" value="submit" class="btn btn-danger">reset</button> | ||
| 67 | - </span> | ||
| 68 | - </div><!-- /input-group --> | ||
| 69 | - </form> | ||
| 70 | - </td> <!-- password --> | 60 | + </tr> |
| 61 | + % endfor | ||
| 62 | + </tbody> | ||
| 63 | + </table> | ||
| 64 | + </div> | ||
| 65 | + </div> | ||
| 66 | + | ||
| 67 | + <div class="panel panel-success drop-shadow"> | ||
| 68 | + <div class="panel-heading"> | ||
| 69 | + ${len(tags['online'])} Activo(s)</span> | ||
| 70 | + </div> | ||
| 71 | + <div class="panel-body"> | ||
| 72 | + <table class="table"> | ||
| 73 | + <thead> | ||
| 74 | + <tr> | ||
| 75 | + <th>Número</th> | ||
| 76 | + <th>Nome</th> | ||
| 77 | +<!-- <th>Login</th> --> | ||
| 71 | </tr> | 78 | </tr> |
| 72 | - % endfor | ||
| 73 | - </tbody> | ||
| 74 | - </table> | ||
| 75 | - </div> <!-- panel --> | 79 | + </thead> |
| 80 | + <tbody> | ||
| 81 | + % for r in students: | ||
| 82 | + <tr> | ||
| 83 | + % if r[0] in tags['online']: | ||
| 84 | + <td>${r[0]}</td> <!-- numero --> | ||
| 85 | + <td>${r[1]}</td> <!-- nome --> | ||
| 86 | + % endif | ||
| 87 | + </tr> | ||
| 88 | + % endfor | ||
| 89 | + </tbody> | ||
| 90 | + </table> | ||
| 91 | + </div> | ||
| 92 | + </div> | ||
| 93 | + | ||
| 94 | + | ||
| 95 | + <div class="panel panel-danger drop-shadow"> | ||
| 96 | + <div class="panel-heading"> | ||
| 97 | + ${len(students)-len(tags['online'])} Inactivo(s)</span> | ||
| 98 | + </div> | ||
| 99 | + <div class="panel-body"> | ||
| 100 | + | ||
| 101 | + <table class="table"> | ||
| 102 | + <thead> | ||
| 103 | + <tr> | ||
| 104 | + <th>Número</th> | ||
| 105 | + <th>Nome</th> | ||
| 106 | + <th>Password</th> | ||
| 107 | + </tr> | ||
| 108 | + </thead> | ||
| 109 | + <tbody> | ||
| 110 | + % for r in students: | ||
| 111 | + <tr> | ||
| 112 | + % if r[0] not in tags['online']: | ||
| 113 | + <td>${r[0]}</td> <!-- numero --> | ||
| 114 | + <td>${r[1]}</td> <!-- nome --> | ||
| 115 | + <td class="col-sm-3"> | ||
| 116 | + <form action="/students/" method="post" id="${r[0]}"> | ||
| 117 | + <div class="input-group"> | ||
| 118 | + <input type="password" class="form-control" placeholder="${r[2][:8]}" name="${r[0]}"> | ||
| 119 | + <span class="input-group-btn"> | ||
| 120 | + <button form="${r[0]}" type="submit" value="submit" class="btn btn-danger">reset</button> | ||
| 121 | + </span> | ||
| 122 | + </div><!-- /input-group --> | ||
| 123 | + </form> | ||
| 124 | + </td> <!-- password --> | ||
| 125 | + % endif | ||
| 126 | + </tr> | ||
| 127 | + % endfor | ||
| 128 | + </tbody> | ||
| 129 | + </table> | ||
| 130 | + </div> | ||
| 131 | + </div> | ||
| 76 | </div> <!-- container --> | 132 | </div> <!-- container --> |
| 77 | </body> | 133 | </body> |
| 78 | </html> | 134 | </html> |