Commit 5e2c5e62529d26869f1c8bdd0b5887a586acf4a1
1 parent
4b703498
Exists in
master
and in
1 other branch
add package.json to install javascript libraries with npm
Showing
19 changed files
with
219 additions
and
195 deletions
Show diff stats
.gitignore
... | ... | @@ -6,4 +6,7 @@ static/lib |
6 | 6 | |
7 | 7 | # Python egg metadata, regenerated from source files by setuptools. |
8 | 8 | /*.egg-info |
9 | -/*.egg | |
10 | 9 | \ No newline at end of file |
10 | +/*.eggnode_modules | |
11 | + | |
12 | +# ignore javascript libraries installed with npm | |
13 | +node_modules/ | |
11 | 14 | \ No newline at end of file | ... | ... |
README.md
... | ... | @@ -8,17 +8,17 @@ |
8 | 8 | |
9 | 9 | ## 1. Requirements |
10 | 10 | |
11 | -The webserver is a python application that requires `python3.6` and `pip` to be | |
12 | -installed. | |
13 | -It's also recommended to install `npm` (Node package management) to install the | |
11 | +The webserver is a python application that requires `>=python3.6` and `pip` to be | |
12 | +installed. `npm` (Node package management) is also necessary to install the | |
14 | 13 | javascript libraries. |
15 | 14 | |
16 | 15 | ```bash |
17 | 16 | sudo apt install python3 python3-pip npm # debian, ubuntu, mint, ... |
18 | 17 | sudo pkg install python36 py36-sqlite3 py36-pip py36-setuptools npm # FreeBSD |
18 | +sudo port install python37 py37-pip py37-setuptools npm6 # MacOS | |
19 | 19 | ``` |
20 | 20 | |
21 | -The file `~/.config/pip/pip.conf` should be configured to the following: | |
21 | +The file `pip.conf` should be configured to the following: | |
22 | 22 | |
23 | 23 | ```ini |
24 | 24 | [global] |
... | ... | @@ -28,21 +28,25 @@ user=yes |
28 | 28 | format=columns |
29 | 29 | ``` |
30 | 30 | |
31 | -Note: In MacOS this file is in `~/Library/Application Support/pip/pip.conf`. | |
31 | +The file is in `~/.config/pip/` in Linux/FreeBSD and `~/Library/Application Support/pip/pip.conf` in MacOS. | |
32 | + | |
32 | 33 | |
33 | 34 | --- |
34 | 35 | |
35 | 36 | ## 2. Installation |
36 | 37 | |
37 | -Download and install: | |
38 | +Download and install (`USERNAME` is your account on bitbucket): | |
38 | 39 | |
39 | 40 | ```bash |
40 | 41 | git clone https://USERNAME@bitbucket.org/USERNAME/perguntations.git |
41 | -pip3 install --user perguntations | |
42 | +cd perguntations | |
43 | +npm install | |
44 | +pip3 install . | |
42 | 45 | ``` |
43 | 46 | |
44 | -where `USERNAME` is your account on bitbucket. | |
45 | -This will also install any dependencies required to run the software. | |
47 | +The command `npm` installs the javascript libraries and `pip3` installs the | |
48 | +python webserver. | |
49 | +This will also automatically install the python dependencies required. | |
46 | 50 | |
47 | 51 | --- |
48 | 52 | |
... | ... | @@ -53,12 +57,11 @@ To generate certificates, there are two possibilities: public server with |
53 | 57 | static IP address or a private server on a local network. |
54 | 58 | |
55 | 59 | Certificates must be saved in the `$XDG_DATA_HOME` path if defined in the |
56 | -environment, otherwise in `~/.local/share/certs`. | |
57 | - | |
58 | -Create the directory if needed: | |
60 | +environment, otherwise in `~/.local/share/certs` (I will assume the latter | |
61 | +case). | |
59 | 62 | |
60 | 63 | ```bash |
61 | -[ ! -z "$XDG_DATA_HOME" ] || mkdir -p ~/.local/share/certs | |
64 | +mkdir -p ~/.local/share/certs | |
62 | 65 | ``` |
63 | 66 | |
64 | 67 | ### Selfsigned certificates |
... | ... | @@ -67,7 +70,7 @@ Self-signed certificates are not certified by a recognised authority and |
67 | 70 | browsers will complain that the certificate is not trusted. |
68 | 71 | |
69 | 72 | ```bash |
70 | -cd WHERE/TO/PUT/CERTS | |
73 | +cd ~/.local/share/certs | |
71 | 74 | openssl req -x509 -newkey rsa:4096 -keyout privkey.pem -out cert.pem -days 365 -nodes |
72 | 75 | ``` |
73 | 76 | |
... | ... | @@ -77,14 +80,14 @@ Generating certificates for a public server (FreeBSD) requires a registered |
77 | 80 | domain with fixed IP. |
78 | 81 | |
79 | 82 | ```sh |
80 | -sudo pkg install py27-certbot # FreeBSD | |
83 | +sudo pkg install py27-certbot # FreeBSD | |
81 | 84 | sudo service pf stop # disable pf firewall (FreeBSD) |
82 | 85 | sudo certbot certonly --standalone -d www.example.com |
83 | 86 | sudo service pf start # enable pf firewall |
84 | 87 | ``` |
85 | 88 | |
86 | 89 | Certificates are saved in `/usr/local/etc/letsencrypt/live/www.example.com/`. |
87 | -Copy them to the appropriate `certs` directory and change permissions: | |
90 | +Copy them to the `certs` directory and change permissions: | |
88 | 91 | |
89 | 92 | ```sh |
90 | 93 | chmod 400 cert.pem privkey.pem |
... | ... | @@ -101,77 +104,57 @@ sudo service pf start # start firewall |
101 | 104 | Again, copy certificate files `privkey.pem` and `cert.pem` to the `certs` |
102 | 105 | directory. |
103 | 106 | |
104 | ---- | |
105 | - | |
106 | -## Installing 3rd party javascript libraries | |
107 | - | |
108 | -The javascript libraries are not included in the repository. | |
109 | -The following libraries are currently necessary (as of 24/1/2019): | |
110 | - | |
111 | -``` | |
112 | -DataTables | |
113 | -MDB-Free_4 | |
114 | -MathJax-2.7.5 | |
115 | -bootstrap-4.2.1-dist | |
116 | -codemirror-5.42.2 | |
117 | -fontawesome-free-5.6.3-web | |
118 | -jquery-3.3.1.min.js | |
119 | -popper.min.js | |
120 | -``` | |
121 | - | |
122 | -Downloaded and install them in the directory perguntations/static/lib. | |
123 | - | |
124 | -FIXME: use `npm` | |
125 | 107 | |
126 | 108 | --- |
127 | 109 | |
128 | 110 | ## Running a demo |
129 | 111 | |
130 | -The directory `demo` includes a demo test that can be used as a template for | |
131 | -your own tests and questions. | |
112 | +The directory `demo` in the repository includes a demo test that can be used | |
113 | +as a template for your own tests and questions. | |
132 | 114 | |
133 | 115 | To run the demonstration test you need to initialize the database using one of |
134 | 116 | the following methods: |
135 | 117 | |
136 | 118 | ```.bash |
137 | -./initdb.py students.csv # initialize from a CSV file | |
138 | -./initdb.py --admin # only adds the administrator account | |
139 | -./initdb.py --add 123 "Asterix Gaules" # add one student | |
119 | +cd demo | |
140 | 120 | |
141 | -# a database file "students.db" is created | |
142 | -mv students.db demo/ | |
121 | +initdb students.csv # initialize from a CSV file | |
122 | +initdb --admin # only adds the administrator account | |
123 | +initdb --add 123 "Asterix Gaules" # add one student | |
143 | 124 | |
144 | -# create directory to save the finished tests | |
145 | -mkdir demo/ans | |
125 | +mkdir ans # directory where the student tests are saved | |
146 | 126 | |
147 | -# edit test configuration and check if everything looks right | |
148 | -vi demo/test-tutorial.yaml | |
149 | -``` | |
127 | +$EDITOR test-tutorial.yaml # edit test configuration | |
150 | 128 | |
151 | -We are now ready to run the server: | |
152 | - | |
153 | -```.bash | |
154 | -./serve.py --help # get help | |
155 | -./serve.py demo/test-tutorial.yaml # run demo test | |
129 | +perguntations --help # get help | |
130 | +perguntations tutorial.yaml # run demo test | |
156 | 131 | ``` |
157 | 132 | |
158 | -By default the server listens on port 8443 and on all IPs of all network interfaces. | |
159 | -Open the browser at `http://127.0.0.1:8443/` and login as user number `0` (administrator) and choose any password. Then | |
133 | +The server listens on port 8443 of all IPs of all network interfaces. | |
134 | +Open the browser at `http://127.0.0.1:8443/` and login as user number `0` | |
135 | +(administrator) and choose any password. The administrator is redirected to the | |
136 | +administration page that shows all the students and their state. | |
160 | 137 | |
161 | 138 | 1. Authorize students by clicking the checkboxes. |
162 | -2. Open a different browser at `http://127.0.0.1:8443/` and login as one of the authorized students. Answer the questions and submit. | |
139 | +2. Open a different browser at `http://127.0.0.1:8443/` and login as one of the | |
140 | +authorized students. Answer the questions and submit. | |
163 | 141 | |
164 | 142 | The server can be stoped from the terminal with `^C`. |
165 | 143 | |
166 | 144 | ## Running on lower ports 80 or 443 |
167 | 145 | |
168 | -Ports 80 and 443 are reserved for the root user and and this software _should NOT be run as root_. Instead, the firewall should be configured to forward tcp traffic from port 443 to 8443 where the server is listening. The details depend on the operating system. | |
146 | +Ports 80 and 443 are reserved for the root user and and this software **should | |
147 | +NOT be run as root**. | |
148 | +Instead, the firewall should be configured to forward tcp traffic from port 443 | |
149 | +to 8443 where the server is listening. | |
150 | +The details depend on the operating system. | |
169 | 151 | |
170 | 152 | ### debian: |
171 | 153 | |
154 | +FIXME: Untested | |
155 | + | |
172 | 156 | ```.bash |
173 | -iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 8080 | |
174 | -FIXME: also for port 443... | |
157 | +iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-ports 8443 | |
175 | 158 | ``` |
176 | 159 | |
177 | 160 | Explanation: |
... | ... | @@ -181,19 +164,20 @@ Explanation: |
181 | 164 | - `-p tcp` selected protocol. |
182 | 165 | - `-s 0/0` source network address/mask. |
183 | 166 | - `-i eth0` interface via which the packet was received. |
184 | -- `--dport 80` destination port. | |
167 | +- `--dport 443` destination port. | |
185 | 168 | - `-j REDIRECT` what to do when packet matches the rule. |
186 | -- `--to-ports 8080` where to redirect the packets. | |
169 | +- `--to-ports 8443` where to redirect the packets. | |
187 | 170 | |
188 | 171 | ### FreeBSD and pf |
189 | 172 | |
190 | 173 | Edit `/etc/pf.conf`: |
191 | 174 | |
192 | - ext_if="em0" | |
175 | + ext_if="wlan1" | |
193 | 176 | rdr on $ext_if proto tcp from any to any port 80 -> 127.0.0.1 port 8080 |
194 | 177 | rdr on $ext_if proto tcp from any to any port 443 -> 127.0.0.1 port 8443 |
195 | 178 | |
196 | -or `ext_if="vtnet0"` for guest additions under virtual box. | |
179 | +The `wlan1` should be the name of the network interface. | |
180 | +Use `ext_if="vtnet0"` for guest additions under virtual box. | |
197 | 181 | |
198 | 182 | Start firewall with `sudo service pf start`. |
199 | 183 | |
... | ... | @@ -211,10 +195,17 @@ Optionally, to activate pf on boot, edit `rc.conf`: |
211 | 195 | |
212 | 196 | ## Troubleshooting |
213 | 197 | |
214 | -* The server tries to run `python3` so this command must be accessible from user accounts. Currently, the minimum supported python version is 3.6. | |
215 | -* If you are getting any `UnicodeEncodeError` type of errors that's because the terminal is not supporting UTF-8. This error may occur when a unicode character is printed to the screen by the server or, when running question generator or correction scripts, a message is piped between the server and the scripts that includes unicode characters. | |
216 | -Try running `locale` on the terminal and see if there are any error messages. Solutions: | |
217 | - - debian: fix it with `sudo dpkg-reconfigure locales`, select your UTF-8 locales and try again. | |
198 | +* The server tries to run `python3` so this command must be accessible from | |
199 | +user accounts. Currently, the minimum supported python version is 3.6. | |
200 | + | |
201 | +* If you are getting any `UnicodeEncodeError` type of errors that's because the | |
202 | +terminal is not supporting UTF-8. | |
203 | +This error may occur when a unicode character is printed to the screen by the | |
204 | +server or, when running question generator or correction scripts, a message is | |
205 | +piped between the server and the scripts that includes unicode characters. | |
206 | +Try running `locale` on the terminal and see if there are any error messages. | |
207 | +Solutions: | |
208 | + - debian: `sudo dpkg-reconfigure locales` and select your UTF-8 locales. | |
218 | 209 | - FreeBSD: edit `~/.login_conf` to use UTF-8, for example: |
219 | 210 | |
220 | 211 | ``` | ... | ... |
demo/test-tutorial.yaml
... | ... | @@ -1,64 +0,0 @@ |
1 | ---- | |
2 | -# ============================================================================ | |
3 | -# The test reference should be a unique identifier. It is saved in the database | |
4 | -# so that queries for the results can be done in the terminal with | |
5 | -# $ sqlite3 students.db "select * from tests where ref='demo'" | |
6 | -ref: tutorial | |
7 | - | |
8 | -# (optional, default: '') You may wish to refer the course, year or kind of test | |
9 | -title: Teste tutorial | |
10 | - | |
11 | -# (optional) duration in minutes, 0 or undefined is infinite | |
12 | -duration: 120 | |
13 | - | |
14 | -# Database with student credentials and grades of all questions and tests done | |
15 | -# The database is an sqlite3 file generate with the script initdb.py | |
16 | -database: demo/students.db | |
17 | - | |
18 | -# Generate a file for each test done by a student. | |
19 | -# It includes the questions, answers and grades. | |
20 | -answers_dir: demo/ans | |
21 | - | |
22 | -# (optional, default: False) Show points for each question, scale 0-20. | |
23 | -show_points: true | |
24 | -# scale_points: True | |
25 | -# scale_max: 20 | |
26 | - | |
27 | -# (optional, default: False) Show hints if available | |
28 | -show_hints: true | |
29 | - | |
30 | -# (optional, default: False) Show lots of information for debugging | |
31 | -# debug: True | |
32 | - | |
33 | - | |
34 | -# ---------------------------------------------------------------------------- | |
35 | -# Base path applied to the questions files and all the scripts | |
36 | -# including question generators and correctors. | |
37 | -# Either absolute path or relative to current directory can be used. | |
38 | -questions_dir: demo | |
39 | - | |
40 | -# (optional) List of files containing questions in yaml format. | |
41 | -# Selected questions will be obtained from these files. | |
42 | -# If undefined, all yaml files in questions_dir are loaded (not recommended). | |
43 | -files: | |
44 | - - questions/questions-tutorial.yaml | |
45 | - | |
46 | -# This is the list of questions that will make up the test. | |
47 | -# The order is preserved. | |
48 | -# There are several ways to define each question (explained below). | |
49 | -questions: | |
50 | - - tut-test | |
51 | - - tut-questions | |
52 | - | |
53 | - - tut-radio | |
54 | - - tut-checkbox | |
55 | - - tut-text | |
56 | - - tut-text-regex | |
57 | - - tut-numeric-interval | |
58 | - - ref: tut-textarea | |
59 | - points: 2.0 | |
60 | - | |
61 | - - tut-information | |
62 | - - tut-success | |
63 | - - tut-warning | |
64 | - - tut-alert |
... | ... | @@ -0,0 +1,57 @@ |
1 | +--- | |
2 | +# ============================================================================ | |
3 | +# The test reference should be a unique identifier. It is saved in the database | |
4 | +# so that queries for the results can be done in the terminal with | |
5 | +# $ sqlite3 students.db "select * from tests where ref='demo'" | |
6 | +ref: tutorial | |
7 | + | |
8 | +# (optional, default: '') You may wish to refer the course, year or kind of test | |
9 | +title: Teste de demonstração (tutorial) | |
10 | + | |
11 | +# (optional) duration in minutes, 0 or undefined is infinite | |
12 | +duration: 120 | |
13 | + | |
14 | +# Database with student credentials and grades of all questions and tests done | |
15 | +# The database is an sqlite3 file generate with the script initdb.py | |
16 | +database: demo/students.db | |
17 | + | |
18 | +# Generate a file for each test done by a student. | |
19 | +# It includes the questions, answers and grades. | |
20 | +answers_dir: demo/ans | |
21 | + | |
22 | +# (optional, default: False) Show points for each question, scale 0-20. | |
23 | +show_points: true | |
24 | +# scale_points: true | |
25 | +# scale_max: 20 | |
26 | + | |
27 | +# ---------------------------------------------------------------------------- | |
28 | +# Base path applied to the questions files and all the scripts | |
29 | +# including question generators and correctors. | |
30 | +# Either absolute path or relative to current directory can be used. | |
31 | +questions_dir: demo | |
32 | + | |
33 | +# (optional) List of files containing questions in yaml format. | |
34 | +# Selected questions will be obtained from these files. | |
35 | +# If undefined, all yaml files in questions_dir are loaded (not recommended). | |
36 | +files: | |
37 | + - questions/questions-tutorial.yaml | |
38 | + | |
39 | +# This is the list of questions that will make up the test. | |
40 | +# The order is preserved. | |
41 | +# There are several ways to define each question (explained below). | |
42 | +questions: | |
43 | + - tut-test | |
44 | + - tut-questions | |
45 | + | |
46 | + - tut-radio | |
47 | + - tut-checkbox | |
48 | + - tut-text | |
49 | + - tut-text-regex | |
50 | + - tut-numeric-interval | |
51 | + - ref: tut-textarea | |
52 | + points: 2.0 | |
53 | + | |
54 | + - tut-information | |
55 | + - tut-success | |
56 | + - tut-warning | |
57 | + - tut-alert | ... | ... |
... | ... | @@ -0,0 +1,44 @@ |
1 | +{ | |
2 | + "requires": true, | |
3 | + "lockfileVersion": 1, | |
4 | + "dependencies": { | |
5 | + "@fortawesome/fontawesome-free": { | |
6 | + "version": "5.7.1", | |
7 | + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.7.1.tgz", | |
8 | + "integrity": "sha512-gukWJ7Mwf0WXQbkcwcm5zi8+H8aT5MMnphf5hpydOw898H1ibgm2cyejHgk6Km/FTvrPp5ppUHLrlFwt0QxsQw==" | |
9 | + }, | |
10 | + "bootstrap": { | |
11 | + "version": "4.3.0", | |
12 | + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.0.tgz", | |
13 | + "integrity": "sha512-M0vqY0Z6UDweV2nLFl5dXcb+GIo53EBCGMMVxCGH5vJxl/jsr+HkULBMd4kn9rdpdBZwd3BduCgMOYOwJybo4Q==" | |
14 | + }, | |
15 | + "codemirror": { | |
16 | + "version": "5.43.0", | |
17 | + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.43.0.tgz", | |
18 | + "integrity": "sha512-mljwQWUaWIf85I7QwTBryF2ASaIvmYAL4s5UCanCJFfKeXOKhrqdHWdHiZWAMNT+hjLTCnVx2S/SYTORIgxsgA==" | |
19 | + }, | |
20 | + "datatables": { | |
21 | + "version": "1.10.18", | |
22 | + "resolved": "https://registry.npmjs.org/datatables/-/datatables-1.10.18.tgz", | |
23 | + "integrity": "sha512-ntatMgS9NN6UMpwbmO+QkYJuKlVeMA2Mi0Gu/QxyIh+dW7ZjLSDhPT2tWlzjpIWEkDYgieDzS9Nu7bdQCW0sbQ==", | |
24 | + "requires": { | |
25 | + "jquery": ">=1.7" | |
26 | + } | |
27 | + }, | |
28 | + "jquery": { | |
29 | + "version": "3.3.1", | |
30 | + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", | |
31 | + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" | |
32 | + }, | |
33 | + "mathjax": { | |
34 | + "version": "2.7.5", | |
35 | + "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-2.7.5.tgz", | |
36 | + "integrity": "sha512-OzsJNitEHAJB3y4IIlPCAvS0yoXwYjlo2Y4kmm9KQzyIBZt2d8yKRalby3uTRNN4fZQiGL2iMXjpdP1u2Rq2DQ==" | |
37 | + }, | |
38 | + "popper.js": { | |
39 | + "version": "1.14.7", | |
40 | + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.7.tgz", | |
41 | + "integrity": "sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ==" | |
42 | + } | |
43 | + } | |
44 | +} | ... | ... |
... | ... | @@ -0,0 +1,13 @@ |
1 | +{ | |
2 | + "description": "Javascript libraries required to run the server", | |
3 | + "email": "mjsb@uevora.pt", | |
4 | + "dependencies": { | |
5 | + "@fortawesome/fontawesome-free": "^5.7.1", | |
6 | + "bootstrap": "^4.3.0", | |
7 | + "codemirror": "^5.43.0", | |
8 | + "datatables": "^1.10.18", | |
9 | + "jquery": "^3.3.1", | |
10 | + "mathjax": "^2.7.5", | |
11 | + "popper.js": "^1.14.7" | |
12 | + } | |
13 | +} | ... | ... |
perguntations/static/README
... | ... | @@ -1,28 +0,0 @@ |
1 | -# Javascript libraries | |
2 | - | |
3 | -The javascript libraries should be installed in the `lib` directory. | |
4 | -Either make a `lib` directory here or a symbolic link to somewhere else. | |
5 | - | |
6 | -Currently, libs should contain: | |
7 | - | |
8 | - bootstrap | |
9 | - codemirror | |
10 | - DataTables | |
11 | - fontawesome | |
12 | - MathJax | |
13 | - | |
14 | -and the files: | |
15 | - | |
16 | - jquery.min.js | |
17 | - popper.min.js | |
18 | - | |
19 | -The DataTables directory was generated by https://www.datatables.net/download/ | |
20 | -Select: | |
21 | - | |
22 | -- styling: bootstrap4 | |
23 | -- packages: datatables | |
24 | -- extensions: responsive | |
25 | - | |
26 | -This will generate a zip that contains the directory `DataTables`. Expand the | |
27 | -zip into `lib`. | |
28 | - |
perguntations/templates/admin.html
... | ... | @@ -7,8 +7,8 @@ |
7 | 7 | <link rel="icon" href="/static/favicon.ico"> |
8 | 8 | |
9 | 9 | <!-- styles --> |
10 | - <link rel="stylesheet" type="text/css" href="/static/lib/bootstrap/css/bootstrap.min.css"> | |
11 | - <link rel="stylesheet" type="text/css" href="/static/lib/DataTables/datatables.min.css"/> | |
10 | + <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css"> | |
11 | + <link rel="stylesheet" type="text/css" href="/static/datatables/css/jquery.dataTables.min.css"/> | |
12 | 12 | |
13 | 13 | <style> |
14 | 14 | html { |
... | ... | @@ -20,11 +20,11 @@ |
20 | 20 | </style> |
21 | 21 | |
22 | 22 | <!-- Scripts --> |
23 | - <script src="/static/lib/jquery.min.js"></script> | |
24 | - <script defer src="/static/lib/fontawesome/js/all.min.js"></script> | |
25 | - <script defer src="/static/lib/popper.min.js"></script> | |
26 | - <script defer src="/static/lib/bootstrap/js/bootstrap.min.js"></script> | |
27 | - <script defer src="/static/lib/DataTables/datatables.min.js"></script> | |
23 | + <script src="/static/jquery/jquery.min.js"></script> | |
24 | + <script defer src="/static/popper.js/popper.min.js"></script> | |
25 | + <script defer src="/static/fontawesome-free/js/all.min.js"></script> | |
26 | + <script defer src="/static/bootstrap/js/bootstrap.min.js"></script> | |
27 | + <script defer src="/static/datatables/js/jquery.dataTables.min.js"></script> | |
28 | 28 | |
29 | 29 | <script defer src="/static/js/admin.js"></script> |
30 | 30 | <script defer src="/static/js/clock.js"></script> | ... | ... |
perguntations/templates/grade.html
... | ... | @@ -7,14 +7,15 @@ |
7 | 7 | <link rel="icon" href="/static/favicon.ico"> |
8 | 8 | |
9 | 9 | <!-- Styles --> |
10 | - <link rel="stylesheet" type="text/css" href="/static/lib/bootstrap/css/bootstrap.min.css"> | |
10 | + <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css"> | |
11 | + | |
11 | 12 | <link rel="stylesheet" type="text/css" href="/static/css/test.css"> |
12 | 13 | |
13 | 14 | <!-- Scripts --> |
14 | - <script defer src="/static/lib/fontawesome/js/all.min.js"></script> | |
15 | - <script defer src="/static/lib/jquery.min.js"></script> | |
16 | - <script defer src="/static/lib/popper.min.js"></script> | |
17 | - <script defer src="/static/lib/bootstrap/js/bootstrap.min.js"></script> | |
15 | + <script src="/static/jquery/jquery.min.js"></script> | |
16 | + <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/bootstrap/js/bootstrap.min.js"></script> | |
18 | 19 | </head> |
19 | 20 | <!-- ================================================================= --> |
20 | 21 | <body> | ... | ... |
perguntations/templates/login.html
... | ... | @@ -11,10 +11,10 @@ |
11 | 11 | <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css"> |
12 | 12 | |
13 | 13 | <!-- Scripts --> |
14 | - <script src="/static/lib/jquery.min.js"></script> | |
15 | - <script defer src="/static/lib/fontawesome/js/all.min.js"></script> | |
16 | - <script defer src="/static/lib/popper.min.js"></script> | |
17 | - <script defer src="/static/lib/bootstrap/js/bootstrap.min.js"></script> | |
14 | + <script src="/static/jquery/jquery.min.js"></script> | |
15 | + <script defer src="/static/popper.js/popper.min.js"></script> | |
16 | + <script defer src="/static/fontawesome-free/js/all.min.js"></script> | |
17 | + <script defer src="/static/bootstrap/js/bootstrap.min.js"></script> | |
18 | 18 | |
19 | 19 | </head> |
20 | 20 | <!-- =================================================================== --> | ... | ... |
perguntations/templates/review.html
... | ... | @@ -17,15 +17,15 @@ |
17 | 17 | <script defer type="text/javascript" src="/static/MathJax/MathJax.js?config=TeX-AMS_CHTML-full"></script> |
18 | 18 | |
19 | 19 | <!-- Styles --> |
20 | - <link rel="stylesheet" href="/static/lib/bootstrap/css/bootstrap.min.css"> | |
21 | - <link rel="stylesheet" href="/static/css/github.css"> <!-- syntax highlight --> | |
22 | - <link rel="stylesheet" href="/static/css/test.css"> | |
20 | + <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css"> | |
21 | + <link rel="stylesheet" type="text/css" href="/static/css/github.css"> <!-- syntax highlight --> | |
22 | + <link rel="stylesheet" type="text/css" href="/static/css/test.css"> | |
23 | 23 | |
24 | 24 | <!-- Scripts --> |
25 | - <script defer src="/static/lib/jquery.min.js"></script> | |
26 | - <script defer src="/static/lib/popper.min.js"></script> | |
27 | - <script defer src="/static/lib/bootstrap/js/bootstrap.min.js"></script> | |
28 | - <script defer src="/static/lib/fontawesome/js/all.min.js"></script> | |
25 | + <script src="/static/jquery/jquery.min.js"></script> | |
26 | + <script defer src="/static/popper.js/popper.min.js"></script> | |
27 | + <script defer src="/static/fontawesome-free/js/all.min.js"></script> | |
28 | + <script defer src="/static/bootstrap/js/bootstrap.min.js"></script> | |
29 | 29 | </head> |
30 | 30 | <!-- ===================================================================== --> |
31 | 31 | <body> | ... | ... |
perguntations/templates/test.html
... | ... | @@ -14,22 +14,22 @@ |
14 | 14 | } |
15 | 15 | }); |
16 | 16 | </script> |
17 | - <script type="text/javascript" src="/static/MathJax/MathJax.js?config=TeX-AMS_CHTML-full"></script> | |
17 | + <script type="text/javascript" src="/static/mathjax/MathJax.js?config=TeX-AMS_CHTML-full"></script> | |
18 | 18 | |
19 | 19 | <!-- Scripts --> |
20 | - <script src="/static/lib/jquery.min.js"></script> | |
21 | - <script defer src="/static/lib/popper.min.js"></script> | |
22 | - <script defer src="/static/lib/bootstrap/js/bootstrap.min.js"></script> | |
23 | - <script defer src="/static/lib/fontawesome/js/all.min.js"></script> | |
24 | - <script src="/static/lib/codemirror/lib/codemirror.js"></script> | |
25 | - <script src="/static/lib/codemirror/addon/selection/active-line.js"></script> | |
26 | - <script src="/static/lib/codemirror/addon/edit/matchbrackets.js"></script> | |
20 | + <script src="/static/jquery/jquery.min.js"></script> | |
21 | + <script defer src="/static/popper.js/popper.min.js"></script> | |
22 | + <script defer src="/static/fontawesome-free/js/all.min.js"></script> | |
23 | + <script defer src="/static/bootstrap/js/bootstrap.min.js"></script> | |
24 | + <script src="/static/codemirror/lib/codemirror.js"></script> | |
25 | + <script src="/static/codemirror/addon/selection/active-line.js"></script> | |
26 | + <script src="/static/codemirror/addon/edit/matchbrackets.js"></script> | |
27 | 27 | |
28 | 28 | <!-- Styles --> |
29 | - <link rel="stylesheet" type="text/css" href="/static/lib/bootstrap/css/bootstrap.min.css"> | |
29 | + <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css"> | |
30 | + <link rel="stylesheet" type="text/css" href="/static/codemirror/lib/codemirror.css"> | |
31 | + <link rel="stylesheet" type="text/css" href="/static/codemirror/theme/darcula.css"> | |
30 | 32 | <link rel="stylesheet" type="text/css" href="/static/css/github.css"> <!-- syntax highlight --> |
31 | - <link rel="stylesheet" type="text/css" href="/static/lib/codemirror/lib/codemirror.css"> | |
32 | - <link rel="stylesheet" type="text/css" href="/static/lib/codemirror/theme/darcula.css"> | |
33 | 33 | <link rel="stylesheet" type="text/css" href="/static/css/test.css"> |
34 | 34 | |
35 | 35 | <!-- My scripts --> | ... | ... |