# HG changeset patch # User fabien@tzone.org # Date 1230756092 18000 # Node ID 6784c4350b4170ee337f9b359cb198c386a00723 # Parent c078d8a04d76822c17e0e13c6bb18ff56fa94fa6 Cleanup of old code, fixes some errors with folders view and make it a standard action. diff -r c078d8a04d76 -r 6784c4350b41 .cvsignore --- a/.cvsignore Wed Dec 31 01:53:22 2008 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -*.pyc -*.tmplc -.htpasswd diff -r c078d8a04d76 -r 6784c4350b41 TODO --- a/TODO Wed Dec 31 01:53:22 2008 -0500 +++ b/TODO Wed Dec 31 15:41:32 2008 -0500 @@ -1,11 +1,10 @@ -* Add test unit. +* Add more unit testing. * Add licences notes to src files. * Add synonymous support. * Add "new keyword" enlighting, maybe with link to keyword editing. * Add similar keywords suggestions. Otherly said: "Bookmarks which have - X keywords also have this keywords. May be some frequency filter will + X keywords also have this keywords." May be some frequency filter will be needed. -* Selection based bookmarks editions. * Used SQL sequence instead of the db_sequence table. * Add CSS. * Add Search capabilities. @@ -19,3 +18,6 @@ * More user preferences. * Clean up of all the code. This is a real mess currently! * Optimization of some code part. +* Add AJAX support. +* Add cloud-like selection. +* Add public/private field. \ No newline at end of file diff -r c078d8a04d76 -r 6784c4350b41 lib/.cvsignore --- a/lib/.cvsignore Wed Dec 31 01:53:22 2008 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -*.pyc -*.tmplc diff -r c078d8a04d76 -r 6784c4350b41 lib/actions.py --- a/lib/actions.py Wed Dec 31 01:53:22 2008 -0500 +++ b/lib/actions.py Wed Dec 31 15:41:32 2008 -0500 @@ -24,11 +24,11 @@ actions = ActionsLoader() -actions['default'] = ('index', 'do_it') actions['index'] = ('index', 'do_it') -actions['edit'] = ('edit', 'do_it') actions['import'] = ('imp_xbel', 'do_it') -actions['add'] = ('add', 'do_it') -actions['bookmark'] = ('add', 'do_it') +actions['bookmark'] = ('bookmark', 'do_it') actions['keywords'] = ('editkw', 'do_it') actions['prefs'] = ('edit_prefs', 'do_it') +actions['folder'] = ('folder', 'do_it') + +actions['default'] = actions['index'] diff -r c078d8a04d76 -r 6784c4350b41 lib/actions/add.py --- a/lib/actions/add.py Wed Dec 31 01:53:22 2008 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +0,0 @@ -from templates import Template -from bkmark import Bookmark -from webutils import load_index -from templates import Template -from keywords import add_unique_keywords -import os - -def get_bk_from_form(form): - bk = Bookmark() - bk.id = int(form['id'].value) - bk.url = form['url'].value - if form.has_key('name'): - bk.name = form['name'].value - if form.has_key('desc'): - bk.desc = form['desc'].value - return bk - -def get_kw_from_form(form): - kw = form.getvalue("kw") - if not isinstance(kw, type([])): - if kw: - kw = [kw] - else: - kw = [] - kw = map(int, kw) - return kw - -def get_new_kw_from_form(form, sep =','): - if form.has_key('newkw'): - kw= map(lambda e: e.strip(), - form['newkw'].value.split(',')) - return filter(lambda x: x != '', kw) - else: - return [] - -def get_unique_keywords(form, db): - kw = get_kw_from_form(form) - kw = set(map(db.get_keyword, kw)) - return list(kw.union(get_new_kw_from_form(form))) - -def edit(db, prefs, form, id): - name = url = "" - if form.has_key("ctitle"): - name = form["ctitle"].value - if form.has_key("curl"): - url = form["curl"].value - kw = db.get_all_keywords()[1:] - kw.sort(lambda l,r: cmp(l[1],r[1])) - kw = map(lambda elem: { - 'id' : elem[0], - 'keyword' : elem[1], - 'checked' : 0 }, kw) - print_edit(id, kw, name, url, prefs) - -def confirm(step, bk, kw, prefs): - tmpl = Template("add_confirm.tmpl", prefs) - confirmation = "Unknown!" - if (step == 'delete'): - confirmation = "Delete" - elif (step == 'update'): - confirmation = "Update" - tmpl.set("confirmation", confirmation) - tmpl.set("step", step) - tmpl.set("id", bk.id) - tmpl.set("name", bk.name) - tmpl.set("url", bk.url) - tmpl.set("Keywords", map(lambda x: {'keyword': x }, kw)) - tmpl.set("desc", bk.desc) - print tmpl.process() - -def print_edit(id, keywords, title, url, prefs): - tmpl = Template("add_bk.tmpl", prefs) - tmpl.set('ctitle', title) - tmpl.set('curl', url) - tmpl.set('desc', '') - tmpl.set('bkid', id) - tmpl.set('Keywords', keywords) - print tmpl.process() - -def update_bookmark(db, form): - bk = get_bk_from_form(form) - id = bk.id - if (bk.id == -1): - id = db.add_bookmark(bk) - else: - db.update_bookmark(bk) - kw = add_unique_keywords(db, get_unique_keywords(form, db)) - db.update_keywords(id, kw.values()) - -def do_it(action, db, prefs, form): - if form.has_key('id'): - id = int(form['id'].value) - else: - id = -1; - if form.has_key('step'): - step = form['step'].value - else: - step = 'edit' - if step == 'edit': - edit(db, prefs, form, id) - elif step == 'confirm': - update_bookmark(db, form) - load_index(db, prefs, form, "result", "Bookmark update") - elif step == 'cancel' or (action == 'delete' and id == -1): - load_index(db, prefs, form, "err", "Operation cancel") - else: - if step == 'update': - bk = get_bk_from_form(form) - kw = get_unique_keywords(form, db) - else: - bk = db.get_bookmarks([id])[0] - (ids, kw) = apply(zip,db.get_keywords([id])) - kw = kw[1:] - confirm(step, bk, kw, prefs) diff -r c078d8a04d76 -r 6784c4350b41 lib/actions/bookmark.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/actions/bookmark.py Wed Dec 31 15:41:32 2008 -0500 @@ -0,0 +1,114 @@ +from templates import Template +from bkmark import Bookmark +from webutils import load_index +from templates import Template +from keywords import add_unique_keywords +import os + +def get_bk_from_form(form): + bk = Bookmark() + bk.id = int(form['id'].value) + bk.url = form['url'].value + if form.has_key('name'): + bk.name = form['name'].value + if form.has_key('desc'): + bk.desc = form['desc'].value + return bk + +def get_kw_from_form(form): + kw = form.getvalue("kw") + if not isinstance(kw, type([])): + if kw: + kw = [kw] + else: + kw = [] + kw = map(int, kw) + return kw + +def get_new_kw_from_form(form, sep =','): + if form.has_key('newkw'): + kw= map(lambda e: e.strip(), + form['newkw'].value.split(',')) + return filter(lambda x: x != '', kw) + else: + return [] + +def get_unique_keywords(form, db): + kw = get_kw_from_form(form) + kw = set(map(db.get_keyword, kw)) + return list(kw.union(get_new_kw_from_form(form))) + +def edit(db, prefs, form, id): + name = url = "" + if form.has_key("ctitle"): + name = form["ctitle"].value + if form.has_key("curl"): + url = form["curl"].value + kw = db.get_all_keywords()[1:] + kw.sort(lambda l,r: cmp(l[1],r[1])) + kw = map(lambda elem: { + 'id' : elem[0], + 'keyword' : elem[1], + 'checked' : 0 }, kw) + print_edit(id, kw, name, url, prefs) + +def confirm(step, bk, kw, prefs): + tmpl = Template("add_confirm.tmpl", prefs) + confirmation = "Unknown!" + if (step == 'delete'): + confirmation = "Delete" + elif (step == 'update'): + confirmation = "Update" + tmpl.set("confirmation", confirmation) + tmpl.set("step", step) + tmpl.set("id", bk.id) + tmpl.set("name", bk.name) + tmpl.set("url", bk.url) + tmpl.set("Keywords", map(lambda x: {'keyword': x }, kw)) + tmpl.set("desc", bk.desc) + print tmpl.process() + +def print_edit(id, keywords, title, url, prefs): + tmpl = Template("add_bk.tmpl", prefs) + tmpl.set('ctitle', title) + tmpl.set('curl', url) + tmpl.set('desc', '') + tmpl.set('bkid', id) + tmpl.set('Keywords', keywords) + print tmpl.process() + +def update_bookmark(db, form): + bk = get_bk_from_form(form) + id = bk.id + if (bk.id == -1): + id = db.add_bookmark(bk) + else: + db.update_bookmark(bk) + kw = add_unique_keywords(db, get_unique_keywords(form, db)) + db.update_keywords(id, kw.values()) + +def do_it(action, db, prefs, form): + if form.has_key('id'): + id = int(form['id'].value) + else: + id = -1; + if form.has_key('step'): + step = form['step'].value + else: + step = 'edit' + if step == 'edit': + edit(db, prefs, form, id) + elif step == 'confirm': + update_bookmark(db, form) + load_index(db, prefs, form, "result", "Bookmark update") + elif step == 'cancel' or (action == 'delete' and id == -1): + load_index(db, prefs, form, "err", "Operation cancel") + else: + if step == 'update': + bk = get_bk_from_form(form) + kw = get_unique_keywords(form, db) + else: + bk = db.get_bookmarks([id])[0] + (ids, kw) = apply(zip,db.get_keywords([id])) + kw = kw[1:] + confirm(step, bk, kw, prefs) diff -r c078d8a04d76 -r 6784c4350b41 lib/actions/edit.py --- a/lib/actions/edit.py Wed Dec 31 01:53:22 2008 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -#!/usr/bin/python - -from templates import Template - -def main(keywords, bk, prefs): - tmpl = Template("add_bk.tmpl", prefs) - tmpl.set('ctitle', bk.name) - tmpl.set('curl', bk.url) - tmpl.set('desc', bk.desc) - tmpl.set('bkid', bk.id) - tmpl.set('Keywords', keywords) - print tmpl.process() - -def do_it(action, db, prefs, form): - id = int(form["id"].value) - bk = db.get_bookmarks([id])[0] - kw = db.get_all_keywords()[1:] - kw.sort(lambda l,r: cmp(l[1],r[1])) - (ids, kws) = apply(zip,db.get_keywords([id])) - kw = map(lambda elem: { - 'id' : elem[0], - 'keyword' : elem[1], - 'selected' : elem[0] in ids }, kw) - main(kw, bk, prefs) diff -r c078d8a04d76 -r 6784c4350b41 lib/actions/edit_prefs.py diff -r c078d8a04d76 -r 6784c4350b41 lib/actions/editkw.py diff -r c078d8a04d76 -r 6784c4350b41 lib/actions/folder.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/actions/folder.py Wed Dec 31 15:41:32 2008 -0500 @@ -0,0 +1,26 @@ +from templates import Template +from folders import do_folders + +def add_folder(db, form): + keyword = int(form['selection'].value) + parent = 0 + if (form.has_key('folder'): + parent = int(form['folder'].value) + db.add_folder(keyword, parent) + +def remove_folder(db, form): + keyword = int(form['selection'].value) + db.remove_folders(keyword) + +def do_it(action, db, prefs, form): + status = 'result' + status_msg = 'Unknown action' + if form.has_key('step'): + step = form['step'].value + if (step == 'add'): + add_folder(db, form) + status_msg = "Folder successfully added." + elif (step == 'delete'): + remove_folder(db, form) + status_msg = "Folder successfully removed." + do_folders(db, prefs, form, status, status_msg) diff -r c078d8a04d76 -r 6784c4350b41 lib/actions/imp_xbel.py diff -r c078d8a04d76 -r 6784c4350b41 lib/create_db.sql --- a/lib/create_db.sql Wed Dec 31 01:53:22 2008 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ --- - -CREATE TABLE users ( - id int NOT NULL, - name varchar(255) DEFAULT '' NOT NULL, - full_name varchar(255) DEFAULT '', - PRIMARY KEY (id) -); - -CREATE INDEX index_users_name ON users(name); - -CREATE TABLE preferences ( - userid int NOT NULL, - keywords_box int DEFAULT 5 not NULL, - keywords_sort varchar(31) DEFAULT 'keyword' NOT NULL, - keywords_reverse boolean DEFAULT FALSE NOT NULL, - default_view int DEFAULT 0 not NULL, - PRIMARY KEY (userid) -); - --- --- Table structure for table 'bookmark' --- -CREATE TABLE bookmarks ( - id int NOT NULL, - userid int NOT NULL, - url varchar(1023) DEFAULT '' NOT NULL, - name varchar(1023) DEFAULT '' NOT NULL, - ldesc varchar(1023) DEFAULT '' NOT NULL, - added date DEFAULT '1998-01-01' NOT NULL, - PRIMARY KEY (id, userid) -); - -CREATE INDEX index_bookmarks_userid ON bookmarks(userid); - --- --- Table structure for table 'keywords' --- -CREATE TABLE keywords ( - id int DEFAULT '0' NOT NULL, - userid int DEFAULT '0' NOT NULL, - name varchar(255) DEFAULT '' NOT NULL, - PRIMARY KEY (id, userid) -); - -CREATE INDEX index_keywords_name ON keywords(userid, name); - --- --- Cross reference table for linking keywords and bookmarks --- - -CREATE TABLE bookmarks_keywords ( - bookmark int NOT NULL, - keyword int DEFAULT '0' NOT NULL, - userid int DEFAULT '0' NOT NULL, - PRIMARY KEY (bookmark, keyword, userid) -); - -CREATE INDEX index_bkkw_kwuser ON bookmarks_keywords (keyword, userid); -CREATE INDEX index_bkkw_user ON bookmarks_keywords (userid); -CREATE INDEX index_bkkw_bkuser ON bookmarks_keywords (bookmark, userid); - --- --- Folders structure --- - -CREATE TABLE folders ( - id int DEFAULT '0' NOT NULL, - userid int DEFAULT '0' NOT NULL, - keyword int DEFAULT '0' NOT NULL, - parent int DEFAULT '0' NOT NULL, - PRIMARY KEY (id, userid) -); - -CREATE INDEX index_folders_parent ON folders (userid, parent); - --- --- Table structure for table 'db_sequence' --- -CREATE TABLE db_sequence ( - seq_name varchar(30) DEFAULT '' NOT NULL, - userid int DEFAULT '0' NOT NULL, - nextid int DEFAULT '0' NOT NULL, - PRIMARY KEY (seq_name, userid) -); - -INSERT INTO db_sequence (seq_name, userid, nextid) VALUES ('users' , -1, 0); diff -r c078d8a04d76 -r 6784c4350b41 lib/db/create_db.sql --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/db/create_db.sql Wed Dec 31 15:41:32 2008 -0500 @@ -0,0 +1,87 @@ +-- + +CREATE TABLE users ( + id int NOT NULL, + name varchar(255) DEFAULT '' NOT NULL, + full_name varchar(255) DEFAULT '', + PRIMARY KEY (id) +); + +CREATE INDEX index_users_name ON users(name); + +CREATE TABLE preferences ( + userid int NOT NULL, + keywords_box int DEFAULT 5 not NULL, + keywords_sort varchar(31) DEFAULT 'keyword' NOT NULL, + keywords_reverse boolean DEFAULT FALSE NOT NULL, + default_view int DEFAULT 0 not NULL, + PRIMARY KEY (userid) +); + +-- +-- Table structure for table 'bookmark' +-- +CREATE TABLE bookmarks ( + id int NOT NULL, + userid int NOT NULL, + url varchar(1023) DEFAULT '' NOT NULL, + name varchar(1023) DEFAULT '' NOT NULL, + ldesc varchar(1023) DEFAULT '' NOT NULL, + added date DEFAULT '1998-01-01' NOT NULL, + PRIMARY KEY (id, userid) +); + +CREATE INDEX index_bookmarks_userid ON bookmarks(userid); + +-- +-- Table structure for table 'keywords' +-- +CREATE TABLE keywords ( + id int DEFAULT '0' NOT NULL, + userid int DEFAULT '0' NOT NULL, + name varchar(255) DEFAULT '' NOT NULL, + PRIMARY KEY (id, userid) +); + +CREATE INDEX index_keywords_name ON keywords(userid, name); + +-- +-- Cross reference table for linking keywords and bookmarks +-- + +CREATE TABLE bookmarks_keywords ( + bookmark int NOT NULL, + keyword int DEFAULT '0' NOT NULL, + userid int DEFAULT '0' NOT NULL, + PRIMARY KEY (bookmark, keyword, userid) +); + +CREATE INDEX index_bkkw_kwuser ON bookmarks_keywords (keyword, userid); +CREATE INDEX index_bkkw_user ON bookmarks_keywords (userid); +CREATE INDEX index_bkkw_bkuser ON bookmarks_keywords (bookmark, userid); + +-- +-- Folders structure +-- + +CREATE TABLE folders ( + id int DEFAULT '0' NOT NULL, + userid int DEFAULT '0' NOT NULL, + keyword int DEFAULT '0' NOT NULL, + parent int DEFAULT '0' NOT NULL, + PRIMARY KEY (id, userid) +); + +CREATE INDEX index_folders_parent ON folders (userid, parent); + +-- +-- Table structure for table 'db_sequence' +-- +CREATE TABLE db_sequence ( + seq_name varchar(30) DEFAULT '' NOT NULL, + userid int DEFAULT '0' NOT NULL, + nextid int DEFAULT '0' NOT NULL, + PRIMARY KEY (seq_name, userid) +); + +INSERT INTO db_sequence (seq_name, userid, nextid) VALUES ('users' , -1, 0); diff -r c078d8a04d76 -r 6784c4350b41 lib/db/db.schema --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/db/db.schema Wed Dec 31 15:41:32 2008 -0500 @@ -0,0 +1,38 @@ +users + * id : int + + name : string + + full_name : string + +preferences + * userid : int + + keywords_box : int + + keywords_sort : string + +bookmarks + * id : int + * userid : int + + url : string + + name : string + + ldesc : string + + added : date + +keywords + * id: int + * userid : int + + name : string + +bookmarks_keywords + * bookmark : int + * keyword : int + * userid : int + +folders: + * id : int + * userid : int + + keyword : int + + parent : int + +db_sequence: + * seq_name : string + * userid : int + + nextid : int \ No newline at end of file diff -r c078d8a04d76 -r 6784c4350b41 lib/dynamic.py diff -r c078d8a04d76 -r 6784c4350b41 lib/folders.py --- a/lib/folders.py Wed Dec 31 01:53:22 2008 -0500 +++ b/lib/folders.py Wed Dec 31 15:41:32 2008 -0500 @@ -1,21 +1,5 @@ from templates import Template from keywords import set_selection, sort_keywords -from __future__ import nested_scopes - -def do_folder_action(db, form, folder): - if form['action'].value == 'add': - if form.has_key('sel'): - keyword = int(form['sel'].value) - db.add_folder(keyword, folder) - print "Folder successfully add." - return keyword - elif form['action'].value == 'delete': - if form.has_key('delete'): - keyword = int(form['delete'].value) - db.remove_folders(keyword) - print "Folder successfully remove." - return keyword - return -1 def sort_kw_with_removed(l, r): result = l['removed'] - r['removed'] @@ -39,11 +23,8 @@ def do_folders(db, prefs, form, status, status_msg): folder = 0 - if form: - if form.has_key('folder'): - folder = int(form['folder'].value) - if form.has_key('action'): - do_folder_action(db, form, folder) + if form.has_key('folder'): + folder = int(form['folder'].value) parents = db.get_folder_parents_and_self(folder) parents.reverse() children = db.get_subfolders(folder) diff -r c078d8a04d76 -r 6784c4350b41 lib/webutils.py diff -r c078d8a04d76 -r 6784c4350b41 lib/xbelweb.py diff -r c078d8a04d76 -r 6784c4350b41 templates/add_bk.tmpl --- a/templates/add_bk.tmpl Wed Dec 31 01:53:22 2008 -0500 +++ b/templates/add_bk.tmpl Wed Dec 31 15:41:32 2008 -0500 @@ -3,7 +3,7 @@