Commit c869049314e3e00516e27dbcfd7af8f107b832ef
1 parent
f3635fa0
Exists in
master
and in
1 other branch
upgrade to bootstrap 5.1
remove fontawesome and use bootstrap-icons instead
Showing
13 changed files
with
262 additions
and
254 deletions
Show diff stats
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/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">×</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">×</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 </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 </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> | ... | ... |