Commit fecc60f6e87a2ce27853f4bbf674b115a9063f5d
1 parent
ec4b5144
Exists in
master
and in
1 other branch
- initdb_from_csv.py now uses bcrypt instead of sha512, and argparse instead of optparse.
Showing
4 changed files
with
48 additions
and
35 deletions
Show diff stats
BUGS.md
| 1 | 1 | |
| 2 | 2 | # BUGS |
| 3 | 3 | |
| 4 | +- MathJax safe mode?? (vi referencia a isto no ipython3.2 whats new) | |
| 4 | 5 | - 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? |
| 5 | 6 | - alunos podem entrar duas vezes em simultaneo. impedir, e permitir ao docente fazer kick-out |
| 6 | 7 | - detectar se falta 'correct' nas perguntas. | ... | ... |
MANUAL.md
README.md
initdb_from_csv.py
| ... | ... | @@ -3,9 +3,11 @@ |
| 3 | 3 | |
| 4 | 4 | import sqlite3 |
| 5 | 5 | import csv |
| 6 | -from optparse import OptionParser | |
| 7 | -from hashlib import sha256 | |
| 8 | -import os.path | |
| 6 | +# from optparse import OptionParser | |
| 7 | +import argparse | |
| 8 | +# from hashlib import sha512 | |
| 9 | +import bcrypt | |
| 10 | +import os | |
| 9 | 11 | import sys |
| 10 | 12 | import string |
| 11 | 13 | import re |
| ... | ... | @@ -16,29 +18,50 @@ def fixname(s): |
| 16 | 18 | |
| 17 | 19 | |
| 18 | 20 | # --------- Parse command line options ----------- |
| 19 | -parser = OptionParser('usage: %prog [options] inputfile.csv') | |
| 21 | +argparser = argparse.ArgumentParser(description='Create new database from a CSV file (SIIUE format)') | |
| 22 | +argparser.add_argument('--db', default='students.db', type=str, help='database filename') | |
| 23 | +argparser.add_argument('--pw', default='', type=str, help='initial password') | |
| 24 | +argparser.add_argument('csvfile', type=str, help='CSV filename') | |
| 25 | +args = argparser.parse_args() | |
| 20 | 26 | |
| 21 | -parser.add_option('--db', dest='db_filename', default='students.db', | |
| 22 | - help='database filename to create [default: %default]') | |
| 27 | +# parser = OptionParser('usage: %prog [options] inputfile.csv') | |
| 23 | 28 | |
| 24 | -parser.add_option('--pw', dest='password', default='', | |
| 25 | - help='initial password [default: %default]') | |
| 29 | +# parser.add_option('--db', dest='db_filename', default='students.db', | |
| 30 | +# help='database filename to create [default: %default]') | |
| 26 | 31 | |
| 27 | -(options, args) = parser.parse_args() | |
| 32 | +# parser.add_option('--pw', dest='password', default='', | |
| 33 | +# help='initial password [default: %default]') | |
| 28 | 34 | |
| 29 | -if len(args) != 1: | |
| 30 | - print('You must specify a CSV file to import.\nUse option -h for help.') | |
| 31 | - sys.exit() | |
| 35 | +# (options, args) = parser.parse_args() | |
| 32 | 36 | |
| 33 | -# terminate if db_filename exist | |
| 34 | -if os.path.exists(options.db_filename): | |
| 35 | - print('Database already exists. Please use a different name.') | |
| 36 | - sys.exit() | |
| 37 | +# if len(args) != 1: | |
| 38 | +# print('You must specify a CSV file to import.\nUse option -h for help.') | |
| 39 | +# sys.exit() | |
| 37 | 40 | |
| 38 | -# -------- Create database ------------ | |
| 39 | -conn = sqlite3.connect(options.db_filename) | |
| 40 | -c = conn.cursor() | |
| 41 | 41 | |
| 42 | +if os.path.exists(args.db): | |
| 43 | + print('Database already exists. Aborting...') | |
| 44 | + sys.exit(0) | |
| 45 | + | |
| 46 | +# -------- Parse CSV -------- | |
| 47 | +with open(args.csvfile, encoding='iso-8859-1') as csvfile: # SIIUE format | |
| 48 | + csvreader = csv.reader(csvfile, delimiter=';', quotechar='"') | |
| 49 | + next(csvreader) # ignore header | |
| 50 | + | |
| 51 | + rows = [] | |
| 52 | + for r in csvreader: | |
| 53 | + number = r[0] | |
| 54 | + name = fixname(r[1]) | |
| 55 | + password = bcrypt.hashpw(args.pw.encode('utf-8'), bcrypt.gensalt()) | |
| 56 | + rows.append((number, name, password)) | |
| 57 | + | |
| 58 | + # add professor (superuser) | |
| 59 | + number = '0' | |
| 60 | + name = 'Professor' | |
| 61 | + password = bcrypt.hashpw(args.pw.encode('utf-8'), bcrypt.gensalt()) | |
| 62 | + rows.append((number, name, password)) | |
| 63 | + | |
| 64 | +# ---- CREATE DATABASE AND INSERT DATA ---- | |
| 42 | 65 | sql_cmd = '''PRAGMA foreign_keys = ON; |
| 43 | 66 | CREATE TABLE students ( |
| 44 | 67 | number TEXT PRIMARY KEY, |
| ... | ... | @@ -61,20 +84,7 @@ sql_cmd = '''PRAGMA foreign_keys = ON; |
| 61 | 84 | time TEXT, |
| 62 | 85 | FOREIGN KEY(student_id) REFERENCES students(number) |
| 63 | 86 | );''' |
| 64 | -c.executescript(sql_cmd) | |
| 65 | - | |
| 66 | -# -------- Parse CSV and insert into database -------- | |
| 67 | - | |
| 68 | -password = options.password # initial common password for all students | |
| 69 | -if password != '': | |
| 70 | - password = sha256(password.encode('utf-8')).hexdigest() | |
| 71 | - | |
| 72 | -with open(args[0], encoding='iso-8859-1') as csvfile: # SIIUE format | |
| 73 | - csvreader = csv.reader(csvfile, delimiter=';', quotechar='"') | |
| 74 | - next(csvreader) # ignore header | |
| 75 | 87 | |
| 76 | - c.executemany('INSERT INTO students VALUES (?,?,?)', | |
| 77 | - [(row[0], fixname(row[1]), password) for row in csvreader]) | |
| 78 | - c.execute('INSERT INTO students VALUES ("0", "Professor", "")') | |
| 79 | - conn.commit() # commit DB changes | |
| 80 | - c.close() # close DB cursor | |
| 88 | +with sqlite3.connect(args.db) as c: | |
| 89 | + c.executescript(sql_cmd) | |
| 90 | + c.executemany('INSERT INTO students VALUES (?,?,?)', rows) | ... | ... |