# HG changeset patch # User fabien # Date 1064588655 14400 # Node ID 14bec94bbe893bcea85c7bc6bde0199510ff0bbb # Parent 07adce9ccccbb7c8fcf1118f4b62f0807bc216fa [svn r1551] Add delete bookmarks functionality as well as many reusability issues. diff -r 07adce9ccccb -r 14bec94bbe89 .cvsignore --- a/.cvsignore Fri Sep 26 11:03:02 2003 -0400 +++ b/.cvsignore Fri Sep 26 11:04:15 2003 -0400 @@ -1,2 +1,3 @@ *.pyc *.tmplc +.htpasswd diff -r 07adce9ccccb -r 14bec94bbe89 .htaccess --- a/.htaccess Fri Sep 26 11:03:02 2003 -0400 +++ b/.htaccess Fri Sep 26 11:04:15 2003 -0400 @@ -3,7 +3,7 @@ DirectoryIndex index.py AuthType Basic AuthName Fabien@TZoNE -AuthUserFile /home/fabien/.htpasswd +AuthUserFile /home/fabien/public_html/xbelweb/.htpasswd require valid-user diff -r 07adce9ccccb -r 14bec94bbe89 TODO --- a/TODO Fri Sep 26 11:03:02 2003 -0400 +++ b/TODO Fri Sep 26 11:04:15 2003 -0400 @@ -1,9 +1,8 @@ * Used SQL sequence instead of the db_sequence table. -* Add delete bookmark. * Add CSS. -* Add better navigational means. * Add limit query page * Add Search capabilities. +* Add better navigation. * Add default (dynamic?) tree expansion. * Add multiuser support. * Add XBel Import/Export. diff -r 07adce9ccccb -r 14bec94bbe89 add_bk.tmpl --- a/add_bk.tmpl Fri Sep 26 11:03:02 2003 -0400 +++ b/add_bk.tmpl Fri Sep 26 11:04:15 2003 -0400 @@ -1,10 +1,10 @@ - Add a bookmark + Edit a bookmark -

Add a bookmark

-
+

Edit a bookmark

+


- - +
+
+ +
Mots clés: diff -r 07adce9ccccb -r 14bec94bbe89 add_confirm.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/add_confirm.py Fri Sep 26 11:04:15 2003 -0400 @@ -0,0 +1,84 @@ +#!/usr/bin/python + +import sys +import traceback + +if __name__ == "__main__": + sys.path.insert(0, "/home/fabien/lib/python") + sys.path.insert(0, "./lib") + sys.stderr = sys.stdout + + print "Content-type: text/html; charset=iso-8859-1;" + print + +# import cgitb; cgitb.enable() +import cgi +from htmltmpl import TemplateManager, TemplateProcessor +import my_db +import time +from bkmark import Bookmark +from index import load_index +from utils import unique + +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 = map(db.get_keyword, kw) + kw = kw + get_new_kw_from_form(form) + return unique(kw) + +def main(action, bk, kw): + tmpl = TemplateManager().prepare("add_confirm.tmpl") + tproc = TemplateProcessor() + tproc.set("confirm_delete", action == 'delete') + tproc.set("confirm_update", action == 'update') + tproc.set("action", action) + tproc.set("id", bk.id) + tproc.set("name", bk.name) + tproc.set("url", bk.url) + tproc.set("Keywords", map(lambda x: {'keyword': x }, kw)) + print tproc.process(tmpl) + +if (__name__ == "__main__"): + form = cgi.FieldStorage() + db = my_db.connect() + id = int(form['id'].value) + action = form['action'].value + if action == 'cancel' or (action == 'delete' and id == -1): + load_index(db) + else: + if action == '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)) + main(action, bk, kw[1:]) + diff -r 07adce9ccccb -r 14bec94bbe89 add_confirm.tmpl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/add_confirm.tmpl Fri Sep 26 11:04:15 2003 -0400 @@ -0,0 +1,54 @@ + + + + + Fabien's XBelWeb + + +

Fabien's XBelWeb

+

Confirmation

+ +
+ Bookmark + + + + + +

+

Keywords: + + ; + +

+ + + + + + + + + + + diff -r 07adce9ccccb -r 14bec94bbe89 add_result.py --- a/add_result.py Fri Sep 26 11:03:02 2003 -0400 +++ b/add_result.py Fri Sep 26 11:04:15 2003 -0400 @@ -12,36 +12,23 @@ # import cgitb; cgitb.enable() import cgi from htmltmpl import TemplateManager, TemplateProcessor +import time +from utils import unique import my_db -import time -from bkmark import Bookmark - -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 +from add_confirm import get_bk_from_form, get_new_kw_from_form +from index import load_index -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): - if form.has_key('newkw'): - return map(lambda e: e.strip(), - form['newkw'].value.split(',')) +def add_new_keywords(db, newkw): + kw = [0] # Default keyword, so that every bookmarks appears in + # the bookmarks_keywords db. + (ids, kws, cnt) = map(list,apply(zip, db.get_all_keywords())) + for elem in unique(newkw): + if elem in kws: + kw.append(ids[kws.index(elem)]) else: - return [] + id = db.add_keyword(elem) + kw.append(id) + return kw def main(bk, kw): tmpl = TemplateManager().prepare("add_result.tmpl") @@ -56,21 +43,21 @@ if (__name__ == "__main__"): form = cgi.FieldStorage() db = my_db.connect() - bk = get_bk_from_form(form) - kw = get_kw_from_form(form) - newkw = get_new_kw_from_form(form) - (ids, kws, cnt) = map(list,apply(zip, db.get_all_keywords())) - for elem in newkw: - if elem in kws: - kw.append(ids[kws.index(elem)]) - else: - id = db.add_keyword(elem) - kw.append(id) - if bk.id == -1: + action = form['action'].value + if action == 'cancel': + load_index(db) + elif action == 'delete': + db.remove_bookmark(int(form['id'].value)) + load_index(db) + else: + bk = get_bk_from_form(form) + newkw = get_new_kw_from_form(form) + kw = add_new_keywords(db, newkw) + if bk.id == -1: id = db.add_bookmark(bk) - else: - db.update_bookmark(bk) + else: + db.update_bookmark(bk) id = bk.id - db.update_keywords(id, kw) - kw = map(lambda e: { 'keyword': e[1] }, db.get_keywords(id)[1:]) - main(bk, kw) + db.update_keywords(id, kw) + kw = map(lambda e: { 'keyword': e[1] }, db.get_keywords(id)[1:]) + main(bk, kw) diff -r 07adce9ccccb -r 14bec94bbe89 add_result.tmpl --- a/add_result.tmpl Fri Sep 26 11:03:02 2003 -0400 +++ b/add_result.tmpl Fri Sep 26 11:04:15 2003 -0400 @@ -9,8 +9,10 @@

Bookmark successfully added:

-

Keywords:

- +

Keywords: + + ; +


Retour à la page principale

diff -r 07adce9ccccb -r 14bec94bbe89 inc/keywords.tmpl --- a/inc/keywords.tmpl Fri Sep 26 11:03:02 2003 -0400 +++ b/inc/keywords.tmpl Fri Sep 26 11:04:15 2003 -0400 @@ -1,6 +1,6 @@ -
    +

    -

  • + ; -
+

diff -r 07adce9ccccb -r 14bec94bbe89 index.py --- a/index.py Fri Sep 26 11:03:02 2003 -0400 +++ b/index.py Fri Sep 26 11:04:15 2003 -0400 @@ -40,6 +40,19 @@ def get_curl(): return urljoin( 'http://' + environ["HTTP_HOST"] + environ["REQUEST_URI"], 'add.py') +def load_index(db): + kw = db.get_all_keywords() + kw = set_selection(kw, []) + total = kw[0]['count'] + kw = kw[1:] + exc = map(lambda e: int(e['id']), kw) + bookmarks = db.select_bookmarks([0], exc) + if len(bookmarks)>0: + bookmarks = db.get_bookmarks(map(lambda x: x[0], bookmarks)) + bookmarks = map(lambda bk: bk.dict(), bookmarks) + curl = get_curl(); + main(bookmarks, kw, curl, total) + def main(bk, kw, curl, total): tmpl = TemplateManager().prepare("index.tmpl") tproc = TemplateProcessor() diff -r 07adce9ccccb -r 14bec94bbe89 index.tmpl --- a/index.tmpl Fri Sep 26 11:03:02 2003 -0400 +++ b/index.tmpl Fri Sep 26 11:04:15 2003 -0400 @@ -12,21 +12,19 @@ Keywords:

- checked value="" />();

-
- edit - delete + edit

diff -r 07adce9ccccb -r 14bec94bbe89 kw_result.py --- a/kw_result.py Fri Sep 26 11:03:02 2003 -0400 +++ b/kw_result.py Fri Sep 26 11:04:15 2003 -0400 @@ -15,7 +15,7 @@ import my_db from os import environ from urlparse import urljoin -from index import set_selection, get_curl, main +from index import load_index def do_merge(form, db): fromid = int(form['id'].value) @@ -41,14 +41,4 @@ do_update(form, db) elif action == 'delete': do_delete(form, db) - keywords = db.get_all_keywords() - total = keywords[0][2] - keywords = keywords[1:] - exc = map(lambda e: int(e[0]), keywords) - bookmarks = db.select_bookmarks([0], exc) - keywords = set_selection(keywords, []) - if len(bookmarks) > 0: - bookmarks = db.get_bookmarks(map(lambda x: x[0], bookmarks)) - bookmarks = map(lambda bk: bk.dict(), bookmarks) - curl = get_curl(); - main(bookmarks, keywords, curl, total) + load_index(db) diff -r 07adce9ccccb -r 14bec94bbe89 lib/utils.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/utils.py Fri Sep 26 11:04:15 2003 -0400 @@ -0,0 +1,70 @@ +#!/usr/bin/python + +def unique(s): + """Return a list of the elements in s, but without duplicates. + + For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3], + unique("abcabc") some permutation of ["a", "b", "c"], and + unique(([1, 2], [2, 3], [1, 2])) some permutation of + [[2, 3], [1, 2]]. + + For best speed, all sequence elements should be hashable. Then + unique() will usually work in linear time. + + If not possible, the sequence elements should enjoy a total + ordering, and if list(s).sort() doesn't raise TypeError it's + assumed that they do enjoy a total ordering. Then unique() will + usually work in O(N*log2(N)) time. + + If that's not possible either, the sequence elements must support + equality-testing. Then unique() will usually work in quadratic + time. + """ + + n = len(s) + if n == 0: + return [] + + # Try using a dict first, as that's the fastest and will usually + # work. If it doesn't work, it will usually fail quickly, so it + # usually doesn't cost much to *try* it. It requires that all the + # sequence elements be hashable, and support equality comparison. + u = {} + try: + for x in s: + u[x] = 1 + except TypeError: + del u # move on to the next method + else: + return u.keys() + + # We can't hash all the elements. Second fastest is to sort, + # which brings the equal elements together; then duplicates are + # easy to weed out in a single pass. + # NOTE: Python's list.sort() was designed to be efficient in the + # presence of many duplicate elements. This isn't true of all + # sort functions in all languages or libraries, so this approach + # is more effective in Python than it may be elsewhere. + try: + t = list(s) + t.sort() + except TypeError: + del t # move on to the next method + else: + assert n > 0 + last = t[0] + lasti = i = 1 + while i < n: + if t[i] != last: + t[lasti] = last = t[i] + lasti += 1 + i += 1 + return t[:lasti] + + # Brute force is all that's left. + u = [] + for x in s: + if x not in u: + u.append(x) + return u +