diff --git a/BUGS.md b/BUGS.md index 3198500..adeb9d2 100644 --- a/BUGS.md +++ b/BUGS.md @@ -1,6 +1,7 @@ # BUGS +- MathJax safe mode?? (vi referencia a isto no ipython3.2 whats new) - alunos vêm nota final arredondada às decimas, mas é apenas um arredondamento visual. Pode acontecer o aluno chumbar, mas ver uma nota positiva (e.g. 9.46 mostra 9.5 e presume que esta aprovado). Mostrar 3 casas? - alunos podem entrar duas vezes em simultaneo. impedir, e permitir ao docente fazer kick-out - detectar se falta 'correct' nas perguntas. diff --git a/MANUAL.md b/MANUAL.md index 301eabf..d0de72e 100644 --- a/MANUAL.md +++ b/MANUAL.md @@ -8,6 +8,7 @@ Install python 3.4 and the following packages from pip: - Mako (1.0.1) - Markdown (2.6.2) - PyYAML (3.11) +- bcrypt (2.0.0) Before using the program you need to diff --git a/README.md b/README.md index 739454a..02b2b65 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ Installed using `pip3`: - Mako (1.0.1) - Markdown (2.6.2) - PyYAML (3.11) +- bcrypt (2.0.0) ### System setup: diff --git a/initdb_from_csv.py b/initdb_from_csv.py index 2f5396a..a819e82 100755 --- a/initdb_from_csv.py +++ b/initdb_from_csv.py @@ -3,9 +3,11 @@ import sqlite3 import csv -from optparse import OptionParser -from hashlib import sha256 -import os.path +# from optparse import OptionParser +import argparse +# from hashlib import sha512 +import bcrypt +import os import sys import string import re @@ -16,29 +18,50 @@ def fixname(s): # --------- Parse command line options ----------- -parser = OptionParser('usage: %prog [options] inputfile.csv') +argparser = argparse.ArgumentParser(description='Create new database from a CSV file (SIIUE format)') +argparser.add_argument('--db', default='students.db', type=str, help='database filename') +argparser.add_argument('--pw', default='', type=str, help='initial password') +argparser.add_argument('csvfile', type=str, help='CSV filename') +args = argparser.parse_args() -parser.add_option('--db', dest='db_filename', default='students.db', - help='database filename to create [default: %default]') +# parser = OptionParser('usage: %prog [options] inputfile.csv') -parser.add_option('--pw', dest='password', default='', - help='initial password [default: %default]') +# parser.add_option('--db', dest='db_filename', default='students.db', +# help='database filename to create [default: %default]') -(options, args) = parser.parse_args() +# parser.add_option('--pw', dest='password', default='', +# help='initial password [default: %default]') -if len(args) != 1: - print('You must specify a CSV file to import.\nUse option -h for help.') - sys.exit() +# (options, args) = parser.parse_args() -# terminate if db_filename exist -if os.path.exists(options.db_filename): - print('Database already exists. Please use a different name.') - sys.exit() +# if len(args) != 1: +# print('You must specify a CSV file to import.\nUse option -h for help.') +# sys.exit() -# -------- Create database ------------ -conn = sqlite3.connect(options.db_filename) -c = conn.cursor() +if os.path.exists(args.db): + print('Database already exists. Aborting...') + sys.exit(0) + +# -------- Parse CSV -------- +with open(args.csvfile, encoding='iso-8859-1') as csvfile: # SIIUE format + csvreader = csv.reader(csvfile, delimiter=';', quotechar='"') + next(csvreader) # ignore header + + rows = [] + for r in csvreader: + number = r[0] + name = fixname(r[1]) + password = bcrypt.hashpw(args.pw.encode('utf-8'), bcrypt.gensalt()) + rows.append((number, name, password)) + + # add professor (superuser) + number = '0' + name = 'Professor' + password = bcrypt.hashpw(args.pw.encode('utf-8'), bcrypt.gensalt()) + rows.append((number, name, password)) + +# ---- CREATE DATABASE AND INSERT DATA ---- sql_cmd = '''PRAGMA foreign_keys = ON; CREATE TABLE students ( number TEXT PRIMARY KEY, @@ -61,20 +84,7 @@ sql_cmd = '''PRAGMA foreign_keys = ON; time TEXT, FOREIGN KEY(student_id) REFERENCES students(number) );''' -c.executescript(sql_cmd) - -# -------- Parse CSV and insert into database -------- - -password = options.password # initial common password for all students -if password != '': - password = sha256(password.encode('utf-8')).hexdigest() - -with open(args[0], encoding='iso-8859-1') as csvfile: # SIIUE format - csvreader = csv.reader(csvfile, delimiter=';', quotechar='"') - next(csvreader) # ignore header - c.executemany('INSERT INTO students VALUES (?,?,?)', - [(row[0], fixname(row[1]), password) for row in csvreader]) - c.execute('INSERT INTO students VALUES ("0", "Professor", "")') - conn.commit() # commit DB changes - c.close() # close DB cursor +with sqlite3.connect(args.db) as c: + c.executescript(sql_cmd) + c.executemany('INSERT INTO students VALUES (?,?,?)', rows) -- libgit2 0.21.2