Commit 0e95aad2c4dd6637d4955f76b4bdbecf25864236

Authored by Miguel Barão
1 parent b1febcff
Exists in master and in 1 other branch dev

- /students shows active/inactive/finished in separate panels

Showing 3 changed files with 109 additions and 37 deletions   Show diff stats
@@ -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:
@@ -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>