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') |