view 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
line wrap: on
line source

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sqlite3
from flask import g
import ConfigParser
from mfrontend import utils, exceptions
from contextlib import closing
import os.path

config = ConfigParser.SafeConfigParser()
config.read('config.ini')

def connect_db():
    """Funkcja łącząca się z bazą danych."""
    g.db = sqlite3.connect(config.get('Basic','Database'))

def disconnect_db():
    """Funkcja zamykająca połączenie z bazą danych"""
    g.db.close()

def init_db():
    """Funkcja przeprowadzająca inicjalizację bazy danych zgodnie
       z plikiem schema.sql. Na podstawie kodu ze strony
       http://flask.pocoo.org/docs/patterns/sqlite3/#initial-schemas
       Instalacja powiedzie się tylko wtedy, gdy w obecnym katalogu
       nie istnieje plik '.installed'. Plik taki jest tworzony
       po każdej instalacji, aby zapobiec operacjom na
       istniejących bazach.
       @return True, jeśli instalacja została wykonana,
               False, jeśli plik '.installed' istnieje.
    """
    if not os.path.isfile('.installed'):
        with open('schema.sql', 'r') as f:
            g.db.cursor().executescript(f.read())
        g.db.commit()
        open('.installed', 'w').close()
        return True
    else:
        return False

def query_db(query, args=(), one=False):
    """Funkcja ułatwiająca odpytywanie bazy danych, źródło:
       http://flask.pocoo.org/docs/patterns/sqlite3/
    """
    cur = g.db.execute(query, args)
    rv = [dict((cur.description[idx][0], value)
               for idx, value in enumerate(row)) for row in cur.fetchall()]
    return (rv[0] if rv else None) if one else rv

def user_can_login(username, password):
    """Funkcja sprawdzająca, czy podany użytkownik może sie zalogować
       po podaniu danego w argumencie hasła.
       @param username Nazwa użytkownika
       @param password Hasło
       @return Prawda, jeśli podane dane są akceptowalne, w przeciwnym
       razie fałsz.
    """
    user = query_db('select * from users where username = ?',
                   [username], one=True)
    if user is None:    # Brak użytkownika o takiej nazwie
        return False
    if user['password'] == utils.hashPassword(password):
        if not user['activated']:
            raise exceptions.UserNotActivated()
        return True     # Jeśli aktywny i hasło dobre, to wpuszczamy
    # Najwyraźniej jest taki użytkownik, ale hasło się nie zgadza
    return False

def register_user(username, password):
    """Funkcja rejestrująca nowego użytkownika w systemie.
       @param username Nazwa nowego użytkownika
       @param password Hasło w czystym tekście, funkcja sama
                       zajmie się hashowaniem
    """
    user = query_db('select * from users where username = ?;',
                    [username], one=True)
    if user is not None:
        raise exceptions.UserExists
    hashedPassword = utils.hashPassword(password)
    # teraz właściwe dodawanie danych do bazy
    query_db('INSERT INTO users (username, password, activated) VALUES (?,?,0);',
            [username, hashedPassword])
    g.db.commit()