# HG changeset patch # User Michał Rudowicz # Date 1301831233 -7200 # Node ID c87f82a156065464f5c0574491d170eb28282ff6 # Parent 914d508e87c848d9e8a7b5176c51c7e6d56bd3c7 Dopisałem co nieco do dokumentacji i małę poprawki w zarządzainu zadaniami diff -r 914d508e87c8 -r c87f82a15606 frontend/doc/api.txt --- 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``. diff -r 914d508e87c8 -r c87f82a15606 frontend/doc/config.txt --- 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 diff -r 914d508e87c8 -r c87f82a15606 frontend/doc/database.txt --- /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: diff -r 914d508e87c8 -r c87f82a15606 frontend/doc/index.txt --- 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` diff -r 914d508e87c8 -r c87f82a15606 frontend/doc/quickstart.txt --- 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. diff -r 914d508e87c8 -r c87f82a15606 frontend/mfrontend/db.py --- 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() diff -r 914d508e87c8 -r c87f82a15606 frontend/mfrontend/exceptions.py --- 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): diff -r 914d508e87c8 -r c87f82a15606 frontend/mfrontend/templates/newjob.html --- 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 @@
Hash:
+
Metoda łamania hasha: +
Metoda 0 +
Metoda 1
diff -r 914d508e87c8 -r c87f82a15606 frontend/mfrontend/views/frontend.py --- 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'], diff -r 914d508e87c8 -r c87f82a15606 frontend/mfrontend/views/jobcontrol.py --- 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)