Commit e62cb00ea9774296f06b35a38dd799bfd8ccdb48
1 parent
0be0f447
Exists in
master
and in
1 other branch
- update README.md.
- minor changes in the code.
Showing
4 changed files
with
61 additions
and
33 deletions
Show diff stats
.gitignore
README.md
@@ -17,39 +17,44 @@ The webserver is a python application and requires `python3.7` and `pip` to be i | @@ -17,39 +17,44 @@ The webserver is a python application and requires `python3.7` and `pip` to be i | ||
17 | - SQLAlchemy | 17 | - SQLAlchemy |
18 | - bcrypt | 18 | - bcrypt |
19 | 19 | ||
20 | -These can be installed for a single user (recommended), in a python virtual environment or system wide. | 20 | +These can be installed for a single user, in a python virtual environment or system wide. |
21 | 21 | ||
22 | -#### Installing packages for a single user (recommended) | 22 | +#### Installing packages for a single user |
23 | 23 | ||
24 | ```.bash | 24 | ```.bash |
25 | -pip3 install --user tornado mistune pyyaml pygments sqlalchemy bcrypt markdown | 25 | +pip3 install --user tornado mistune pyyaml pygments sqlalchemy bcrypt |
26 | ``` | 26 | ``` |
27 | 27 | ||
28 | #### Installing packages in a virtual environment (alternative) | 28 | #### Installing packages in a virtual environment (alternative) |
29 | 29 | ||
30 | ```bash | 30 | ```bash |
31 | -pyvenv-3.6 venv/perguntations # or other virtualenv directory | ||
32 | -source venv/perguntations/bin/activate # activate virtualenv | 31 | +python3 -m venv PATH/TO/VENV/perguntations |
32 | +source PATH/TO/VENV/perguntations/bin/activate # activate virtualenv | ||
33 | 33 | ||
34 | pip3 install tornado mistune pyyaml pygments sqlalchemy bcrypt markdown | 34 | pip3 install tornado mistune pyyaml pygments sqlalchemy bcrypt markdown |
35 | ``` | 35 | ``` |
36 | 36 | ||
37 | #### Installing packages system wide (alternative) | 37 | #### Installing packages system wide (alternative) |
38 | 38 | ||
39 | -I personally prefer python packages to be installed for a single user, but if a system wide installation is required, it is probably better to use the operating system package manager instead of `pip`: | 39 | +I personally prefer python packages to be installed for a single user, but if a system wide installation is required, the operating system package manager should be used: |
40 | 40 | ||
41 | Linux: | 41 | Linux: |
42 | 42 | ||
43 | ```bash | 43 | ```bash |
44 | -apt-get install py37-tornado py37-mistune? py37-yaml py37-pygments... | 44 | +apt install python3-tornado python3-mistune python3-yaml python3-pygments... |
45 | ``` | 45 | ``` |
46 | 46 | ||
47 | macOS macports: | 47 | macOS macports: |
48 | 48 | ||
49 | ```bash | 49 | ```bash |
50 | -port install py37-py37-tornado py37-mistune? py37-yaml py37-pygments... | 50 | +port install py37-tornado py37-mistune py37-yaml py37-pygments... |
51 | ``` | 51 | ``` |
52 | 52 | ||
53 | +FreeBSD: | ||
54 | + | ||
55 | +```bash | ||
56 | +pkg install py37-tornado py37-mistune py37-yaml py37-pygments... | ||
57 | +``` | ||
53 | 58 | ||
54 | ### 1.2 Install and setup perguntations | 59 | ### 1.2 Install and setup perguntations |
55 | 60 | ||
@@ -65,6 +70,22 @@ where USERNAME is your account on bitbucket. | @@ -65,6 +70,22 @@ where USERNAME is your account on bitbucket. | ||
65 | The server will run an https server and requires valid certificates. | 70 | The server will run an https server and requires valid certificates. |
66 | To generate certificates, there are two possibilities: public server with static IP address or a private server. | 71 | To generate certificates, there are two possibilities: public server with static IP address or a private server. |
67 | 72 | ||
73 | +The thirdparty javascript libraries are not included in the repository. They should be downloaded and installed in the directory perguntations/static/lib. | ||
74 | + | ||
75 | +The following libraries are currently necessary (as of 24/1/2019): | ||
76 | + | ||
77 | +``` | ||
78 | +DataTables | ||
79 | +MDB-Free_4 | ||
80 | +MathJax-2.7.5 | ||
81 | +bootstrap-4.2.1-dist | ||
82 | +codemirror-5.42.2 | ||
83 | +fontawesome-free-5.6.3-web | ||
84 | +jquery-3.3.1.min.js | ||
85 | +popper.min.js | ||
86 | +``` | ||
87 | + | ||
88 | + | ||
68 | #### Generating certificates for a public server (FreeBSD) | 89 | #### Generating certificates for a public server (FreeBSD) |
69 | 90 | ||
70 | ```sh | 91 | ```sh |
@@ -153,6 +174,7 @@ Ports 80 and 443 are reserved for the root user and and this software _should NO | @@ -153,6 +174,7 @@ Ports 80 and 443 are reserved for the root user and and this software _should NO | ||
153 | 174 | ||
154 | ```.bash | 175 | ```.bash |
155 | iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 8080 | 176 | iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 8080 |
177 | +FIXME: also for port 443... | ||
156 | ``` | 178 | ``` |
157 | 179 | ||
158 | Explanation: | 180 | Explanation: |
@@ -176,7 +198,9 @@ Edit `/etc/pf.conf`: | @@ -176,7 +198,9 @@ Edit `/etc/pf.conf`: | ||
176 | 198 | ||
177 | or `ext_if="vtnet0"` for guest additions under virtual box. | 199 | or `ext_if="vtnet0"` for guest additions under virtual box. |
178 | 200 | ||
179 | -Edit `rc.conf` | 201 | +Start firewall with `sudo service pf start`. |
202 | + | ||
203 | +Optionally, to activate pf on boot, edit `rc.conf`: | ||
180 | 204 | ||
181 | pf_enable="YES" | 205 | pf_enable="YES" |
182 | pf_flags="" | 206 | pf_flags="" |
@@ -187,11 +211,10 @@ Edit `rc.conf` | @@ -187,11 +211,10 @@ Edit `rc.conf` | ||
187 | pflog_flags="" | 211 | pflog_flags="" |
188 | pflog_logfile="/var/log/pflog" | 212 | pflog_logfile="/var/log/pflog" |
189 | 213 | ||
190 | -Reboot. | ||
191 | 214 | ||
192 | ## Troubleshooting | 215 | ## Troubleshooting |
193 | 216 | ||
194 | -* The server tries to run `python3.6` so this command must be accessible from user accounts. | 217 | +* The server tries to run `python3` so this command must be accessible from user accounts. Currently, the minimum supported python version is 3.6. |
195 | * 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. | 218 | * 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. |
196 | Try running `locale` on the terminal and see if there are any error messages. Solutions: | 219 | Try running `locale` on the terminal and see if there are any error messages. Solutions: |
197 | - debian: fix it with `sudo dpkg-reconfigure locales`, select your UTF-8 locales and try again. | 220 | - debian: fix it with `sudo dpkg-reconfigure locales`, select your UTF-8 locales and try again. |
@@ -212,4 +235,4 @@ Try running `locale` on the terminal and see if there are any error messages. So | @@ -212,4 +235,4 @@ Try running `locale` on the terminal and see if there are any error messages. So | ||
212 | 235 | ||
213 | ### Contacts ### | 236 | ### Contacts ### |
214 | 237 | ||
215 | -* Miguel Barão mjsb@uevora.pt | ||
216 | \ No newline at end of file | 238 | \ No newline at end of file |
239 | +* Miguel Barão mjsb@uevora.pt |
models.py
@@ -21,7 +21,10 @@ class Student(Base): | @@ -21,7 +21,10 @@ class Student(Base): | ||
21 | questions = relationship('Question', back_populates='student') | 21 | questions = relationship('Question', back_populates='student') |
22 | 22 | ||
23 | def __repr__(self): | 23 | def __repr__(self): |
24 | - return 'Student:\n id: "{0}"\n name: "{1}"\n password: "{2}"'.format(self.id, self.name, self.password) | 24 | + return f'Student:\n\ |
25 | + id: "{self.id}"\n\ | ||
26 | + name: "{self.name}"\n\ | ||
27 | + password: "{self.password}"' | ||
25 | 28 | ||
26 | 29 | ||
27 | # --------------------------------------------------------------------------- | 30 | # --------------------------------------------------------------------------- |
@@ -43,17 +46,17 @@ class Test(Base): | @@ -43,17 +46,17 @@ class Test(Base): | ||
43 | questions = relationship('Question', back_populates='test') | 46 | questions = relationship('Question', back_populates='test') |
44 | 47 | ||
45 | def __repr__(self): | 48 | def __repr__(self): |
46 | - return 'Test:\n\ | ||
47 | - id: "{}"\n\ | ||
48 | - ref="{}"\n\ | ||
49 | - title="{}"\n\ | ||
50 | - grade="{}"\n\ | ||
51 | - state="{}"\n\ | ||
52 | - comment="{}"\n\ | ||
53 | - starttime="{}"\n\ | ||
54 | - finishtime="{}"\n\ | ||
55 | - filename="{}"\n\ | ||
56 | - student_id="{}"\n'.format(self.id, self.ref, self.title, self.grade, self.state, self.comment, self.starttime, self.finishtime, self.filename, self.student_id) | 49 | + return f'Test:\n\ |
50 | + id: "{self.id}"\n\ | ||
51 | + ref: "{self.ref}"\n\ | ||
52 | + title: "{self.title}"\n\ | ||
53 | + grade: "{self.grade}"\n\ | ||
54 | + state: "{self.state}"\n\ | ||
55 | + comment: "{self.comment}"\n\ | ||
56 | + starttime: "{self.starttime}"\n\ | ||
57 | + finishtime: "{self.finishtime}"\n\ | ||
58 | + filename: "{self.filename}"\n\ | ||
59 | + student_id: "{self.student_id}"\n' | ||
57 | 60 | ||
58 | 61 | ||
59 | # --------------------------------------------------------------------------- | 62 | # --------------------------------------------------------------------------- |
@@ -72,14 +75,14 @@ class Question(Base): | @@ -72,14 +75,14 @@ class Question(Base): | ||
72 | test = relationship('Test', back_populates='questions') | 75 | test = relationship('Test', back_populates='questions') |
73 | 76 | ||
74 | def __repr__(self): | 77 | def __repr__(self): |
75 | - return 'Question:\n\ | ||
76 | - id: "{}"\n\ | ||
77 | - ref: "{}"\n\ | ||
78 | - grade: "{}"\n\ | ||
79 | - starttime: "{}"\n\ | ||
80 | - finishtime: "{}"\n\ | ||
81 | - student_id: "{}"\n\ | ||
82 | - test_id: "{}"\n'.fotmat(self.id, self.ref, self.grade, self.starttime, self.finishtime, self.student_id, self.test_id) | 78 | + return f'Question:\n\ |
79 | + id: "{self.id}"\n\ | ||
80 | + ref: "{self.ref}"\n\ | ||
81 | + grade: "{self.grade}"\n\ | ||
82 | + starttime: "{self.starttime}"\n\ | ||
83 | + finishtime: "{self.finishtime}"\n\ | ||
84 | + student_id: "{self.student_id}"\n\ | ||
85 | + test_id: "{self.test_id}"\n' | ||
83 | 86 | ||
84 | 87 | ||
85 | # --------------------------------------------------------------------------- | 88 | # --------------------------------------------------------------------------- |
serve.py
@@ -168,6 +168,7 @@ class FileHandler(BaseHandler): | @@ -168,6 +168,7 @@ class FileHandler(BaseHandler): | ||
168 | self.write(data) | 168 | self.write(data) |
169 | await self.flush() | 169 | await self.flush() |
170 | 170 | ||
171 | + break # for loop | ||
171 | 172 | ||
172 | # ------------------------------------------------------------------------- | 173 | # ------------------------------------------------------------------------- |
173 | # Test shown to students | 174 | # Test shown to students |