changeset 16:c87f82a15606

Dopisałem co nieco do dokumentacji i małę poprawki w zarządzainu zadaniami
author Michał Rudowicz <michal.rudowicz@fl9.eu>
date Sun, 03 Apr 2011 13:47:13 +0200
parents 914d508e87c8
children 57a48d2aee18
files frontend/doc/api.txt frontend/doc/config.txt frontend/doc/database.txt frontend/doc/index.txt frontend/doc/quickstart.txt frontend/mfrontend/db.py frontend/mfrontend/exceptions.py frontend/mfrontend/templates/newjob.html frontend/mfrontend/views/frontend.py frontend/mfrontend/views/jobcontrol.py
diffstat 10 files changed, 146 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/frontend/doc/api.txt	Fri Apr 01 23:00:13 2011 +0200
+++ b/frontend/doc/api.txt	Sun Apr 03 13:47:13 2011 +0200
@@ -40,9 +40,11 @@
     Identyfikator zadania
 
 Natomiast jako dane POST należy przesłać nowe wartości, które chcemy wpisać do
-bazy, przykładowo następująca linia poleceń programu CURL: ::
+bazy, przykładowo następująca linia poleceń programu CURL:
 
-    curl --data "state=10&percent=40" localhost:5000/api/modify/apikey/1/
+.. code-block:: bash
+
+    $ curl --data "state=10&percent=40" localhost:5000/api/modify/apikey/1/
 
 spowoduje ustawienie wartości ``state`` na 10 i ``percent`` na 40 przy zadaniu
 o identyfikatorze ``1``.
--- a/frontend/doc/config.txt	Fri Apr 01 23:00:13 2011 +0200
+++ b/frontend/doc/config.txt	Sun Apr 03 13:47:13 2011 +0200
@@ -5,7 +5,7 @@
 
 Przykładowy plik konfiguracyjny
 -------------------------------
-::
+.. code-block:: ini
 
     [Basic]
     # W przypadku sqlite, ścieżka do pliku bazy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frontend/doc/database.txt	Sun Apr 03 13:47:13 2011 +0200
@@ -0,0 +1,46 @@
+Baza danych
+===========
+
+Schemat bazy danych
+-------------------
+.. code-block:: sql
+
+    PRAGMA foreign_keys = ON;
+    CREATE TABLE users (
+        "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,    -- ID Użytkownika
+        "username" TEXT NOT NULL,                           -- Nazwa użytkownika
+        "password" TEXT NOT NULL,                           -- Hash hasła użytkownika
+        "activated" BOOLEAN                                 -- Czy konto zostało uaktywnione
+    );
+    CREATE TABLE jobs (
+        "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,    -- ID Zadania
+        "label" TEXT,                                       -- Opis zadania
+        "owner_id" INTEGER NOT NULL,                        -- ID właściciela zadania
+        "hash" TEXT NOT NULL,                               -- Hash do zdekodowania
+        "state" INTEGER NOT NULL DEFAULT (0),               -- Obecny stan operacji
+        "result" TEXT,                                      -- Wynik operacji
+        "percent" INTEGER,                                  -- Procent ukończenia operacji
+        "last_checked" TEXT,                                -- Ostatnio sprawdzany hash
+        "min_pass_len" INTEGER NOT NULL DEFAULT (1),        -- Minimalna długość hasła
+        "max_pass_len" INTEGER NOT NULL DEFAULT (5),        -- Maksymalna długość hasła
+        "method" INTEGER NOT NULL DEFAULT (0),              -- Metoda sprawdzania hashy
+        FOREIGN KEY("owner_id") REFERENCES users("id")
+    );
+
+Opisy pól w bazie danych
+------------------------
+
+jobs.state
+^^^^^^^^^^
+
+Pole to może przyjmować jedną z następujących wartości:
+
+0. Zadanie oczekujące na wykonanie
+1. Zadanie w trakcie wykonywania
+2. Zadanie zakończone
+
+Funkcje wspomagające operacje na bazie danych
+---------------------------------------------
+
+.. automodule:: mfrontend.db
+    :members:
--- a/frontend/doc/index.txt	Fri Apr 01 23:00:13 2011 +0200
+++ b/frontend/doc/index.txt	Sun Apr 03 13:47:13 2011 +0200
@@ -6,15 +6,19 @@
 Witamy w dokumentacji Serwera Aplikacji!
 ========================================
 
+Spis treści
+-----------
+
 .. toctree::
    :maxdepth: 2
 
    quickstart
    config
    api
+   database
 
 Zobacz też
-==========
+----------
 
 * :ref:`genindex`
 * :ref:`modindex`
--- a/frontend/doc/quickstart.txt	Fri Apr 01 23:00:13 2011 +0200
+++ b/frontend/doc/quickstart.txt	Sun Apr 03 13:47:13 2011 +0200
@@ -8,7 +8,9 @@
 bądź razie wszystko, prócz wymienionych elementów, instaluje się domyślnie z
 Pythonem na openSUSE i Ubuntu.
 
-Instalacja Flaska sprowadza się do wydania polecenia::
+Instalacja Flaska sprowadza się do wydania polecenia
+
+.. code-block:: bash
 
     $ easy_install Flask
 
@@ -17,7 +19,9 @@
 
 Serwer aplikacji uruchamiamy za pomocą polecenia
 
-    python runserver.py ::
+.. code-block:: bash
+
+    $ python runserver.py
 
 Domyślnie serwer będzie nasłuchiwał na porcie 5000.
 
--- a/frontend/mfrontend/db.py	Fri Apr 01 23:00:13 2011 +0200
+++ b/frontend/mfrontend/db.py	Sun Apr 03 13:47:13 2011 +0200
@@ -32,8 +32,9 @@
        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.
+       
+       :returns:    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:
@@ -45,8 +46,17 @@
         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/
+    """ Funkcja ułatwiająca odpytywanie bazy danych, źródło:
+        http://flask.pocoo.org/docs/patterns/sqlite3/
+
+        :param query:   Zapytanie SQL. Wszelkie niewiadome należy
+                        zastępować znakiem zapytania ("?"), a
+                        wartości umieszczać na liście w parametrze
+                        args.
+        :param args:    Lista zawierająca argumenty do zappytania.
+        :param one:     Jeśli ustawione na True, to funkcja zwróci
+                        tylko jeden element z bazy, w przeciwnym wypadku
+                        wszystkie spełniające warunek zapytania.
     """
     cur = g.db.execute(query, args)
     rv = [dict((cur.description[idx][0], value)
@@ -56,10 +66,11 @@
 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.
+       
+       :param username: Nazwa użytkownika
+       :param password: Hasło
+       :returns:        Prawda, jeśli podane dane są akceptowalne, w przeciwnym
+                        razie fałsz.
     """
     user = query_db('select * from users where username = ?',
                    [username], one=True)
@@ -73,10 +84,11 @@
     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
+    """ 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)
@@ -89,16 +101,18 @@
     g.db.commit()
 
 def get_jobs(owner_id, hash, state):
-    """Funkcja pobiera informacje o zadaniach. Możliwe jest filtrowanie zadań.
-       @param owner_id  Pobiera informacje jedynie o zadaniach stworzonych przez
-                        użytkownika o podanym id. Jeśli parametr ten jest ustawiony
-                        na None, to pobiera zadania wszystkich użytkowników.
-       @param hash      Pobiera informacje o zadaniu o podanym hashu. Jeśli jest ustawione
-                        na None, to pobiera informacje o wszystkich hashach.
-       @param state     Pobiera informacje o zadaniach będących w określonym stanie.
-                        Jeśli jest ustawione na None, to pobiera informację o zadaniach
-                        znajdujących się w każdym stanie.
-       @return Informacje o zadaniach z uwzględnieniem podanych w parametrach filtrów.
+    """ Funkcja pobiera informacje o zadaniach. Możliwe jest filtrowanie zadań.
+        
+        :param owner_id:    Pobiera informacje jedynie o zadaniach stworzonych przez
+                            użytkownika o podanym id. Jeśli parametr ten jest ustawiony
+                            na None, to pobiera zadania wszystkich użytkowników.
+        :param hash:        Pobiera informacje o zadaniu o podanym hashu. Jeśli jest ustawione
+                            na None, to pobiera informacje o wszystkich hashach.
+        :param state:       Pobiera informacje o zadaniach będących w określonym stanie.
+                            Jeśli jest ustawione na None, to pobiera informację o zadaniach
+                            znajdujących się w każdym stanie.
+        :returns:           Informacje o zadaniach z uwzględnieniem podanych w
+                            parametrach filtrów.
     """
     parameters = []
     sqlLine = ""
@@ -128,23 +142,26 @@
 
 def get_waiting_job():
     """ Funkcja zwraca dane o najstarszym oczekującym zadaniu.
-        @return Dane o zadaniu.
+        
+        :returns: Dane o zadaniu.
     """
     return query_db("SELECT * FROM jobs WHERE state = 0 ORDER BY id ASC",[],one=True)
 
 def get_job_by_id(job_id):
     """ Funkcja zwraca wszystkie informacje o wybranym zadaniu na podstawie
         numeru identyfikacyjnego.
-        @param job_id Identyfikator żądanego zadania
-        @return Informacje o żądanym zadaniu.;q
+        
+        :param job_id: Identyfikator żądanego zadania
+        :returns: Informacje o żądanym zadaniu.;q
     """
     return query_db("SELECT * FROM jobs WHERE id = ?;",
                    [job_id], one=True)
 
 def edit_job(job_id, options):
-    """ Funkcja omdyfikująca właściwości zadania o podanym identyfikatorze.
-        @param  job_id  Identyfikator zadania, które chcemy zmodyfikować.
-        @param  options Słownik z nowymi wartościami kolumn w tabeli.
+    """ Funkcja modyfikująca właściwości zadania o podanym identyfikatorze.
+        
+        :param  job_id:  Identyfikator zadania, które chcemy zmodyfikować.
+        :param  options: Słownik z nowymi wartościami kolumn w tabeli.
     """
     # klucze, których zmianę dopuszczamy
     keys = ["label", "state", "result", "percent", "last_checked"]
@@ -157,21 +174,31 @@
 def get_user_name(user_id):
     """ Funkcja pobiera nazwę użytkownika o podanym identyfikatorze.
         
-        user_id -- Identyfikator użytkownika, którego nazwa jest pożądana.
-        @return String zawierający nazwę użytkownika, lub None, jeśli użytkownik nie istnieje.
+        :param user_id: Identyfikator użytkownika, którego nazwa jest pożądana.
+        :returns:       String zawierający nazwę użytkownika, lub None,
+                        jeśli użytkownik nie istnieje.
     """
     return query_db("SELECT username FROM users WHERE id = ?;",
                     [user_id], one=True)["username"]
 
 def get_user_id(user_name):
     """ Funkcja pobiera identyfikator użytkownika na podstawie nazwy.
-        @param user_name    Nazwa użytkownika, którego indentyfikator ma zostać zwrócony.
-        @return             Identyfikator użytkownika.
+        
+        :param user_name:    Nazwa użytkownika, którego indentyfikator ma zostać zwrócony.
+        :returns:            Identyfikator użytkownika.
     """
     return query_db("SELECT id FROM users WHERE username = ?;",
                     [user_name], one=True)["id"]
 
-def new_job(id, label, hash):
-    query_db("INSERT INTO jobs (owner_id, label, hash) VALUES (?,?,?);",
-            [id, label, hash])
+def new_job(id, label, hash, method):
+    """ Funkcja tworzy nowe zadanie i zapisuje je w bazie danych.
+        
+        :param id:      Identyfikator użytkownika, który ma zostać oznaczony
+                        jako właściciel zadania.
+        :param label:   Opis zadania.
+        :param hash:    Hash do zdekodowania.
+        :param method:  Metoda łamania haseł.
+    """
+    query_db("INSERT INTO jobs (owner_id, label, hash, method) VALUES (?,?,?,?);",
+            [id, label, hash,method])
     g.db.commit()
--- a/frontend/mfrontend/exceptions.py	Fri Apr 01 23:00:13 2011 +0200
+++ b/frontend/mfrontend/exceptions.py	Sun Apr 03 13:47:13 2011 +0200
@@ -2,18 +2,28 @@
 # -*- coding: utf-8 -*-
 
 class UserNotActivated(Exception):
+    """ Wyjątek informujący o tym, że konto użytkownika nie
+        zostało aktywowane w bazie danych.
+    """
     def __init__(self):
         pass
     def __str__(self):
-        return u"Konto nie zostało uaktywnione."
+        return u"Konto nie zostało aktywowane."
 
 class BadPasswordOrUsername(Exception):
+    """ Wyjątek informujący o wprowadzeniu błędnej nazwy użytkownika
+        lub hasła.
+    """
     def __init__(self):
         pass
     def __str__(self):
         return u"Błędna nazwa użytkownika lub hasło."
 
 class UserExists(Exception):
+    """ Wyjątek informujący o tym, że nazwa użytkownika już istnieje.
+        
+        Wykorzystywany, przykładowo, podczas rejestracji użytkowników.
+    """
     def __init__(self):
         pass
     def __str__(self):
--- a/frontend/mfrontend/templates/newjob.html	Fri Apr 01 23:00:13 2011 +0200
+++ b/frontend/mfrontend/templates/newjob.html	Sun Apr 03 13:47:13 2011 +0200
@@ -8,6 +8,9 @@
       <dd><input type=text name=label>
       <dt>Hash:
       <dd><input type=text name=hash>
+      <dt>Metoda łamania hasha:
+      <dd><input type=radio name=method value=0>Metoda 0
+      <dd><input type=radio name=method value=1>Metoda 1
       <dd><input type=submit value=Dodaj>
     </dl>
   </form>
--- a/frontend/mfrontend/views/frontend.py	Fri Apr 01 23:00:13 2011 +0200
+++ b/frontend/mfrontend/views/frontend.py	Sun Apr 03 13:47:13 2011 +0200
@@ -8,6 +8,8 @@
 
 @frontend.route('/')
 def index():
+    """ Funkcja wyświetlająca stronę główną aplikacji.
+    """
     return render_template('hello.html')
 
 @frontend.route('/install/')
@@ -22,6 +24,10 @@
 
 @frontend.route('/login/', methods=['GET', 'POST'])
 def login():
+    """ Funkcja logująca użytkownika w wypadku, gdy za pomocą
+        metody POST zostały wysłane dane do logowania, a w
+        przeciwnym wypadku wyświetlająca formularz logowania.
+    """
     if request.method == 'POST':
         try:
             if db.user_can_login(request.form['username'],
--- a/frontend/mfrontend/views/jobcontrol.py	Fri Apr 01 23:00:13 2011 +0200
+++ b/frontend/mfrontend/views/jobcontrol.py	Sun Apr 03 13:47:13 2011 +0200
@@ -19,7 +19,8 @@
         try:
             db.new_job(session['user_id'],
                         request.form["label"],
-                        request.form["hash"])
+                        request.form["hash"],
+                        request.form["method"])
             return redirect(url_for('index'))
         except Exception as e:
             flash(e)