Commit 1da435f293b01af9df0b88e19558ad5e75811e69

Authored by Miguel Barao
1 parent c8de491d
Exists in master and in 1 other branch dev

Documentation updates and changed the python3.4 to python3 so that other versions can be used

@@ -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
1 -#!/usr/bin/env python3.4 1 +#!/usr/bin/env python3
2 2
3 import re 3 import re
4 import sys 4 import sys
demo/generate-question.py
1 -#!/usr/bin/env python3.4 1 +#!/usr/bin/env python3
2 2
3 from random import randint 3 from random import randint
4 import sys 4 import sys
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
1 -#!/usr/bin/env python3.4 1 +#!/usr/bin/env python3
2 # -*- coding: utf-8 -*- 2 # -*- coding: utf-8 -*-
3 3
4 import sqlite3 4 import sqlite3
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')