Commit 1da435f293b01af9df0b88e19558ad5e75811e69
1 parent
c8de491d
Exists in
master
and in
1 other branch
Documentation updates and changed the python3.4 to python3 so that other versions can be used
Showing
7 changed files
with
56 additions
and
42 deletions
Show diff stats
README.md
@@ -3,38 +3,52 @@ | @@ -3,38 +3,52 @@ | ||
3 | 3 | ||
4 | ### Requirements: | 4 | ### Requirements: |
5 | 5 | ||
6 | -Installed using `pip3`: | 6 | +The webserver is a python3 application and only requires python to be installed. Versions 3.3, 3.4 and 3.5 should be Ok. It does not require any other webserver (apache, ...) |
7 | 7 | ||
8 | -- CherryPy (3.7.0) | ||
9 | -- Mako (1.0.1) | ||
10 | -- Markdown (2.6.2) | ||
11 | -- PyYAML (3.11) | ||
12 | -- bcrypt (2.0.0) | 8 | +Installed using `pip`: |
9 | + | ||
10 | +- CherryPy (>=3.7.0) | ||
11 | +- Mako (>=1.0.1) | ||
12 | +- Markdown (>=2.6.2) | ||
13 | +- PyYAML (>=3.11) | ||
14 | +- bcrypt (>=2.0.0) | ||
13 | 15 | ||
14 | ### System setup: | 16 | ### System setup: |
15 | 17 | ||
16 | -Open a terminal and navigate to a directory where this software is to be installed, e.g. `/var/www`. Then run the following commands: | 18 | +Open a terminal and navigate to a directory where this software is to be installed, e.g. `/var/www` or `/home/username`. |
19 | +Run the following commands: | ||
17 | 20 | ||
18 | -``` | ||
19 | -#!bash | 21 | +```.bash |
22 | + | ||
23 | +cd WHERE/TO/PUT/THE/SOFTWARE | ||
20 | 24 | ||
21 | -# get the software using git | 25 | +# get software using git |
22 | git clone https://mjsb@bitbucket.org/mjsb/perguntations.git | 26 | git clone https://mjsb@bitbucket.org/mjsb/perguntations.git |
23 | cd perguntations | 27 | cd perguntations |
24 | 28 | ||
25 | # create database in the directory db/ | 29 | # create database in the directory db/ |
26 | -initdb_from_csv.py siiue.csv | 30 | +./initdb_from_csv.py YOUR_CSV_FILE_HERE |
27 | mkdir db | 31 | mkdir db |
28 | mv students.db db | 32 | mv students.db db |
29 | 33 | ||
30 | -# update test configuration | ||
31 | -vi demo/test.yaml # update students_db | 34 | +# update test configuration with the correct database file. |
35 | +vi demo/test.yaml | ||
36 | +# Edit line 7 to something like | ||
37 | +# database: db/students.db | ||
38 | + | ||
39 | +# get help | ||
40 | +./serve.py --help | ||
32 | 41 | ||
33 | # run demo test | 42 | # run demo test |
34 | -./serve demo/test.yaml | 43 | +./serve.py demo/test.yaml |
44 | + | ||
45 | +# open browser at http://127.0.0.1:8080/ | ||
46 | +# the professor is number 0 | ||
47 | + | ||
48 | +# ^C to terminate the server | ||
35 | ``` | 49 | ``` |
36 | 50 | ||
37 | -(For the time being, also create `ans`, `questions`, `tests`, `scripts`, `sessions` in the same directory, until paths are fixed) | 51 | +(FIXME For the time being, also create `ans`, `questions`, `tests`, `scripts`, `sessions` in the same directory, until paths are fixed) |
38 | 52 | ||
39 | ### Contribute ### | 53 | ### Contribute ### |
40 | 54 |
demo/correct-question.py
demo/generate-question.py
demo/questions.yaml
1 | - | 1 | - |
2 | ref: solar-system-jupiter | 2 | ref: solar-system-jupiter |
3 | type: radio | 3 | type: radio |
4 | - text: Which one is the largest planet? | 4 | + text: Qual dos seguintes é o maior planeta? |
5 | options: | 5 | options: |
6 | - Jupiter | 6 | - Jupiter |
7 | - Mercury | 7 | - Mercury |
@@ -10,12 +10,12 @@ | @@ -10,12 +10,12 @@ | ||
10 | correct: 0 | 10 | correct: 0 |
11 | shuffle: True | 11 | shuffle: True |
12 | discount: True | 12 | discount: True |
13 | - hint: Just don't choose the wrong ones | 13 | + hint: Também é o mais pesado. |
14 | # --------------------------------------------------------------------------- | 14 | # --------------------------------------------------------------------------- |
15 | - | 15 | - |
16 | ref: solar-system-mars | 16 | ref: solar-system-mars |
17 | type: checkbox | 17 | type: checkbox |
18 | - text: Which ones are correct? | 18 | + text: Quais das seguintes expressões são verdadeiras? |
19 | options: | 19 | options: |
20 | - $1 > 0$ | 20 | - $1 > 0$ |
21 | - $-1 > 1$ | 21 | - $-1 > 1$ |
@@ -24,28 +24,28 @@ | @@ -24,28 +24,28 @@ | ||
24 | correct: [1, -1, 1, 0.5] | 24 | correct: [1, -1, 1, 0.5] |
25 | # optional | 25 | # optional |
26 | discount: True | 26 | discount: True |
27 | - hint: There are three. | 27 | + hint: Uma delas é falsa. |
28 | # --------------------------------------------------------------------------- | 28 | # --------------------------------------------------------------------------- |
29 | - | 29 | - |
30 | ref: question-v1 | 30 | ref: question-v1 |
31 | type: text | 31 | type: text |
32 | - text: What's your favorite basic color? | ||
33 | - correct: ['blue', 'green'] | ||
34 | - hint: It's not red. | 32 | + text: Qual é a minha cor básica favorita? |
33 | + correct: ['Azul', 'Verde'] | ||
34 | + hint: Só há 3 cores básicas e não gosto de vermelho. | ||
35 | # --------------------------------------------------------------------------- | 35 | # --------------------------------------------------------------------------- |
36 | - | 36 | - |
37 | ref: question-v2 | 37 | ref: question-v2 |
38 | type: text_regex | 38 | type: text_regex |
39 | - text: What's my favorite basic color? | ||
40 | - correct: '[bB]lue' | ||
41 | - hint: It's not red. | 39 | + text: Qual é a minha cor básica favorita? |
40 | + correct: '[aA]zul' | ||
41 | + hint: O céu é... | ||
42 | # --------------------------------------------------------------------------- | 42 | # --------------------------------------------------------------------------- |
43 | - | 43 | - |
44 | ref: question-colors | 44 | ref: question-colors |
45 | type: textarea | 45 | type: textarea |
46 | - text: Write names of the three basic colors. | 46 | + text: Escreva o nome de três cores básicas. |
47 | correct: correct-question.py | 47 | correct: correct-question.py |
48 | - hint: They start by RGB and order does not matter. | 48 | + hint: Qualquer ordem serve. |
49 | # --------------------------------------------------------------------------- | 49 | # --------------------------------------------------------------------------- |
50 | - | 50 | - |
51 | ref: question-whatever | 51 | ref: question-whatever |
@@ -58,14 +58,14 @@ | @@ -58,14 +58,14 @@ | ||
58 | - | 58 | - |
59 | ref: one-question | 59 | ref: one-question |
60 | type: information | 60 | type: information |
61 | - text: Please do not cheat. | 61 | + text: Não vale fazer batota. |
62 | # --------------------------------------------------------------------------- | 62 | # --------------------------------------------------------------------------- |
63 | - | 63 | - |
64 | ref: another-question | 64 | ref: another-question |
65 | # type: information (default) | 65 | # type: information (default) |
66 | text: | | 66 | text: | |
67 | - The text of questions is parsed as __markdown__ and can include | ||
68 | - LaTeX formulas $\sqrt{2\pi}$ and pretty code | 67 | + O texto das perguntas é escrito em __markdown__ e pode incluir formulas em |
68 | + LaTeX $\sqrt{2\pi}$ e código lindinho | ||
69 | 69 | ||
70 | ```.C | 70 | ```.C |
71 | int main() { | 71 | int main() { |
demo/test.yaml
@@ -4,7 +4,7 @@ title: Teste de Demonstração | @@ -4,7 +4,7 @@ title: Teste de Demonstração | ||
4 | 4 | ||
5 | # database contains students+passwords, final results of the tests, and questions done | 5 | # database contains students+passwords, final results of the tests, and questions done |
6 | # database: path/to/students.db | 6 | # database: path/to/students.db |
7 | -database: inscritos.db | 7 | +database: db/students.db |
8 | 8 | ||
9 | # this will generate a file for each test done. The file is like a replacement | 9 | # this will generate a file for each test done. The file is like a replacement |
10 | # for a test done in paper. | 10 | # for a test done in paper. |
@@ -17,8 +17,8 @@ practice: True | @@ -17,8 +17,8 @@ practice: True | ||
17 | # debug: False | 17 | # debug: False |
18 | 18 | ||
19 | #----------------------------------------------------------------------------- | 19 | #----------------------------------------------------------------------------- |
20 | -# This is the base path applied to the questions files and all the scripts | ||
21 | -# including generators and correctors. | 20 | +# Base path applied to the questions files and all the scripts |
21 | +# including question generators and correctors. | ||
22 | # Either absolute path or relative to current directory. | 22 | # Either absolute path or relative to current directory. |
23 | path: demo | 23 | path: demo |
24 | # (Note: answers are saved in a different path defined in answers_dir) | 24 | # (Note: answers are saved in a different path defined in answers_dir) |
initdb_from_csv.py
serve.py
1 | -#!/usr/bin/env python3.4 | 1 | +#!/usr/bin/env python3 |
2 | # -*- coding: utf-8 -*- | 2 | # -*- coding: utf-8 -*- |
3 | 3 | ||
4 | # The program runs a web server where students login to answer a sequence of questions. | 4 | # The program runs a web server where students login to answer a sequence of questions. |
@@ -10,14 +10,14 @@ import argparse | @@ -10,14 +10,14 @@ import argparse | ||
10 | from os import path | 10 | from os import path |
11 | 11 | ||
12 | # path where this file is located | 12 | # path where this file is located |
13 | -server_path = path.dirname(path.realpath(__file__)) | 13 | +SERVER_PATH = path.dirname(path.realpath(__file__)) |
14 | +TEMPLATES_DIR = SERVER_PATH + '/templates' | ||
14 | 15 | ||
15 | # my code | 16 | # my code |
16 | from myauth import AuthController, require | 17 | from myauth import AuthController, require |
17 | import test | 18 | import test |
18 | import database | 19 | import database |
19 | 20 | ||
20 | -TEMPLATES_DIR = server_path + '/templates' | ||
21 | 21 | ||
22 | 22 | ||
23 | # ============================================================================ | 23 | # ============================================================================ |
@@ -153,7 +153,7 @@ class Root(object): | @@ -153,7 +153,7 @@ class Root(object): | ||
153 | # ============================================================================ | 153 | # ============================================================================ |
154 | def parse_arguments(): | 154 | def parse_arguments(): |
155 | argparser = argparse.ArgumentParser(description='Server for online tests. Enrolled students and tests have to be previously configured. Please read the documentation included with this software before running the server.') | 155 | argparser = argparse.ArgumentParser(description='Server for online tests. Enrolled students and tests have to be previously configured. Please read the documentation included with this software before running the server.') |
156 | - serverconf_file = path.normpath(path.join(server_path, 'config', 'server.conf')) | 156 | + serverconf_file = path.normpath(path.join(SERVER_PATH, 'config', 'server.conf')) |
157 | argparser.add_argument('--server', default=serverconf_file, type=str, help='server configuration file') | 157 | argparser.add_argument('--server', default=serverconf_file, type=str, help='server configuration file') |
158 | argparser.add_argument('--debug', action='store_true', | 158 | argparser.add_argument('--debug', action='store_true', |
159 | help='Show datastructures when rendering questions') | 159 | help='Show datastructures when rendering questions') |
@@ -178,7 +178,7 @@ if __name__ == '__main__': | @@ -178,7 +178,7 @@ if __name__ == '__main__': | ||
178 | 178 | ||
179 | print('=' * 79) | 179 | print('=' * 79) |
180 | print('- Title: %s' % testconf['title']) | 180 | print('- Title: %s' % testconf['title']) |
181 | - print('- StudentsDB: %s' % testconf['database']) | 181 | + print('- Database: %s' % testconf['database']) |
182 | print('- Questions:\n ', '\n '.join(testconf['files'])) | 182 | print('- Questions:\n ', '\n '.join(testconf['files'])) |
183 | print(' (%i questions read)' % len(testconf['questions'])) | 183 | print(' (%i questions read)' % len(testconf['questions'])) |
184 | print('-' * 79) | 184 | print('-' * 79) |
@@ -188,7 +188,7 @@ if __name__ == '__main__': | @@ -188,7 +188,7 @@ if __name__ == '__main__': | ||
188 | root = Root(testconf) | 188 | root = Root(testconf) |
189 | 189 | ||
190 | # --- Mount and run server. | 190 | # --- Mount and run server. |
191 | - cherrypy.config.update({'tools.staticdir.root': server_path}) | 191 | + cherrypy.config.update({'tools.staticdir.root': SERVER_PATH}) |
192 | cherrypy.quickstart(root, '/', config=arg.server) | 192 | cherrypy.quickstart(root, '/', config=arg.server) |
193 | cherrypy.log('Terminated OK ------------------------', 'APPLICATION') | 193 | cherrypy.log('Terminated OK ------------------------', 'APPLICATION') |
194 | print('\n- Server terminated OK') | 194 | print('\n- Server terminated OK') |