annotate frontend/mfrontend/db.py @ 7:d86794939fe4

Rejestracja użytkowników
author Michał Rudowicz <michal.rudowicz@fl9.eu>
date Mon, 28 Feb 2011 11:34:20 +0100
parents 27d63cac76ac
children 9a0a9fa7f91d
rev   line source
1
michalr
parents:
diff changeset
1 #!/usr/bin/python
michalr
parents:
diff changeset
2 # -*- coding: utf-8 -*-
michalr
parents:
diff changeset
3
michalr
parents:
diff changeset
4 import sqlite3
michalr
parents:
diff changeset
5 from flask import g
michalr
parents:
diff changeset
6 import ConfigParser
6
27d63cac76ac Konta użytkowników muszą być aktywowane + ładniejsze wyświetlanie błędów przy logowaniu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 5
diff changeset
7 from mfrontend import utils, exceptions
5
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
8 from contextlib import closing
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
9 import os.path
1
michalr
parents:
diff changeset
10
michalr
parents:
diff changeset
11 config = ConfigParser.SafeConfigParser()
michalr
parents:
diff changeset
12 config.read('config.ini')
michalr
parents:
diff changeset
13
michalr
parents:
diff changeset
14 def connect_db():
michalr
parents:
diff changeset
15 """Funkcja łącząca się z bazą danych."""
michalr
parents:
diff changeset
16 g.db = sqlite3.connect(config.get('Basic','Database'))
michalr
parents:
diff changeset
17
michalr
parents:
diff changeset
18 def disconnect_db():
michalr
parents:
diff changeset
19 """Funkcja zamykająca połączenie z bazą danych"""
michalr
parents:
diff changeset
20 g.db.close()
michalr
parents:
diff changeset
21
5
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
22 def init_db():
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
23 """Funkcja przeprowadzająca inicjalizację bazy danych zgodnie
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
24 z plikiem schema.sql. Na podstawie kodu ze strony
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
25 http://flask.pocoo.org/docs/patterns/sqlite3/#initial-schemas
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
26 Instalacja powiedzie się tylko wtedy, gdy w obecnym katalogu
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
27 nie istnieje plik '.installed'. Plik taki jest tworzony
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
28 po każdej instalacji, aby zapobiec operacjom na
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
29 istniejących bazach.
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
30 @return True, jeśli instalacja została wykonana,
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
31 False, jeśli plik '.installed' istnieje.
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
32 """
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
33 if not os.path.isfile('.installed'):
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
34 with open('schema.sql', 'r') as f:
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
35 g.db.cursor().executescript(f.read())
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
36 g.db.commit()
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
37 open('.installed', 'w').close()
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
38 return True
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
39 else:
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
40 return False
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
41
1
michalr
parents:
diff changeset
42 def query_db(query, args=(), one=False):
michalr
parents:
diff changeset
43 """Funkcja ułatwiająca odpytywanie bazy danych, źródło:
michalr
parents:
diff changeset
44 http://flask.pocoo.org/docs/patterns/sqlite3/
michalr
parents:
diff changeset
45 """
michalr
parents:
diff changeset
46 cur = g.db.execute(query, args)
michalr
parents:
diff changeset
47 rv = [dict((cur.description[idx][0], value)
michalr
parents:
diff changeset
48 for idx, value in enumerate(row)) for row in cur.fetchall()]
michalr
parents:
diff changeset
49 return (rv[0] if rv else None) if one else rv
4
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
50
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
51 def user_can_login(username, password):
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
52 """Funkcja sprawdzająca, czy podany użytkownik może sie zalogować
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
53 po podaniu danego w argumencie hasła.
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
54 @param username Nazwa użytkownika
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
55 @param password Hasło
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
56 @return Prawda, jeśli podane dane są akceptowalne, w przeciwnym
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
57 razie fałsz.
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
58 """
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
59 user = query_db('select * from users where username = ?',
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
60 [username], one=True)
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
61 if user is None: # Brak użytkownika o takiej nazwie
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
62 return False
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
63 if user['password'] == utils.hashPassword(password):
6
27d63cac76ac Konta użytkowników muszą być aktywowane + ładniejsze wyświetlanie błędów przy logowaniu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 5
diff changeset
64 if not user['activated']:
27d63cac76ac Konta użytkowników muszą być aktywowane + ładniejsze wyświetlanie błędów przy logowaniu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 5
diff changeset
65 raise exceptions.UserNotActivated()
27d63cac76ac Konta użytkowników muszą być aktywowane + ładniejsze wyświetlanie błędów przy logowaniu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 5
diff changeset
66 return True # Jeśli aktywny i hasło dobre, to wpuszczamy
4
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
67 # Najwyraźniej jest taki użytkownik, ale hasło się nie zgadza
cf786ee26a22 MOŻNA SIĘ LOGOWAĆ I WYLOGOWAĆ jestem wspaniały
michalr
parents: 1
diff changeset
68 return False
5
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
69
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
70 def register_user(username, password):
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
71 """Funkcja rejestrująca nowego użytkownika w systemie.
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
72 @param username Nazwa nowego użytkownika
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
73 @param password Hasło w czystym tekście, funkcja sama
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
74 zajmie się hashowaniem
3ba60dfc1d64 Dodałem prosty instalator aplikacji tworzący bazę danych ze schematu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 4
diff changeset
75 """
7
d86794939fe4 Rejestracja użytkowników
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 6
diff changeset
76 user = query_db('select * from users where username = ?;',
6
27d63cac76ac Konta użytkowników muszą być aktywowane + ładniejsze wyświetlanie błędów przy logowaniu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 5
diff changeset
77 [username], one=True)
27d63cac76ac Konta użytkowników muszą być aktywowane + ładniejsze wyświetlanie błędów przy logowaniu
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 5
diff changeset
78 if user is not None:
7
d86794939fe4 Rejestracja użytkowników
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 6
diff changeset
79 raise exceptions.UserExists
d86794939fe4 Rejestracja użytkowników
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 6
diff changeset
80 hashedPassword = utils.hashPassword(password)
d86794939fe4 Rejestracja użytkowników
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 6
diff changeset
81 # teraz właściwe dodawanie danych do bazy
d86794939fe4 Rejestracja użytkowników
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 6
diff changeset
82 query_db('INSERT INTO users (username, password, activated) VALUES (?,?,0);',
d86794939fe4 Rejestracja użytkowników
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 6
diff changeset
83 [username, hashedPassword])
d86794939fe4 Rejestracja użytkowników
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 6
diff changeset
84 g.db.commit()
d86794939fe4 Rejestracja użytkowników
Michał Rudowicz <michal.rudowicz@fl9.eu>
parents: 6
diff changeset
85