[svn r1604] Implement default_view preferences, which move things around a lot. xbelweb
authorfabien
Fri, 24 Oct 2003 17:04:29 -0400
branchxbelweb
changeset 47 2781ac85b807
parent 46 d3c1de4d929e
child 48 9cde0ea6f411
[svn r1604] Implement default_view preferences, which move things around a lot.
ChangeLog
TODO
add.py
add_confirm.py
add_result.py
do_edit_kw.py
do_import.py
dynamic.tmpl
edit.py
edit_kw.py
edit_prefs.py
folders.py
folders.tmpl
import.py
inc/footers.tmpl
index.py
index.tmpl
kw_result.py
lib/create_db.sql
lib/dynamic.py
lib/folders.py
lib/keywords.py
lib/my_db.py
lib/templates.py
lib/webutils.py
prefs.py
prefs.tmpl
--- a/ChangeLog	Fri Oct 24 14:19:30 2003 -0400
+++ b/ChangeLog	Fri Oct 24 17:04:29 2003 -0400
@@ -2,6 +2,8 @@
 
   * Add display name to Preferences.
   * Add folders view with Add.
+  * Add a default view between folders and dynamic view.
+  * Move things around so the code is a bit (really a bit) cleaner.
 
  -- Fabien Ninoles <fabien@tzone.org>  Fri, 17 Oct 2003 15:04:26 -0400
 
--- a/TODO	Fri Oct 24 14:19:30 2003 -0400
+++ b/TODO	Fri Oct 24 17:04:29 2003 -0400
@@ -1,14 +1,14 @@
+* Selection based bookmarks editions.
 * Used SQL sequence instead of the db_sequence table.
 * Add CSS.
 * Add Search capabilities.
-* Add default (dynamic?) tree expansion.
+* Add default (dynamic?) tree expansion using colltags.
 * Add XBel Export.
 * Add support for icons.
 * Add modified time.
 * Add access/check time.
 * Add user session support.
 * Better unicode handling.
-* Selection based bookmark manipulation.
 * More user preferences.
 * Clean up of all the code.  This is a real mess currently!
 * Optimization of some code part.
--- a/add.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/add.py	Fri Oct 24 17:04:29 2003 -0400
@@ -11,22 +11,20 @@
 
 # import cgitb; cgitb.enable()
 import cgi
-from htmltmpl import TemplateManager
-from webutils import get_template_processor;
+from templates import Template
 import my_db
 import time
 from bkmark import Bookmark
 import os
 
 def main(keywords, title, url, prefs):
-    tmpl = TemplateManager().prepare("add_bk.tmpl")
-    tproc = get_template_processor(prefs)
-    tproc.set('ctitle', title)
-    tproc.set('curl', url)
-    tproc.set('desc', '')
-    tproc.set('bkid', -1)
-    tproc.set('Keywords', keywords)
-    print tproc.process(tmpl)
+    tmpl = Template("add_bk.tmpl", prefs)
+    tmpl.set('ctitle', title)
+    tmpl.set('curl', url)
+    tmpl.set('desc', '')
+    tmpl.set('bkid', -1)
+    tmpl.set('Keywords', keywords)
+    print tmpl.process()
 
 if (__name__ == "__main__"):
     form = cgi.FieldStorage()
--- a/add_confirm.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/add_confirm.py	Fri Oct 24 17:04:29 2003 -0400
@@ -13,12 +13,11 @@
 
 # import cgitb; cgitb.enable()
 import cgi
-from htmltmpl import TemplateManager
-from webutils import get_template_processor
 import my_db
 import time
 from bkmark import Bookmark
-from index import load_index
+from webutils import load_index
+from templates import Template
 from utils import unique
 import os
 
@@ -58,24 +57,24 @@
       return kw
 
 def main(action, bk, kw, prefs):
-    tmpl = TemplateManager().prepare("add_confirm.tmpl")
-    tproc = get_template_processor(prefs)
-    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)
+    tmpl = Template("add_confirm.tmpl", prefs)
+    tmpl.set("confirm_delete", action == 'delete')
+    tmpl.set("confirm_update", action == 'update')
+    tmpl.set("action", action)
+    tmpl.set("id", bk.id)
+    tmpl.set("name", bk.name)
+    tmpl.set("url", bk.url)
+    tmpl.set("Keywords", map(lambda x: {'keyword': x }, kw))
+    print tmpl.process()
 
 if (__name__ == "__main__"):
     form = cgi.FieldStorage()
     db = my_db.connect(os.environ["REMOTE_USER"])
+    prefs = db.get_preferences()
     id = int(form['id'].value)
     action = form['action'].value
     if action == 'cancel' or (action == 'delete' and id == -1):
-        load_index(db)
+        load_index(db, prefs)
     else:
 	if action == 'update':
 	  bk = get_bk_from_form(form)
@@ -84,5 +83,5 @@
 	  bk = db.get_bookmarks([id])[0]
 	  (ids, kw) = apply(zip,db.get_keywords([id]))
 	  kw = kw[1:]
-	main(action, bk, kw, db.get_preferences())
+	main(action, bk, kw, prefs)
 
--- a/add_result.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/add_result.py	Fri Oct 24 17:04:29 2003 -0400
@@ -11,13 +11,12 @@
 
 # import cgitb; cgitb.enable()
 import cgi
-from htmltmpl import TemplateManager
-from webutils import get_template_processor
+from templates import Template
 import time
 from utils import unique
 import my_db
 from add_confirm import get_bk_from_form, get_new_kw_from_form
-from index import load_index
+from webutils import load_index
 import os
 
 def add_new_keywords(db, newkw):
@@ -33,24 +32,24 @@
     return kw
 
 def main(bk, kw, prefs):
-    tmpl = TemplateManager().prepare("add_result.tmpl")
-    tproc = get_template_processor(prefs)
-    tproc.set("url", bk.url)
-    tproc.set("name", bk.name)
-    tproc.set("added", bk.added)
-    tproc.set("desc", bk.desc)
-    tproc.set("Keywords", kw)
-    print tproc.process(tmpl)
+    tmpl = Template("add_result.tmpl", prefs)
+    tmpl.set("url", bk.url)
+    tmpl.set("name", bk.name)
+    tmpl.set("added", bk.added)
+    tmpl.set("desc", bk.desc)
+    tmpl.set("Keywords", kw)
+    print tmpl.process()
 
 if (__name__ == "__main__"):
     form = cgi.FieldStorage()
     db = my_db.connect(os.environ["REMOTE_USER"])
+    prefs = db.get_preferences()
     action = form['action'].value
     if action == 'cancel':
-      load_index(db)
+      load_index(db, prefs)
     elif action == 'delete':
       db.remove_bookmark(int(form['id'].value))
-      load_index(db)
+      load_index(db, prefs)
     else:
       bk = get_bk_from_form(form)
       newkw = get_new_kw_from_form(form)
@@ -62,4 +61,4 @@
 	id = bk.id
       db.update_keywords(id, kw)
       kw = map(lambda e: { 'keyword': e[1] }, db.get_keywords([id])[1:])
-      main(bk, kw, db.get_preferences())
+      main(bk, kw, prefs)
--- a/do_edit_kw.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/do_edit_kw.py	Fri Oct 24 17:04:29 2003 -0400
@@ -11,24 +11,22 @@
 
 # import cgitb; cgitb.enable()
 import cgi
-from htmltmpl import TemplateManager
-from webutils import get_template_processor
+from templates import Template
 import my_db
 from bkmark import Bookmark
-from webutils import get_keywords
+from keywords import get_keywords
 import os
 
 def main(action, sel_keywords, keywords, prefs):
-    tmpl = TemplateManager().prepare("kw_confirm.tmpl")
-    tproc = get_template_processor(prefs)
-    tproc.set("pagetitle", os.environ["REMOTE_USER"]+"'s XBELWeb Confirmation")
-    tproc.set("confirm_delete", action == 'delete')
-    tproc.set("confirm_merge", action == 'merge')
-    tproc.set("confirm_rename", action == 'rename')
-    tproc.set("action", action)
-    tproc.set("Selected", sel_keywords)
-    tproc.set("Keywords", keywords)
-    print tproc.process(tmpl)
+    tmpl = Template("kw_confirm.tmpl", prefs)
+    tmpl.set("pagetitle", os.environ["REMOTE_USER"]+"'s XBELWeb Confirmation")
+    tmpl.set("confirm_delete", action == 'delete')
+    tmpl.set("confirm_merge", action == 'merge')
+    tmpl.set("confirm_rename", action == 'rename')
+    tmpl.set("action", action)
+    tmpl.set("Selected", sel_keywords)
+    tmpl.set("Keywords", keywords)
+    print tmpl.process()
 
 if (__name__ == "__main__"):
     form = cgi.FieldStorage()
--- a/do_import.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/do_import.py	Fri Oct 24 17:04:29 2003 -0400
@@ -21,7 +21,8 @@
 if (__name__ == "__main__"):
     form = cgi.FieldStorage()
     db = my_db.connect(os.environ["REMOTE_USER"])
+    prefs = db.get_preferences()
     file = form["xbelfile"].file
     bms = parse_xbel(file)
     import_bookmarks(db, bms)
-    load_index(db)
+    load_index(db, prefs)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dynamic.tmpl	Fri Oct 24 17:04:29 2003 -0400
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+  <TMPL_INCLUDE NAME="headers.tmpl">
+  <body>
+    <h1><TMPL_VAR remote_user>'s XBelWeb</h1>
+    <p>Total bookmarks: <TMPL_VAR total></p>
+    <form action="index.py" method="get" name="keywords">
+      <input type="hidden" name="view" value="dynamic"/>
+      <fieldset class="keywords">
+        <legend>Keywords:</legend>
+	<p>
+	<label>Include:
+	<select multiple name="sel" onchange="submit()"
+	        size="<TMPL_VAR kw_size>">
+	<TMPL_LOOP Keywords>
+	  <option value="<TMPL_VAR id>"
+	    <TMPL_IF selected>selected</TMPL_IF>
+	    ><TMPL_VAR keyword> (<TMPL_VAR count>)</option>
+	</TMPL_LOOP></select>
+	<label>Exclude:
+	<select multiple name="exc" onchange="submit()"
+	        size="<TMPL_VAR kw_size>">
+	<TMPL_LOOP Keywords>
+	  <option value="<TMPL_VAR id>"
+	    <TMPL_IF excluded>selected</TMPL_IF>
+	    ><TMPL_VAR keyword> (<TMPL_VAR count>)</option>
+	</TMPL_LOOP></select>
+	</p>
+	<button>Lookup</button>
+      </fieldset>
+    </form>
+    <TMPL_INCLUDE NAME="bkmarks.tmpl">
+    <hr/>
+    <a href="?view=folder">Switch to folder view</a>
+    <TMPL_INCLUDE NAME="footers.tmpl">
+  </body>
+</html>
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-namecase-general:t
+sgml-general-insert-case:lower
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:2
+sgml-indent-data:nil
+sgml-parent-document:nil
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+vi: syntax=html
+-->
--- a/edit.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/edit.py	Fri Oct 24 17:04:29 2003 -0400
@@ -11,22 +11,20 @@
 
 # import cgitb; cgitb.enable()
 import cgi
-from htmltmpl import TemplateManager
+from templates import Template
 import my_db
 import time
 from bkmark import Bookmark
-from webutils import get_template_processor
 import os
 
 def main(keywords, bk, prefs):
-    tmpl = TemplateManager().prepare("add_bk.tmpl")
-    tproc = get_template_processor(prefs)
-    tproc.set('ctitle', bk.name)
-    tproc.set('curl', bk.url)
-    tproc.set('desc', bk.desc)
-    tproc.set('bkid', bk.id)
-    tproc.set('Keywords', keywords)
-    print tproc.process(tmpl)
+    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()
 
 if (__name__ == "__main__"):
     form = cgi.FieldStorage()
--- a/edit_kw.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/edit_kw.py	Fri Oct 24 17:04:29 2003 -0400
@@ -11,17 +11,15 @@
 
 # import cgitb; cgitb.enable()
 import cgi
-from htmltmpl import TemplateManager
-from webutils import get_template_processor
+from templates import Template
 import my_db
 import time
 import os
 
 def main(keywords, prefs):
-    tmpl = TemplateManager().prepare("edit_kw.tmpl")
-    tproc = get_template_processor(prefs)
-    tproc.set('Keywords', keywords)
-    print tproc.process(tmpl)
+    tmpl = Template("edit_kw.tmpl", prefs)
+    tmpl.set('Keywords', keywords)
+    print tmpl.process()
 
 if (__name__ == "__main__"):
     form = cgi.FieldStorage()
--- a/edit_prefs.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/edit_prefs.py	Fri Oct 24 17:04:29 2003 -0400
@@ -23,8 +23,10 @@
     	prefs['keywords_box'] = int(form['kw_size'].value)
     if form.has_key('kw_sort'):
     	prefs['keywords_sort'] = form['kw_sort'].value
+    if form.has_key('default_view'):
+    	prefs['default_view'] = int(form['default_view'].value)
     prefs['keywords_reverse'] = form.has_key('kw_reverse')
     if form.has_key('fullname'):
     	prefs['fullname'] = form['fullname'].value
     db.set_preferences(prefs)
-    load_index(db)
+    load_index(db, prefs)
--- a/folders.py	Fri Oct 24 14:19:30 2003 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-#!/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
-import my_db
-from os import environ
-from htmltmpl import TemplateManager
-from webutils import get_template_processor, set_selection, sort_keywords
-
-def output(prefs, folder, parents, children, bookmarks, keywords):
-    tmpl = TemplateManager().prepare("folders.tmpl")
-    tproc = get_template_processor(prefs)
-    tproc.set('Parents', parents)
-    tproc.set('folder', folder['id'])
-    tproc.set('name', folder['name'])
-    tproc.set('total', len(bookmarks))
-    bookmarks.sort(lambda l,r: cmp(l['name'],r['name']))
-    tproc.set('Bookmarks', bookmarks)
-    tproc.set('Subfolders', children)
-    keywords = sort_keywords(keywords[1:], prefs)
-    tproc.set('Keywords', keywords)
-    print tproc.process(tmpl)
-
-if (__name__ == "__main__"):
-    form = cgi.FieldStorage()
-    db = my_db.connect(environ["REMOTE_USER"])
-    if form.has_key('folder'):
-    	folder = int(form['folder'].value)
-    else:
-    	folder = 0
-    if form.has_key('action'):
-    	if form['action'].value == 'add':
-    		if form.has_key('sel'):
-			keyword = int(form['sel'].value)
-			db.add_folder(keyword, folder)
-			print "<em>Folder successfully add.</em>"
-    parents = db.get_folder_parents_and_self(folder)
-    children = db.get_subfolders(folder)
-    parents.reverse()
-    selection = map(lambda e: e['keyword'], parents)
-    exclusion = map(lambda e: e['keyword'], children)
-    bookmarks = db.select_bookmarks(selection, exclusion)
-    selected_keywords = set_selection(db,
-		map(lambda e: e[0], bookmarks),
-		selection, exclusion)
-    keywords = []
-    for keyword in selected_keywords:
-    	if not keyword['id'] in exclusion:
-		keywords.append(keyword)
-    for child in children:
-    	child['count'] = len(db.select_bookmarks(selection + [child['keyword']]))
-    bookmarks = db.get_bookmarks(map(lambda bk: bk[0], bookmarks))
-    bookmarks = map(lambda bk: bk.dict(), bookmarks)
-    output(db.get_preferences(), parents.pop(), parents, children, bookmarks, keywords)
--- a/folders.tmpl	Fri Oct 24 14:19:30 2003 -0400
+++ b/folders.tmpl	Fri Oct 24 17:04:29 2003 -0400
@@ -4,22 +4,28 @@
   <body>
     <h1><TMPL_VAR remote_user>'s XBelWeb</h1>
     <TMPL_UNLESS folder>
-      <p><TMPL_LOOP Parents><a href="?folder=<TMPL_VAR id>"><TMPL_VAR name></a>
+      <p><TMPL_LOOP Parents><a href="?view=folder;folder=<TMPL_VAR id>"><TMPL_VAR name></a>
         : </TMPL_LOOP></p>
     </TMPL_UNLESS>
     <h2><TMPL_IF folder><TMPL_VAR name><TMPL_ELSE>Main Folder</TMPL_IF>
     (<TMPL_VAR total>)</h2>
     <DIV class="subfolders">
+    <form action="index.py" method="post" name="edit_folders">
+    <input type="hidden" name="folder" value="<TMPL_VAR folder>"/>
+    <input type="hidden" name="view" value="folder"/>
+    <input type="hidden" name="action" value="delete"/>
     <ul>
     <TMPL_LOOP Subfolders>
-      <li><a href="folders.py?folder=<TMPL_VAR id>"><TMPL_VAR name>
+      <li><a href="index.py?view=folder;folder=<TMPL_VAR id>"><TMPL_VAR name>
       	(<TMPL_VAR count>)</a>
-	<a href="delete_folders.py?folder=<TMPL_VAR id>">delete</a></li>
+	<button name="delete" value="<TMPL_VAR id>">Delete</button></li>
     </TMPL_LOOP>
     </ul>
+    </form>
     </div>
-    <form action="folders.py" method="post" name="folders">
+    <form action="index.py" method="post" name="add_folder">
       <input type="hidden" name="folder" value="<TMPL_VAR folder>"/>
+      <input type="hidden" name="view" value="folder"/>
       <label>Add subfolder with keyword:
 	<select name="sel" size="1">
 	<TMPL_LOOP Keywords>
@@ -31,6 +37,8 @@
     <hr>
     <TMPL_INCLUDE NAME="bkmarks.tmpl">
     <hr>
+    <a href="?view=dynamic">Switch to dynamic view</a>
+    <TMPL_INCLUDE NAME="footers.tmpl">
   </body>
 </html>
 <!-- Keep this comment at the end of the file
--- a/import.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/import.py	Fri Oct 24 17:04:29 2003 -0400
@@ -11,14 +11,13 @@
 
 # import cgitb; cgitb.enable()
 import cgi
-from htmltmpl import TemplateManager
-from webutils import get_template_processor
-import os
+from templates import Template
+from os import environ
 
 def main():
-    tmpl = TemplateManager().prepare("import.tmpl")
-    tproc = get_template_processor()
-    print tproc.process(tmpl)
+    db = my_db.connect(environ["REMOTE_USER"])
+    tmpl = Template("import.tmpl", db.get_preferences())
+    print tmpl.process()
 
 if (__name__ == "__main__"):
     main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/inc/footers.tmpl	Fri Oct 24 17:04:29 2003 -0400
@@ -0,0 +1,28 @@
+    <p><a href="add.py">Add new bookmark</a>.<br/>
+    <a href="folders.py">Switch to folder view</a>.<br/>
+    <a href="import.py">Import a XBEL file</a>.<br/>
+    <a href="edit_kw.py">Edit keywords</a>.<br/>
+    <a href="prefs.py">Edit User Preferences</a>.</p>
+    <p>Here the <a
+    href="javascript:bk1='<TMPL_VAR curl>?curl='+escape(location.href)+'&ctitle='+escape(document.title);bkwin=window.open(bk1,'bkqm','width=620,height=500,scrollbars=1,resizable=1');bkwin.focus();">Quick
+    Mark Link</a>.  Put it on your bookmarks (using <tt>&lt;Right-Mouse
+    Click&gt; Bookmark this link</tt>) and just select it when you
+    want to bookmark your links.</p>
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-namecase-general:t
+sgml-general-insert-case:lower
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:2
+sgml-indent-data:nil
+sgml-parent-document:nil
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+vi: syntax=html
+-->
--- a/index.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/index.py	Fri Oct 24 17:04:29 2003 -0400
@@ -13,24 +13,11 @@
 # import cgitb; cgitb.enable()
 import cgi
 import my_db
-from webutils import *
+from os import environ
+from webutils import load_index
 
 if (__name__ == "__main__"):
     form = cgi.FieldStorage()
     db = my_db.connect(environ["REMOTE_USER"])
-    selection = get_keywords(form, 'sel')
-    exclusion = get_keywords(form, 'exc')
-    if len(selection) == 0:
-    	keywords = set_selection(db, [], selection, exclusion)
-    	exc = map(lambda e: int(e['id']), keywords[1:])
-   	bookmarks = db.select_bookmarks([0], exc)
-    else:
-    	bookmarks = db.select_bookmarks(selection, exclusion)
-   	keywords = set_selection(db,
-		map(lambda e: e[0], bookmarks),
-		selection, exclusion)
-    total = len(bookmarks)
-    if len(bookmarks) > 0:
-    	bookmarks = db.get_bookmarks(map(lambda x: x[0], bookmarks))
-    bookmarks = map(lambda bk: bk.dict(), bookmarks)
-    process_index(bookmarks, keywords[1:], db.get_preferences())
+    prefs = db.get_preferences()
+    load_index(db, prefs, form)
--- a/index.tmpl	Fri Oct 24 14:19:30 2003 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-  <TMPL_INCLUDE NAME="headers.tmpl">
-  <body>
-    <h1><TMPL_VAR remote_user>'s XBelWeb</h1>
-    <p>Total bookmarks: <TMPL_VAR total></p>
-    <form action="index.py" method="get" name="keywords">
-      <fieldset class="keywords">
-        <legend>Keywords:</legend>
-	<p>
-	<label>Include:
-	<select multiple name="sel" onchange="submit()"
-	        size="<TMPL_VAR kw_size>">
-	<TMPL_LOOP Keywords>
-	  <option value="<TMPL_VAR id>"
-	    <TMPL_IF selected>selected</TMPL_IF>
-	    ><TMPL_VAR keyword> (<TMPL_VAR count>)</option>
-	</TMPL_LOOP></select>
-	<label>Exclude:
-	<select multiple name="exc" onchange="submit()"
-	        size="<TMPL_VAR kw_size>">
-	<TMPL_LOOP Keywords>
-	  <option value="<TMPL_VAR id>"
-	    <TMPL_IF excluded>selected</TMPL_IF>
-	    ><TMPL_VAR keyword> (<TMPL_VAR count>)</option>
-	</TMPL_LOOP></select>
-	</p>
-	<button>Lookup</button>
-      </fieldset>
-    </form>
-    <TMPL_INCLUDE NAME="bkmarks.tmpl">
-    <hr/>
-    <p><a href="add.py">Add new bookmark</a>.<br/>
-    <a href="folders.py">Switch to folder view</a>.<br/>
-    <a href="import.py">Import a XBEL file</a>.<br/>
-    <a href="edit_kw.py">Edit keywords</a>.<br/>
-    <a href="prefs.py">Edit User Preferences</a>.</p>
-    <p>Here the <a
-    href="javascript:bk1='<TMPL_VAR curl>?curl='+escape(location.href)+'&ctitle='+escape(document.title);bkwin=window.open(bk1,'bkqm','width=620,height=500,scrollbars=1,resizable=1');bkwin.focus();">Quick
-    Mark Link</a>.  Put it on your bookmarks (using <tt>&lt;Right-Mouse
-    Click&gt; Bookmark this link</tt>) and just select it when you
-    want to bookmark your links.</p>
-  </body>
-</html>
-<!-- Keep this comment at the end of the file
-Local variables:
-mode: sgml
-sgml-omittag:t
-sgml-shorttag:t
-sgml-namecase-general:t
-sgml-general-insert-case:lower
-sgml-minimize-attributes:nil
-sgml-always-quote-attributes:t
-sgml-indent-step:2
-sgml-indent-data:nil
-sgml-parent-document:nil
-sgml-exposed-tags:nil
-sgml-local-catalogs:nil
-sgml-local-ecat-files:nil
-End:
-vi: syntax=html
--->
--- a/kw_result.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/kw_result.py	Fri Oct 24 17:04:29 2003 -0400
@@ -13,7 +13,8 @@
 import cgi
 import my_db
 from os import environ
-from webutils import load_index, get_keywords
+from webutils import load_index
+from keywords import get_keywords
 
 def do_merge(form, db):
 	fromids = get_keywords(form, 'id')
@@ -42,6 +43,7 @@
 if (__name__ == "__main__"):
     form = cgi.FieldStorage()
     db = my_db.connect(environ["REMOTE_USER"])
+    prefs = db.get_preferences()
     action = form['action'].value
     if action == 'merge':
 	do_merge(form, db)
@@ -49,4 +51,4 @@
 	do_rename(form, db)
     elif action == 'delete':
     	do_delete(form, db)
-    load_index(db)
+    load_index(db, prefs)
--- a/lib/create_db.sql	Fri Oct 24 14:19:30 2003 -0400
+++ b/lib/create_db.sql	Fri Oct 24 17:04:29 2003 -0400
@@ -14,6 +14,7 @@
   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)
 );
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/dynamic.py	Fri Oct 24 17:04:29 2003 -0400
@@ -0,0 +1,35 @@
+#!/usr/bin/python
+
+from keywords import get_keywords, sort_keywords
+from templates import Template
+
+def process_index(bk, kw, pref):
+    tmpl = Template("dynamic.tmpl", pref)
+    bk.sort(lambda x,y: cmp(x['name'],y['name']))
+    tmpl.set("Bookmarks", bk)
+    kw = sort_keywords(kw, pref)
+    tmpl.set("Keywords", kw)
+    tmpl.set("curl", get_curl())
+    tmpl.set("total", len(bk))
+    print tmpl.process()
+
+def do_dynamic(db, prefs, form = []):
+    if form:
+        selection = get_keywords(form, 'sel')
+        exclusion = get_keywords(form, 'exc')
+    else:
+    	selection = exclusion = []
+    if len(selection) == 0:
+    	keywords = set_selection(db, [], selection, exclusion)
+    	exc = map(lambda e: int(e['id']), keywords[1:])
+   	bookmarks = db.select_bookmarks([0], exc)
+    else:
+    	bookmarks = db.select_bookmarks(selection, exclusion)
+   	keywords = set_selection(db,
+		map(lambda e: e[0], bookmarks),
+		selection, exclusion)
+    total = len(bookmarks)
+    if len(bookmarks) > 0:
+    	bookmarks = db.get_bookmarks(map(lambda x: x[0], bookmarks))
+    bookmarks = map(lambda bk: bk.dict(), bookmarks)
+    process_index(bookmarks, keywords[1:], prefs)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/folders.py	Fri Oct 24 17:04:29 2003 -0400
@@ -0,0 +1,58 @@
+#!/usr/bin/python
+
+from templates import Template
+from keywords import set_selection, sort_keywords
+
+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 "<em>Folder successfully add.</em>"
+		return keyword
+   elif form['action'].value == 'delete':
+   	if form.has_key('delete'):
+		keyword = int(form['delete'].value)
+		db.remove_folders(keyword)
+		print "<em>Folder successfully remove.</em>"
+		return keyword
+   return -1
+
+def output(prefs, folder, parents, children, bookmarks, keywords):
+    tmpl = Template("folders.tmpl", prefs)
+    tmpl.set('Parents', parents)
+    tmpl.set('folder', folder['id'])
+    tmpl.set('name', folder['name'])
+    tmpl.set('total', len(bookmarks))
+    bookmarks.sort(lambda l,r: cmp(l['name'],r['name']))
+    tmpl.set('Bookmarks', bookmarks)
+    tmpl.set('Subfolders', children)
+    keywords = sort_keywords(keywords[1:], prefs)
+    tmpl.set('Keywords', keywords)
+    print tmpl.process()
+
+def do_folders(db, prefs, form = None):
+    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)
+    parents = db.get_folder_parents_and_self(folder)
+    children = db.get_subfolders(folder)
+    parents.reverse()
+    selection = map(lambda e: e['keyword'], parents)
+    exclusion = map(lambda e: e['keyword'], children)
+    bookmarks = db.select_bookmarks(selection, exclusion)
+    selected_keywords = set_selection(db,
+		map(lambda e: e[0], bookmarks),
+		selection, exclusion)
+    keywords = []
+    for keyword in selected_keywords:
+    	if not keyword['id'] in exclusion:
+		keywords.append(keyword)
+    for child in children:
+    	child['count'] = len(db.select_bookmarks(selection + [child['keyword']]))
+    bookmarks = db.get_bookmarks(map(lambda bk: bk[0], bookmarks))
+    bookmarks = map(lambda bk: bk.dict(), bookmarks)
+    output(prefs, parents.pop(), parents, children, bookmarks, keywords)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/keywords.py	Fri Oct 24 17:04:29 2003 -0400
@@ -0,0 +1,47 @@
+def get_keywords(form, name):
+	kws = form.getvalue(name)
+	if not isinstance(kws, type([])):
+		if kws:
+			kws = [kws]
+		else:
+			kws = []
+	return map(int, kws)
+
+def set_selection(db, bk, sel, exc = []):
+	if len(bk) > 0:
+		ids, names = map(list,apply(zip,db.get_keywords(bk)))
+		for key in exc:
+			if key not in ids:
+				ids.append(key)
+				names.append(db.get_keyword(key))
+		allkw = map(lambda x,y: [x, y], ids, names)
+	else:
+		allkw = db.get_all_keywords()
+	(kw, cnt) = map(list,apply(zip, db.get_keywords_count(bk)))
+	res = []
+	for key in allkw:
+		is_selected = key[0] in sel
+		is_excluded = key[0] in exc
+		is_unselected = not (is_selected or is_excluded)
+		if key[0] in kw:
+			kcnt = cnt[kw.index(key[0])]
+		else:
+			kcnt = 0
+		res.append({'id':key[0],
+			'keyword': key[1],
+			'count' : kcnt,
+			'selected' : is_selected,
+			'excluded' : is_excluded,
+			'unselected' : is_unselected})
+	return res
+
+def sort_keywords(kw, pref):
+	global _sk_rev_fact
+	global _sk_sort
+	if pref['keywords_reverse']:
+		_sk_rev_fact = -1
+	else:
+		_sk_rev_fact = 1
+	_sk_sort = pref['keywords_sort'] 
+	kw.sort(lambda l, r: _sk_rev_fact*cmp(l[_sk_sort], r[_sk_sort]))
+	return kw
--- a/lib/my_db.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/lib/my_db.py	Fri Oct 24 17:04:29 2003 -0400
@@ -62,6 +62,7 @@
 			DELETE FROM users WHERE id = %d;
 			DELETE FROM bookmarks_keywords WHERE userid = %d;
 			DELETE FROM bookmarks WHERE userid = %d;
+			DELETE FROM preferences WHERE userid = %d;
 			DELETE FROM keywords WHERE userid = %d;
 			DELETE FROM db_sequence WHERE userid = %d;
 			""" % (userid,userid,userid,userid,userid))
@@ -70,7 +71,7 @@
 		self.crs.execute("""
 			SELECT p.keywords_box,
 			p.keywords_sort, p.keywords_reverse,
-			u.full_name
+			u.full_name, p.default_view
 			FROM preferences p, users u
 			WHERE u.id = %d AND p.userid = u.id;
 			""" % (self.userid,))
@@ -79,7 +80,8 @@
 		   'keywords_box' : res[0],
 		   'keywords_sort' : res[1],
 		   'keywords_reverse': res[2],
-		   'fullname': res[3]
+		   'fullname': res[3],
+		   'default_view': res[4]
 		   }
 	def set_preferences(self, prefs):
 	        if prefs['keywords_reverse']:
@@ -90,11 +92,12 @@
 			UPDATE preferences
 			SET keywords_box = %d,
 			keywords_sort = %s,
-			keywords_reverse = %s
+			keywords_reverse = %s,
+			default_view = %d
 			WHERE userid = %d;
 			""" % (prefs['keywords_box'],
 			sql_quote(prefs['keywords_sort']),
-			rev, self.userid))
+			rev, prefs['default_view'], self.userid))
 		self.crs.execute("""
 			UPDATE users
 			SET full_name = %s
@@ -322,7 +325,7 @@
 	def remove_folders(self, id, commit = 1):
 		if id == 0:
 			raise "Can't erase base folder!"
-		subs = self.get_subfolders(self, id)
+		subs = self.get_subfolders(id)
 		for sub in subs:
 			self.remove_folder(sub[0], 0)
 		self.crs.execute("""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/templates.py	Fri Oct 24 17:04:29 2003 -0400
@@ -0,0 +1,15 @@
+from htmltmpl import TemplateManager, TemplateProcessor
+
+class Template:
+	def __init__(self, template, prefs):
+		self.tproc = TemplateProcessor()
+		self.tmpl = TemplateManager().prepare(template)
+    		self.tproc.set("remote_user", prefs["fullname"])
+    		self.tproc.set("kw_size", prefs['keywords_box'])
+    		self.tproc.set("kw_sort", prefs['keywords_sort'])
+    		self.tproc.set("kw_reverse", prefs['keywords_reverse'])
+	def set(self, name, variable):
+		self.tproc.set(name, variable)
+	def process(self):
+		return self.tproc.process(self.tmpl)
+
--- a/lib/webutils.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/lib/webutils.py	Fri Oct 24 17:04:29 2003 -0400
@@ -1,90 +1,22 @@
 #!/usr/bin/python
 
-
-import cgi
-import my_db
-from htmltmpl import TemplateManager, TemplateProcessor
 from os import environ
 from urlparse import urljoin
-
-def get_keywords(form, name):
-	kws = form.getvalue(name)
-	if not isinstance(kws, type([])):
-		if kws:
-			kws = [kws]
-		else:
-			kws = []
-	return map(int, kws)
-
-def set_selection(db, bk, sel, exc = []):
-	if len(bk) > 0:
-		ids, names = map(list,apply(zip,db.get_keywords(bk)))
-		for key in exc:
-			if key not in ids:
-				ids.append(key)
-				names.append(db.get_keyword(key))
-		allkw = map(lambda x,y: [x, y], ids, names)
-	else:
-		allkw = db.get_all_keywords()
-	(kw, cnt) = map(list,apply(zip, db.get_keywords_count(bk)))
-	res = []
-	for key in allkw:
-		is_selected = key[0] in sel
-		is_excluded = key[0] in exc
-		is_unselected = not (is_selected or is_excluded)
-		if key[0] in kw:
-			kcnt = cnt[kw.index(key[0])]
-		else:
-			kcnt = 0
-		res.append({'id':key[0],
-			'keyword': key[1],
-			'count' : kcnt,
-			'selected' : is_selected,
-			'excluded' : is_excluded,
-			'unselected' : is_unselected})
-	return res
-
-def sort_keywords(kw, pref):
-	global _sk_rev_fact
-	global _sk_sort
-	if pref['keywords_reverse']:
-		_sk_rev_fact = -1
-	else:
-		_sk_rev_fact = 1
-	_sk_sort = pref['keywords_sort'] 
-	kw.sort(lambda l, r: _sk_rev_fact*cmp(l[_sk_sort], r[_sk_sort]))
-	return kw
+from dynamic import do_dynamic
+from folders import do_folders
 
 def get_curl():
 	return urljoin( 'http://' + environ["HTTP_HOST"] + environ["REQUEST_URI"], 'add.py')
 
-def load_index(db):
-    	keywords = set_selection(db, [], [], [])
-    	exc = map(lambda e: int(e['id']), keywords[1:])
-   	bookmarks = db.select_bookmarks([0], exc)
-    	total = keywords[0]['count']
-	if len(bookmarks)>0:
-    		bookmarks = db.get_bookmarks(map(lambda x: x[0], bookmarks))
-    	bookmarks = map(lambda bk: bk.dict(), bookmarks)
-	pref = db.get_preferences()
-    	process_index(bookmarks, keywords[1:], pref)
-
-def get_template_processor(prefs):
-    tproc = TemplateProcessor()
-    tproc.set("remote_user", prefs["fullname"])
-    tproc.set("kw_size", prefs['keywords_box'])
-    tproc.set("kw_sort", prefs['keywords_sort'])
-    tproc.set("kw_reverse", prefs['keywords_reverse'])
-    return tproc
-
-def process_index(bk, kw, pref):
-    tmpl = TemplateManager().prepare("index.tmpl")
-    tproc = get_template_processor(pref)
-    bk.sort(lambda x,y: cmp(x['name'],y['name']))
-    tproc.set("Bookmarks", bk)
-    kw = sort_keywords(kw, pref)
-    tproc.set("Keywords", kw)
-    tproc.set("curl", get_curl())
-    tproc.set("total", len(bk))
-    print tproc.process(tmpl)
-
+def load_index(db, prefs, form = None):
+    if form:
+    	if form.has_key('view'):
+    		if form['view'].value == 'folder':
+    			do_folders(db, prefs, form)
+		else:
+    			do_dynamic(db, prefs, form)
+		return
+    if prefs['default_view'] == 0:
+        do_dynamic(db, prefs, form)
+    else:
+	do_folders(db, prefs, form)
--- a/prefs.py	Fri Oct 24 14:19:30 2003 -0400
+++ b/prefs.py	Fri Oct 24 17:04:29 2003 -0400
@@ -11,20 +11,24 @@
 
 # import cgitb; cgitb.enable()
 import cgi
-from htmltmpl import TemplateManager
-from webutils import get_template_processor
+from templates import Template
 import my_db
 import os
 
 def main(prefs):
-    tmpl = TemplateManager().prepare("prefs.tmpl")
-    tproc = get_template_processor(prefs)
-    fields = []
+    tmpl = Template("prefs.tmpl", prefs)
+    sortfields = []
     for field in ['keyword', 'count']:
-      fields.append({'field': field,
+      sortfields.append({'field': field,
                      'selected' : prefs['keywords_sort'] == field })
-    tproc.set('Sortfields', fields)
-    print tproc.process(tmpl)
+    tmpl.set('Sortfields', sortfields)
+    views = []
+    for view in [(0, 'dynamic'), (1, 'folder')]:
+    	views.append({ 'view': view[0],
+	        'name': view[1],
+		'selected': prefs['default_view'] == view[0]} )
+    tmpl.set('Views', views)
+    print tmpl.process()
 
 if (__name__ == "__main__"):
     db = my_db.connect(os.environ["REMOTE_USER"])
--- a/prefs.tmpl	Fri Oct 24 14:19:30 2003 -0400
+++ b/prefs.tmpl	Fri Oct 24 17:04:29 2003 -0400
@@ -7,6 +7,13 @@
       <p><label>Display name:
         <input type="text" name="fullname"
   	       value="<TMPL_VAR remote_user>"/></label></p>
+      <p><label>Default view:
+        <select name="default_view" size="1">
+	  <TMPL_LOOP Views>
+            <option value="<TMPL_VAR view>"
+	    	<TMPL_IF selected>selected</TMPL_IF>
+		/><TMPL_VAR name></option>
+          </TMPL_LOOP></p>
       <p><label>Size of keywords selection box:
         <input type="text" name="kw_size"
 	       value="<TMPL_VAR kw_size>"/></label></p>