Commit c869049314e3e00516e27dbcfd7af8f107b832ef

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

upgrade to bootstrap 5.1

remove fontawesome and use bootstrap-icons instead
BUGS.md
... ... @@ -2,6 +2,7 @@
2 2  
3 3 ## BUGS
4 4  
  5 +- review por nome e numero no cabecalho jumbotron
5 6 - talvez a base de dados devesse ter como chave do teste um id que fosse único
6 7 desse teste particular (não um auto counter, nem ref do teste)
7 8 - em caso de timeout na submissão (e.g. JOBE ou script nao responde) a correcção
... ...
package.json
... ... @@ -3,7 +3,8 @@
3 3 "email": "mjsb@uevora.pt",
4 4 "dependencies": {
5 5 "@fortawesome/fontawesome-free": "^5.15.3",
6   - "bootstrap": "^4.6.0",
  6 + "bootstrap": "^5.1.0",
  7 + "bootstrap-icons": "^1.7.2",
7 8 "codemirror": "^5.61.1",
8 9 "datatables": "^1.10",
9 10 "jquery": "^3.6.0",
... ...
perguntations/app.py
... ... @@ -156,7 +156,7 @@ class App():
156 156  
157 157 # ------------------------------------------------------------------------
158 158 async def set_password(self, uid: str, password: str) -> None:
159   - '''change password on the database'''
  159 + '''change password in the database'''
160 160 with Session(self._engine, future=True) as session:
161 161 query = select(Student).where(Student.id == uid)
162 162 student = session.execute(query).scalar_one()
... ...
perguntations/serve.py
... ... @@ -327,7 +327,7 @@ class AdminHandler(BaseHandler):
327 327 '''
328 328 cmd = self.get_body_argument('cmd', None)
329 329 value = self.get_body_argument('value', None)
330   - logger.debug('POST /admin (cmd=%s, value=%s)')
  330 + logger.debug('POST /admin (cmd=%s, value=%s)', cmd, value)
331 331  
332 332 if cmd == 'allow':
333 333 self.testapp.allow_student(value)
... ... @@ -338,7 +338,7 @@ class AdminHandler(BaseHandler):
338 338 elif cmd == 'deny_all':
339 339 self.testapp.deny_all_students()
340 340 elif cmd == 'reset_password':
341   - await self.testapp.set_password(uid=value, pw='')
  341 + await self.testapp.set_password(uid=value, password='')
342 342 elif cmd == 'insert_student' and value is not None:
343 343 student = json.loads(value)
344 344 await self.testapp.insert_new_student(uid=student['number'],
... ...
perguntations/static/bootstrap-icons 0 → 120000
... ... @@ -0,0 +1 @@
  1 +../../node_modules/bootstrap-icons
0 2 \ No newline at end of file
... ...
perguntations/templates/admin.html
... ... @@ -22,7 +22,7 @@
22 22 <!-- Scripts -->
23 23 <script src="/static/jquery/jquery.min.js"></script>
24 24 <!-- <script defer src="/static/popper.js/popper.min.js"></script> -->
25   - <script defer src="/static/fontawesome-free/js/all.min.js"></script>
  25 + <!-- <script defer src="/static/fontawesome-free/js/all.min.js"></script> -->
26 26 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
27 27 <script defer src="/static/datatables/js/jquery.dataTables.min.js"></script>
28 28 <script defer src="/static/underscore/underscore-min.js"></script>
... ... @@ -31,80 +31,80 @@
31 31 </head>
32 32 <!-- ===================================================================== -->
33 33 <body>
34   -<nav class="navbar navbar-expand-sm fixed-top navbar-dark bg-danger">
35   - <a class="navbar-brand" href="#">
36   - <img src="/static/logo_horizontal.png" height="30" alt="">
37   - </a>
38   - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
39   - <span class="navbar-toggler-icon"></span>
40   - </button>
41   -
42   - <div class="collapse navbar-collapse" id="navbarNavDropdown">
43   - <!-- left -->
44   - <span class="navbar-text mr-auto"></span>
45   -
46   - <!-- center -->
47   - <span class="navbar-text mr-auto"><span id="clock"> --:-- </span></span>
48   -
49   - <!-- right -->
50   - <ul class="navbar-nav">
51   - <li class="nav-item dropdown">
52   - <a class="nav-link dropdown-toggle active" href="#" id="navbarDropdownAluno" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
53   - Acções
54   - </a>
55   - <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownAluno">
56   - <a class="dropdown-item" href="#" id="novo_aluno" data-toggle="modal" data-target="#novo_aluno_modal">Novo aluno...</a>
57   - <a class="dropdown-item" href="#" id="reset_password_menu" data-toggle="modal" data-target="#reset_password_modal">Limpar password...</a>
58   - <a class="dropdown-item" href="#" id="allow_all">Autorizar todos</a>
59   - <a class="dropdown-item" href="#" id="deny_all">Desautorizar todos</a>
60   - <div class="dropdown-divider"></div>
61   - <a class="dropdown-item" href="/logout">Sair</a>
62   - </div>
63   - </li>
64   - </ul>
65   - </div>
66   -</nav>
  34 + <nav class="navbar navbar-expand-sm fixed-top navbar-dark bg-danger">
  35 + <div class="container-fluid">
  36 + <a class="navbar-brand" href="#">
  37 + <img src="/static/logo_horizontal.png" height="30" alt="">
  38 + </a>
  39 + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
  40 + <span class="navbar-toggler-icon"></span>
  41 + </button>
  42 + <div class="collapse navbar-collapse" id="navbarNavDropdown">
  43 + <!-- left -->
  44 + <span class="navbar-text mr-auto"></span>
  45 +
  46 + <!-- center -->
  47 + <span class="navbar-text mr-auto"><span id="clock"> --:-- </span></span>
  48 +
  49 + <!-- right -->
  50 + <ul class="navbar-nav">
  51 + <li class="nav-item dropdown">
  52 + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownAluno" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  53 + Acções
  54 + </a>
  55 + <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownAluno">
  56 + <li><a class="dropdown-item" href="#" id="novo_aluno" data-bs-toggle="modal" data-bs-target="#novo_aluno_modal">Novo aluno...</a></li>
  57 + <li><a class="dropdown-item" href="#" id="reset_password_menu" data-bs-toggle="modal" data-bs-target="#reset_password_modal">Limpar password...</a></li>
  58 + <li><a class="dropdown-item" href="#" id="allow_all">Autorizar todos</a></li>
  59 + <li><a class="dropdown-item" href="#" id="deny_all">Desautorizar todos</a></li>
  60 + <li><hr class="dropdown-divider"></hr></li>
  61 + <li><a class="dropdown-item" href="/logout">Sair</a></li>
  62 + </ul>
  63 + </li>
  64 + </ul>
  65 + </div>
  66 + </div>
  67 + </nav>
67 68 <!-- ===================================================================== -->
68   -<div class="container-fluid">
69   -
70   - <div class="jumbotron">
71   - <h3 id="title"></h3>
72   - <p>
73   - Referência: <code id="ref">--</code><br>
74   - Ficheiro de configuração do teste: <code id="filename">--</code><br>
75   - Directório com os testes entregues: <code id="answers_dir">--</code><br>
76   - Base de dados: <code id="database">--</code><br>
77   - </p>
78   - <p>
79   - <a href="/adminwebservice?cmd=testcsv" class="btn btn-primary">Obter CSV das notas</a>
80   - <a href="/adminwebservice?cmd=questionscsv" class="btn btn-primary">Obter CSV detalhado</a>
81   - </p>
82   - </div> <!-- jumbotron -->
83   -
84   - <table class="table table-sm table-striped" style="width:100%" id="students_table">
85   - <thead class="thead thead-light">
86   - <tr>
87   - <th>#</th>
88   - <th>Ok</th>
89   - <th>Número</th>
90   - <th>Nome</th>
91   - <th>Estado</th>
92   - <th>Nota</th>
93   - </tr>
94   - </thead>
95   - </table>
96   -
97   -</div> <!-- container -->
  69 + <div class="container-fluid">
  70 +
  71 + <div class="bg-light p-3">
  72 + <h3 id="title"></h3>
  73 + <ul>
  74 + <li>Referência: <code id="ref">--</code><br></li>
  75 + <li>Ficheiro de configuração: <code id="filename">--</code><br></li>
  76 + <li>Directório com os testes entregues: <code id="answers_dir">--</code><br></li>
  77 + <li>Base de dados: <code id="database">--</code><br></li>
  78 + </ul>
  79 + <p>
  80 + <a href="/adminwebservice?cmd=testcsv" class="btn btn-primary">Obter CSV das notas</a>
  81 + <a href="/adminwebservice?cmd=questionscsv" class="btn btn-primary">Obter CSV detalhado</a>
  82 + </p>
  83 + </div>
  84 + <br>
  85 + <table class="table table-sm table-striped" style="width:100%" id="students_table">
  86 + <thead class="thead thead-light">
  87 + <tr>
  88 + <th>#</th>
  89 + <th>Autoriz.</th>
  90 + <th>Número</th>
  91 + <th>Nome</th>
  92 + <th>Estado</th>
  93 + <th>Nota</th>
  94 + </tr>
  95 + </thead>
  96 + </table>
  97 +
  98 + </div> <!-- container -->
98 99 <!-- ===================================================================== -->
99 100  
100 101 <!-- modal: inserir novo aluno -->
101   -<div class="modal" id="novo_aluno_modal">
102   - <div class="modal-dialog" role="document">
  102 +<div class="modal fade" id="novo_aluno_modal" aria-hidden="true">
  103 + <div class="modal-dialog">
103 104 <div class="modal-content">
104 105  
105 106 <div class="modal-header">
106 107 <h5 class="modal-title">Inserir novo aluno</h5>
107   - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
108 108 </div>
109 109  
110 110 <div class="modal-body">
... ... @@ -120,11 +120,11 @@
120 120 <input type="text" class="form-control" id="novo_nome" value="">
121 121 </div>
122 122 </div>
123   -
124 123 </div>
125 124  
126 125 <div class="modal-footer">
127   - <button id="inserir_novo_aluno" class="btn btn-primary" role="button" data-dismiss="modal">Inserir</button>
  126 + <button type="button" class="btn btn-primary" id="inserir_novo_aluno" data-bs-dismiss="modal">Inserir</button>
  127 + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
128 128 </div>
129 129  
130 130 </div>
... ... @@ -132,13 +132,12 @@
132 132 </div>
133 133  
134 134 <!-- modal: reset password -->
135   -<div class="modal" id="reset_password_modal">
136   - <div class="modal-dialog" role="document">
  135 +<div class="modal fade" id="reset_password_modal">
  136 + <div class="modal-dialog">
137 137 <div class="modal-content">
138 138  
139 139 <div class="modal-header">
140   - <h5 class="modal-title">Reset password</h5>
141   - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  140 + <h5 class="modal-title">Limpar password do aluno</h5>
142 141 </div>
143 142  
144 143 <div class="modal-body">
... ... @@ -151,7 +150,8 @@
151 150 </div>
152 151  
153 152 <div class="modal-footer">
154   - <button id="reset_password" class="btn btn-primary" role="button" data-dismiss="modal">Reset password</button>
  153 + <button type="button" class="btn btn-primary" id="reset_password" data-bs-dismiss="modal">Limpar password</button>
  154 + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
155 155 </div>
156 156 </div>
157 157 </div> <!-- modal -->
... ...
perguntations/templates/grade.html
... ... @@ -8,41 +8,44 @@
8 8  
9 9 <!-- Styles -->
10 10 <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css">
  11 + <link rel="stylesheet" type="text/css" href="/static/bootstrap-icons/font/bootstrap-icons.css">
11 12  
12 13 <link rel="stylesheet" type="text/css" href="/static/css/test.css">
13 14  
14 15 <!-- Scripts -->
15 16 <script src="/static/jquery/jquery.min.js"></script>
16 17 <!-- <script defer src="/static/popper.js/popper.min.js"></script> -->
17   - <script defer src="/static/fontawesome-free/js/all.min.js"></script>
  18 + <!-- <script defer src="/static/fontawesome-free/js/all.min.js"></script> -->
18 19 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
19 20 </head>
20 21 <!-- ================================================================= -->
21 22 <body>
22   -
23 23 <nav class="navbar navbar-expand-sm fixed-top navbar-dark bg-dark">
24   - <a class="navbar-brand" href="#">{{t['title']}}</a>
25   - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
26   - <span class="navbar-toggler-icon"></span>
27   - </button>
  24 + <div class="container-fluid">
  25 + <a class="navbar-brand" href="#">{{t['title']}}</a>
  26 + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
  27 + <span class="navbar-toggler-icon"></span>
  28 + </button>
28 29  
29   - <div class="collapse navbar-collapse" id="navbarText">
30   - <ul class="navbar-nav mr-auto">
31   - </ul>
32   - <span class="navbar-text">
33   - <i class="fas fa-user" aria-hidden="true"></i>
34   - <span id="name">{{ escape(name) }}</span>
35   - (<span id="number">{{ escape(uid) }}</span>)
36   - <span class="caret"></span>
37   - </span>
  30 + <div class="collapse navbar-collapse" id="navbarText">
  31 + <ul class="navbar-nav mr-auto">
  32 + </ul>
  33 + <span class="navbar-text">
  34 + <!-- <i class="fas fa-user" aria-hidden="true"></i> -->
  35 + <span id="name">{{ escape(name) }}</span>
  36 + (<span id="number">{{ escape(uid) }}</span>)
  37 + <!-- <span class="caret"></span> -->
  38 + </span>
  39 + </div>
38 40 </div>
39 41 </nav>
40 42 <!-- ================================================================== -->
41 43 <div class="container">
42   - <div class="jumbotron">
  44 + <div class="bg-light p-3">
43 45 {% if t['state'] == 'CORRECTED' %}
44 46 {% if t['grade'] - t['scale'][0] >= 0.75*(t['scale'][1] - t['scale'][0]) %}
45   - <i class="fas fa-thumbs-up fa-5x text-success" aria-hidden="true"></i>
  47 + <h1 class="text-success"><i class="bi bi-hand-thumbs-up-fill"></i></h1>
  48 + <!-- <i class="fas fa-thumbs-up fa-5x text-success" aria-hidden="true"></i> -->
46 49 {% end %}
47 50 <h3>Resultado:
48 51 <strong>{{ f'{round(t["grade"], 3)}' }}</strong>
... ... @@ -54,8 +57,8 @@
54 57 <h3>Foi registada a sua desistência da prova.</h3>
55 58 {% end %}
56 59  
57   - <p><a href="/logout" class="btn btn-primary btn-lg active" role="button">Clique aqui para terminar</a></p>
58   - </div> <!-- jumbotron -->
  60 + <p><a href="/logout" class="btn btn-primary btn-lg active" role="button">Sair do teste</a></p>
  61 + </div>
59 62 </div> <!-- container -->
60 63 </body>
61 64 </html>
... ...
perguntations/templates/login.html
... ... @@ -3,18 +3,10 @@
3 3 <head>
4 4 <title>Teste</title>
5 5 <link rel="icon" href="/static/favicon.ico">
6   -
7 6 <meta charset="UTF-8">
8 7 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
9   -
10   - <!-- Styles -->
11 8 <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css">
12   -
13   - <!-- Scripts -->
14   - <script src="/static/jquery/jquery.min.js"></script>
15   - <script defer src="/static/fontawesome-free/js/all.min.js"></script>
16 9 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
17   -
18 10 </head>
19 11 <!-- =================================================================== -->
20 12 <body>
... ... @@ -22,29 +14,26 @@
22 14 <div class="card bg-light border-secondary mt-3">
23 15 <div class="card-body">
24 16 <div class="row">
25   -
26   - <div class="col-sm-9">
  17 + <div class="col-sm-8">
27 18 <img src="/static/logo_horizontal_login.png" class="img-responsive mb-3" width="50%" alt="Universidade de Évora">
28 19 </div>
29   -
30   - <div class="col-sm-3">
31   - <h4>Identificação:</h4>
32   -
  20 + <div class="col-sm-4">
  21 + <h5>Identificação</h5>
33 22 <form method="post" action="/login" class="form-signin">
34 23 {% module xsrf_form_html() %}
35   - <div class="form-group">
  24 + <div class="mb-3">
36 25 <input type="text" name="uid" class="form-control mb-3" placeholder="Número" required autofocus>
37 26 <input type="password" name="pw" class="form-control mb-3" placeholder="Password" required>
38 27 <p> {{ error }} </p>
39 28 </div>
40 29 <button class="btn btn-primary" type="submit">
41   - <i class="fas fa-sign-in-alt" aria-hidden="true"></i> Entrar
  30 + Entrar
42 31 </button>
43 32 </form>
44 33 </div>
45 34 </div>
46 35 </div>
47 36 </div>
48   - </div> <!-- container -->
  37 + </div>
49 38 </body>
50 39 </html>
... ...
perguntations/templates/review-question-checkbox.html
... ... @@ -3,51 +3,57 @@
3 3  
4 4 {% block answer %}
5 5 <fieldset data-role="controlgroup">
6   - <ul class="list-group">
7   - {% for n, opt in enumerate(q['options']) %}
8   - <li class="list-group-item">
9   - <div class="d-flex flex-row">
10   - {% if q['answer'] is not None and str(n) in q['answer'] %}
11   - <div class="p-2">
12   - <i class="far fa-check-square" aria-hidden="true"></i>
13   - </div>
14   - <div class="p-2">
15   - {{ md(opt) }}
16   - </div>
17   - <div class="ml-auto p-2">
18   - {% if q['correct'][n] > 0 %}
19   - <div class="text-right text-success">
20   - <i class="fas fa-check" aria-hidden="true"></i>
21   - </div>
22   - {% else %}
23   - <div class="text-right text-danger">
24   - <i class="fas fa-times" aria-hidden="true"></i>
25   - </div>
26   - {% end %}
27   - </div>
  6 + <ul class="list-group">
  7 + {% for n, opt in enumerate(q['options']) %}
  8 + <li class="list-group-item">
  9 + <div class="d-flex flex-row">
  10 + {% if q['answer'] is not None and str(n) in q['answer'] %}
  11 + <div class="p-2">
  12 + <i class="bi bi-check-square"></i>
  13 + <!-- <i class="far fa-check-square" aria-hidden="true"></i> -->
  14 + </div>
  15 + <div class="p-2">
  16 + {{ md(opt) }}
  17 + </div>
  18 + <div class="ml-auto p-2">
  19 + {% if q['correct'][n] > 0 %}
  20 + <div class="text-right text-success">
  21 + <i class="bi bi-check-lg"></i>
  22 + <!-- <i class="fas fa-check" aria-hidden="true"></i> -->
  23 + </div>
  24 + {% else %}
  25 + <div class="text-right text-danger">
  26 + <i class="bi bi-x-lg"></i>
  27 + <!-- <i class="fas fa-times" aria-hidden="true"></i> -->
  28 + </div>
  29 + {% end %}
  30 + </div>
28 31  
29   - {% else %}
30   - <div class="p-2">
31   - <i class="far fa-square" aria-hidden="true"></i>
32   - </div>
33   - <div class="p-2">
34   - {{ md(opt) }}
35   - </div>
36   - <div class="ml-auto p-2">
37   - {% if q['correct'][n] > 0 %}
38   - <div class="text-right text-danger">
39   - <i class="fas fa-times" aria-hidden="true"></i>
40   - </div>
41   - {% else %}
42   - <div class="text-right text-success">
43   - <i class="fas fa-check" aria-hidden="true"></i>
44   - </div>
45   - {% end %}
46   - </div>
47   - {% end %}
  32 + {% else %}
  33 + <div class="p-2">
  34 + <i class="bi bi-square"></i>
  35 + <!-- <i class="far fa-square" aria-hidden="true"></i> -->
  36 + </div>
  37 + <div class="p-2">
  38 + {{ md(opt) }}
  39 + </div>
  40 + <div class="ml-auto p-2">
  41 + {% if q['correct'][n] > 0 %}
  42 + <div class="text-right text-danger">
  43 + <i class="bi bi-x-lg"></i>
  44 + <!-- <i class="fas fa-times" aria-hidden="true"></i> -->
  45 + </div>
  46 + {% else %}
  47 + <div class="text-right text-success">
  48 + <i class="bi bi-check-lg"></i>
  49 + <!-- <i class="fas fa-check" aria-hidden="true"></i> -->
48 50 </div>
49   - </li>
50   - {% end %}
51   - </ul>
  51 + {% end %}
  52 + </div>
  53 + {% end %}
  54 + </div>
  55 + </li>
  56 + {% end %}
  57 + </ul>
52 58 </fieldset>
53 59 {% end %}
... ...
perguntations/templates/review-question-radio.html
... ... @@ -9,7 +9,8 @@
9 9 <div class="d-flex flex-row">
10 10 {% if q['answer'] is not None and str(n)==q['answer'] %}
11 11 <div class="p-2">
12   - <i class="fas fa-dot-circle" aria-hidden="true"></i>
  12 + <i class="bi bi-record-circle"></i>
  13 + <!-- <i class="fas fa-dot-circle" aria-hidden="true"></i> -->
13 14 </div>
14 15 <div class="p-2">
15 16 {{ md(opt) }}
... ... @@ -17,18 +18,21 @@
17 18 <div class="ml-auto p-2">
18 19 {% if q['correct'][n] > 0 %}
19 20 <div class="text-right text-success">
20   - <i class="fas fa-check" aria-hidden="true"></i>
  21 + <i class="bi bi-check-lg"></i>
  22 + <!-- <i class="fas fa-check" aria-hidden="true"></i> -->
21 23 </div>
22 24 {% else %}
23 25 <div class="text-right text-danger">
24   - <i class="fas fa-times" aria-hidden="true"></i>
  26 + <i class="bi bi-x-lg"></i>
  27 + <!-- <i class="fas fa-times" aria-hidden="true"></i> -->
25 28 </div>
26 29 {% end %}
27 30 </div>
28 31  
29 32 {% else %}
30 33 <div class="p-2">
31   - <i class="far fa-circle" aria-hidden="true"></i>
  34 + <i class="bi bi-circle"></i>
  35 + <!-- <i class="far fa-circle" aria-hidden="true"></i> -->
32 36 </div>
33 37 <div class="p-2">
34 38 {{ md(opt) }}
... ... @@ -36,7 +40,8 @@
36 40 <div class="ml-auto p-2">
37 41 {% if q['correct'][n] > 0 %}
38 42 <div class="text-right text-info">
39   - <i class="fas fa-dot-circle" aria-hidden="true"></i>
  43 + <i class="bi bi-arrow-left"></i>
  44 + <!-- <i class="fas fa-dot-circle" aria-hidden="true"></i> -->
40 45 </div>
41 46 {% end %}
42 47 </div>
... ... @@ -45,4 +50,4 @@
45 50 {% end %}
46 51 </ul>
47 52 </fieldset>
48   -{% end %}
49 53 \ No newline at end of file
  54 +{% end %}
... ...
perguntations/templates/review-question.html
... ... @@ -8,7 +8,8 @@
8 8 {{ q['number'] }}. {{ q['title'] }}
9 9 <div class="float-right">
10 10 <small>Classificar&nbsp;</small>
11   - <i class="far fa-check-square" aria-hidden="true"></i>
  11 + <i class="bi bi-check-square"></i>
  12 + <!-- <i class="far fa-check-square" aria-hidden="true"></i> -->
12 13 </div>
13 14 </h5> <!-- card-header -->
14 15  
... ... @@ -35,17 +36,17 @@
35 36 {% if 'grade' in q %}
36 37 <div class="card-footer">
37 38 {% if q['grade'] > 0.999 %}
  39 + <h1 class="text-success"><i class="bi bi-hand-thumbs-up"></i></h1>
38 40 <p class="text-success">
39   - <i class="far fa-thumbs-up fa-3x" aria-hidden="true"></i>
40   - {{ round(q['grade'] * q['points'], 2) }}
41   - pontos
  41 + <!-- <i class="far fa-thumbs-up fa-3x" aria-hidden="true"></i> -->
  42 + {{ round(q['grade'] * q['points'], 2) }} pontos
42 43 </p>
43 44 <p class="text-success">{{ md(q['comments']) }}</p>
44 45 {% elif q['grade'] >= 0.5 %}
  46 + <h1 class="text-warning"><i class="bi bi-exclamation-triangle"></i></h1>
45 47 <p class="text-warning">
46   - <i class="fas fa-exclamation-triangle fa-3x" aria-hidden="true"></i>
47   - {{ round(q['grade'] * q['points'], 2) }}
48   - pontos
  48 + <!-- <i class="fas fa-exclamation-triangle fa-3x" aria-hidden="true"></i> -->
  49 + {{ round(q['grade'] * q['points'], 2) }} pontos
49 50 </p>
50 51 <p class="text-warning">{{ md(q['comments']) }}</p>
51 52 {% if q['solution'] %}
... ... @@ -53,10 +54,10 @@
53 54 {{ md('**Solução:** \n\n' + q['solution']) }}
54 55 {% end %}
55 56 {% else %}
  57 + <h1 class="text-danger"><i class="bi bi-hand-thumbs-down"></i></h1>
56 58 <p class="text-danger">
57   - <i class="far fa-thumbs-down fa-3x" aria-hidden="true"></i>
58   - {{ round(q['grade'] * q['points'], 2) }}
59   - pontos
  59 + <!-- <i class="far fa-thumbs-down fa-3x" aria-hidden="true"></i> -->
  60 + {{ round(q['grade'] * q['points'], 2) }} pontos
60 61 </p>
61 62 <p class="text-danger">{{ md(q['comments']) }}</p>
62 63 {% if q['solution'] %}
... ... @@ -81,7 +82,8 @@
81 82 {{ q['number'] }}. {{ q['title'] }}
82 83 <div class="float-right">
83 84 <small>Classificar&nbsp;</small>
84   - <i class="far fa-square" aria-hidden="true"></i>
  85 + <i class="bi bi-square"></i>
  86 + <!-- <i class="far fa-square" aria-hidden="true"></i> -->
85 87 </div>
86 88 </h5> <!-- card-header -->
87 89  
... ... @@ -100,8 +102,10 @@
100 102 </div> <!-- card-body -->
101 103  
102 104 <div class="card-footer">
103   - <p class="text-secondary">
104   - <i class="fas fa-ban fa-3x" aria-hidden="true"></i>
  105 + <h1 class="text-secondary"><i class="bi bi-dash-circle"></i></h1>
  106 + <p class="text-secondary">
  107 + Não respondeu
  108 + <!-- <i class="fas fa-ban fa-3x" aria-hidden="true"></i> -->
105 109 {{ md(q['comments']) }}
106 110 {% if q['solution'] %}
107 111 <hr>
... ...
perguntations/templates/review.html
... ... @@ -5,7 +5,6 @@
5 5 <meta charset="UTF-8">
6 6 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
7 7 <link rel="icon" type="image/x-icon" href="/static/favicon.ico">
8   -
9 8 <!-- MathJax3 -->
10 9 <script>
11 10 MathJax = {
... ... @@ -25,52 +24,54 @@
25 24 <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css">
26 25 <link rel="stylesheet" type="text/css" href="/static/css/github.css"> <!-- syntax highlight -->
27 26 <link rel="stylesheet" type="text/css" href="/static/css/test.css">
  27 + <link rel="stylesheet" type="text/css" href="/static/bootstrap-icons/font/bootstrap-icons.css">
28 28  
29 29 <!-- Scripts -->
30 30 <script src="/static/jquery/jquery.min.js"></script>
31 31 <!-- <script defer src="/static/popper.js/popper.min.js"></script> -->
32   - <script defer src="/static/fontawesome-free/js/all.min.js"></script>
  32 + <!-- <script defer src="/static/fontawesome-free/js/all.min.js"></script> -->
33 33 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
34 34 </head>
35 35 <!-- ===================================================================== -->
36 36 <body>
37 37 <!-- ===================================================================== -->
38   -
39 38 <nav class="navbar navbar-expand-sm fixed-top navbar-dark bg-danger">
40   - <a class="navbar-brand" href="#">
41   - <img src="/static/logo_horizontal.png" height="30" alt="">
42   - </a>
43   - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
44   - <span class="navbar-toggler-icon"></span>
45   - </button>
  39 + <div class="container-fluid">
  40 + <a class="navbar-brand" href="#">
  41 + <img src="/static/logo_horizontal.png" height="30" alt="">
  42 + </a>
  43 + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
  44 + <span class="navbar-toggler-icon"></span>
  45 + </button>
46 46  
47   - <div class="collapse navbar-collapse" id="navbarText">
48   - <ul class="nav navbar-nav">
49   - <li class="nav-item"></li>
50   - </ul>
  47 + <div class="collapse navbar-collapse" id="navbarText">
  48 + <ul class="nav navbar-nav">
  49 + <li class="nav-item"></li>
  50 + </ul>
51 51  
52   - <ul class="nav navbar-nav mx-auto">
53   - <li class="nav-item">
54   - <span class="navbar-text">Revisão de prova</span>
55   - </li>
56   - </ul>
  52 + <ul class="nav navbar-nav mx-auto">
  53 + <li class="nav-item">
  54 + <span class="navbar-text">Revisão de prova</span>
  55 + </li>
  56 + </ul>
57 57  
58   - <ul class="nav navbar-nav">
59   - <li class="nav-item">
60   - <span class="navbar-text">
61   - <i class="fas fa-user" aria-hidden="true"></i>
62   - <span id="name">{{ escape(name) }}</span>
63   - (<span id="number">{{ escape(uid) }}</span>)
64   - <span class="caret"></span>
65   - </span>
66   - </li>
67   - </ul>
  58 + <ul class="nav navbar-nav">
  59 + <li class="nav-item">
  60 + <span class="navbar-text">
  61 + <!-- <i class="fas fa-user" aria-hidden="true"></i> -->
  62 + <span id="name">{{ escape(name) }}</span>
  63 + (<span id="number">{{ escape(uid) }}</span>)
  64 + <!-- <span class="caret"></span> -->
  65 + </span>
  66 + </li>
  67 + </ul>
  68 + </div>
68 69 </div>
69 70 </nav>
70 71  
71 72 <!-- ===================================================================== -->
72 73 <div class="container">
73   - <div class="jumbotron">
  74 + <div class="bg-light p-3">
74 75 <h1 class="display-5">{{ t['title'] }}</h1>
75 76 <h5>
76 77 <div class="row">
... ... @@ -80,7 +81,6 @@
80 81 </div>
81 82 </div>
82 83 </h5>
83   -
84 84 <hr>
85 85  
86 86 <h5>
... ... @@ -113,7 +113,7 @@
113 113 </div>
114 114 {% end %}
115 115 </h3>
116   - </div> <!-- jumbotron -->
  116 + </div>
117 117  
118 118 {% for i, q in enumerate(t['questions']) %}
119 119 {% module Template(templ[q['type']], i=i, q=q, md=md(q['ref']), t=t, debug=debug) %}
... ...
perguntations/templates/test.html
... ... @@ -22,7 +22,7 @@
22 22 <!-- Scripts -->
23 23 <script src="/static/jquery/jquery.min.js"></script>
24 24 <!-- <script defer src="/static/popper.js/popper.min.js"></script> -->
25   - <script defer src="/static/fontawesome-free/js/all.min.js"></script>
  25 + <!-- <script defer src="/static/fontawesome-free/js/all.min.js"></script> -->
26 26 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
27 27 <script defer src="/static/underscore/underscore-min.js"></script>
28 28 <script src="/static/codemirror/lib/codemirror.js"></script>
... ... @@ -49,65 +49,63 @@
49 49 </div>
50 50  
51 51 <nav id="navbar" class="navbar navbar-expand-sm fixed-top navbar-dark bg-dark">
52   -
53   - <a class="navbar-brand" href="#">
54   - <img src="/static/logo_horizontal.png" height="30" alt="">
55   - </a>
56   - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
57   - <span class="navbar-toggler-icon"></span>
58   - </button>
59   -
60   - <div class="collapse navbar-collapse" id="navbarText">
61   - <ul class="nav navbar-nav">
62   - <li class="nav-item"></li>
63   - </ul>
64   -
65   - <ul class="nav navbar-nav mx-auto">
  52 + <div class="container-fluid">
  53 + <a class="navbar-brand" href="#">
  54 + <img src="/static/logo_horizontal.png" height="30" alt="">
  55 + </a>
  56 + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
  57 + <span class="navbar-toggler-icon"></span>
  58 + </button>
  59 +
  60 + <div class="collapse navbar-collapse" id="navbarText">
  61 + <ul class="nav navbar-nav">
  62 + <li class="nav-item"></li>
  63 + </ul>
  64 +
  65 + <ul class="nav navbar-nav mx-auto">
66 66 <li class="nav-item"><h5>
67 67 <span class="navbar-text" id="clock"> --:-- </span>
68 68 </h5>
69 69  
70 70 </li>
71   - </ul>
  71 + </ul>
72 72  
73   - <ul class="nav navbar-nav">
  73 + <ul class="nav navbar-nav">
74 74 <li class="nav-item">
75 75 <span class="navbar-text">
76   - <i class="fas fa-user" aria-hidden="true"></i>
  76 + <!-- <i class="fas fa-user" aria-hidden="true"></i> -->
77 77 <span id="name">{{ escape(name) }}</span>
78 78 (<span id="number">{{ escape(uid) }}</span>)
79   - <span class="caret"></span>
  79 + <!-- <span class="caret"></span> -->
80 80 </span>
81 81 </li>
82   - </ul>
  82 + </ul>
  83 + </div>
83 84 </div>
84   -
85 85 </nav>
86 86  
87 87 <!-- ===================================================================== -->
88 88 <div class="container">
89 89  
90   - <div class="jumbotron">
  90 + <div class="bg-light p-3">
91 91 <h3 class="display-5">{{ t['title'] }}</h3>
92 92 <hr>
93   -
94   - <div class="row">
95   - <label for="nome" class="col-sm-3">Nome:</label>
96   - <div class="col-sm-9" id="nome">{{ escape(name) }}</div>
97   - </div>
98   - <div class="row">
99   - <label for="numero" class="col-sm-3">Número:</label>
100   - <div class="col-sm-9" id="numero">{{ escape(uid) }}</div>
101   - </div>
102   -
103   - <div class="row">
104   - <label for="duracao" class="col-sm-3">Duração:</label>
105   - <div class="col-sm-9" id="duracao">{{ str(t['duration'])+' minutos' if t['duration'] > 0 else 'sem limite de tempo' }}</div>
106   - </div>
107   - <div class="row">
108   - <label for="submissao" class="col-sm-3">Submissão:</label>
109   - <div class="col-sm-9" id="submissao">{{ 'automática no fim do tempo' if t['autosubmit'] else 'manual' }}</div>
110   - </div>
  93 + <div class="row">
  94 + <label for="nome" class="col-sm-3">Nome:</label>
  95 + <div class="col-sm-9" id="nome">{{ escape(name) }}</div>
  96 + </div>
  97 + <div class="row">
  98 + <label for="numero" class="col-sm-3">Número:</label>
  99 + <div class="col-sm-9" id="numero">{{ escape(uid) }}</div>
  100 + </div>
  101 + <div class="row">
  102 + <label for="duracao" class="col-sm-3">Duração:</label>
  103 + <div class="col-sm-9" id="duracao">{{ str(t['duration'])+' minutos' if t['duration'] > 0 else 'sem limite de tempo' }}</div>
  104 + </div>
  105 + <div class="row">
  106 + <label for="submissao" class="col-sm-3">Submissão:</label>
  107 + <div class="col-sm-9" id="submissao">{{ 'automática no fim do tempo' if t['autosubmit'] else 'manual' }}</div>
  108 + </div>
111 109 </div>
112 110  
113 111 <form action="/" method="post" id="test">
... ... @@ -119,7 +117,7 @@
119 117  
120 118 <div class="form-row">
121 119 <div class="col-12">
122   - <button type="button" class="btn btn-success btn-lg btn-block" data-toggle="modal" data-target="#confirmar" id="form-button-submit">
  120 + <button type="button" class="btn btn-success btn-lg btn-block" data-bs-toggle="modal" data-bs-target="#confirmar" id="form-button-submit">
123 121 Submeter teste
124 122 </button>
125 123 </div>
... ... @@ -132,7 +130,7 @@
132 130  
133 131 <!-- Modal de confirmacao submissao -->
134 132 <div class="modal fade" id="confirmar" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
135   - <div class="modal-dialog" role="document">
  133 + <div class="modal-dialog">
136 134 <div class="modal-content">
137 135 <div class="modal-header">
138 136 <h4 class="modal-title">Deseja submeter o teste?</h4>
... ... @@ -141,15 +139,15 @@
141 139 O teste será enviado para classificação e já não poderá voltar atrás.
142 140 Antes de submeter, verifique se respondeu a todas as questões.
143 141 Desactive as perguntas que não pretende classificar para evitar
144   - eventuais penalizações.
  142 + penalizações.
145 143 </div>
146 144 <div class="modal-footer">
147   - <button type="button" class="btn btn-danger btn-lg" data-dismiss="modal">
148   - Oops, NÃO!!!
149   - </button>
150 145 <button form="test" type="submit" class="btn btn-success btn-lg">
151 146 Sim, submeter...
152 147 </button>
  148 + <button type="button" class="btn btn-danger btn-lg" data-bs-dismiss="modal">
  149 + Oops, NÃO!!!
  150 + </button>
153 151 </div>
154 152 </div>
155 153 </div>
... ...