First change to use a common entry point.
authorfabien@tzone.org
Sat, 27 Dec 2008 20:23:39 -0500
changeset 57 31271426f879
parent 56 6b31934e5b2e
child 58 004a32370ba5
First change to use a common entry point.
.htaccess
add.py
add_bk.tmpl
add_confirm.py
add_confirm.tmpl
do_import.py
dynamic.tmpl
edit.py
edit_bk.tmpl
folders.tmpl
import.py
import.tmpl
inc/bkmarks.tmpl
inc/footers.tmpl
inc/headers.tmpl
index.py
lib/actions.py
lib/actions/add.py
lib/actions/edit.py
lib/actions/imp_xbel.py
lib/actions/index.py
lib/my_db.py
--- a/.htaccess	Mon Aug 23 23:31:38 2004 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-AddHandler cgi-script py
-Options +ExecCGI
-DirectoryIndex index.py
-AuthType Basic
-AuthName Fabien@TZoNE
-AuthUserFile /home/fabien/public_html/xbelweb/.htpasswd
-<Limit GET POST>
-  require valid-user
-</Limit>
--- a/add.py	Mon Aug 23 23:31:38 2004 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import traceback
-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 templates import Template
-import my_db
-import time
-from bkmark import Bookmark
-import os
-
-def main(keywords, title, url, prefs):
-    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()
-    name = url = ""
-    if form.has_key("ctitle"):
-    	name = form["ctitle"].value
-    if form.has_key("curl"):
-    	url = form["curl"].value
-    db = my_db.connect(os.environ["REMOTE_USER"])
-    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)
-    main(kw, name, url, db.get_preferences())
--- a/add_bk.tmpl	Mon Aug 23 23:31:38 2004 -0400
+++ b/add_bk.tmpl	Sat Dec 27 20:23:39 2008 -0500
@@ -2,7 +2,8 @@
   <TMPL_INCLUDE NAME="headers.tmpl">
   <body>
     <h1><TMPL_VAR remote_user>'s Edit Bookmark</h1>
-    <form action="add_confirm.py" method="post" name="add">
+    <form action="?action=add" method="post" name="add">
+      <input type="hidden" name="action" value="add"/>
       <fieldset class="bookmark">
         <input type="hidden" name="id" value="<TMPL_VAR bkid>"/>
         <label>Nom: <input type="text" name="name"
@@ -26,9 +27,9 @@
 	separated list)</label><br/>
 	<button type="reset">Reset</button>
       </fieldset>
-      <button type="submit" name="action" value="update">Submit</button>
-      <button type="submit" name="action" value="delete">Delete</button>
-      <button type="submit" name="action" value="cancel">Cancel</button>
+      <button type="submit" name="step" value="update">Submit</button>
+      <button type="submit" name="step" value="delete">Delete</button>
+      <button type="submit" name="step" value="cancel">Cancel</button>
     </form>
   </body>
 </html>
--- a/add_confirm.py	Mon Aug 23 23:31:38 2004 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +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
-import time
-from bkmark import Bookmark
-from webutils import load_index
-from templates import Template
-from utils import unique
-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 = map(db.get_keyword, kw)
-      kw = kw + get_new_kw_from_form(form)
-      kw = unique(kw) 
-      return kw
-
-def main(action, bk, kw, prefs):
-    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, prefs)
-    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]))
-	  kw = kw[1:]
-	main(action, bk, kw, prefs)
-
--- a/add_confirm.tmpl	Mon Aug 23 23:31:38 2004 -0400
+++ b/add_confirm.tmpl	Sat Dec 27 20:23:39 2008 -0500
@@ -3,12 +3,14 @@
   <TMPL_INCLUDE NAME="headers.tmpl">
   <body>
     <h1><TMPL_VAR remote_user>'s Confirmation</h1>
-    <form name="confirmation" method="post" action="add_result.py">
+    <form name="confirmation" method="post" action="?action=add">
       <fieldset>
         <legend>Bookmark</legend>
+	<input type="hidden" name="action" value="add"/>
 	<input type="hidden" name="id" value="<TMPL_VAR id>"/>
 	<input type="hidden" name="name" value="<TMPL_VAR name>"/>
 	<input type="hidden" name="url" value="<TMPL_VAR url>"/>
+	<input type="hidden" name="desc" value="<TMPL_VAR desc>"/>
 	<input type="hidden" name="newkw"
 	  value="<TMPL_LOOP Keywords><TMPL_VAR keyword>,</TMPL_LOOP>"/>
 	<strong><a href="<TMPL_VAR url>"><TMPL_VAR name></a></strong>
@@ -18,15 +20,8 @@
 	    <TMPL_VAR keyword>;
 	  </TMPL_LOOP>
 	</p>
-	<TMPL_IF confirm_delete>
-	  <button name="action" type="submit"
-	        value="<TMPL_VAR action>">Delete</button>
-	</TMPL_IF>
-	<TMPL_IF confirm_update>
-	  <button name="action" type="submit"
-	        value="<TMPL_VAR action>">Update</button>
-	</TMPL_IF>
-	<button name="action" type="submit" value="cancel">Cancel</button>
+	<button name="step" type="submit" value="confirm"><TMPL_VAR confirmation></button>
+	<button name="step" type="submit" value="cancel">Cancel</button>
     </form>
   </body>
 </html>
--- a/do_import.py	Mon Aug 23 23:31:38 2004 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import traceback
-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 time
-from utils import unique
-import my_db
-from webutils import load_index
-import os
-from xbelimp import parse_xbel, import_bookmarks
-
-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, prefs)
--- a/dynamic.tmpl	Mon Aug 23 23:31:38 2004 -0400
+++ b/dynamic.tmpl	Sat Dec 27 20:23:39 2008 -0500
@@ -4,8 +4,7 @@
   <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"/>
+    <form action="?action=index&view=dynamic" method="get" name="keywords">
       <fieldset class="keywords">
         <legend>Keywords:</legend>
 	<p>
@@ -35,7 +34,7 @@
     </form>
     <TMPL_INCLUDE NAME="bkmarks.tmpl">
     <hr/>
-    <a href="?view=folder">Switch to folder view</a>
+    <a href="?action=index&view=folder">Switch to folder view</a>
     <TMPL_INCLUDE NAME="footers.tmpl">
   </body>
 </html>
--- a/edit.py	Mon Aug 23 23:31:38 2004 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import traceback
-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 templates import Template
-import my_db
-import time
-from bkmark import Bookmark
-import os
-
-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()
-
-if (__name__ == "__main__"):
-    form = cgi.FieldStorage()
-    id = int(form["id"].value)
-    db = my_db.connect(os.environ["REMOTE_USER"])
-    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, db.get_preferences())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/edit_bk.tmpl	Sat Dec 27 20:23:39 2008 -0500
@@ -0,0 +1,38 @@
+<html>
+  <TMPL_INCLUDE NAME="headers.tmpl">
+  <body>
+    <h1><TMPL_VAR remote_user>'s Edit Bookmark</h1>
+    <form action="?action=bookmark" method="post" name="edit">
+      <fieldset class="bookmark">
+        <input type="hidden" name="action" value="bookmark"/>
+        <input type="hidden" name="id" value="<TMPL_VAR bkid>"/>
+        <label>Nom: <input type="text" name="name"
+	  value="<TMPL_VAR ctitle>"/></label><br/>
+        <label>URL: <input type="text" name="url"
+	  value="<TMPL_VAR curl>"/></label><br/>
+        <label for="desc">Description: </label><br/>
+        <textarea name="desc" rows="5" cols="40"><TMPL_VAR desc></textarea>
+      </fieldset>
+      <fieldset class="keywords">
+        <legend>Keywords:</legend>
+	<label>Selected:
+	<select multiple name="kw" size="<TMPL_VAR kw_size>">
+	<TMPL_LOOP Keywords>
+	  <option value="<TMPL_VAR id>"
+	  <TMPL_IF selected>selected</TMPL_IF> />
+	  <TMPL_VAR keyword></option>
+	</TMPL_LOOP>
+	</select>
+	<label>New keywords: <input type="text" name="newkw"> (comma
+	separated list)</label><br/>
+	<button type="reset">Reset</button>
+      </fieldset>
+      <button type="submit" name="step" value="update">Submit</button>
+      <button type="submit" name="step" value="delete">Delete</button>
+      <button type="submit" name="step" value="cancel">Cancel</button>
+    </form>
+  </body>
+</html>
+<!--
+vi: syntax=html
+-->
--- a/folders.tmpl	Mon Aug 23 23:31:38 2004 -0400
+++ b/folders.tmpl	Sat Dec 27 20:23:39 2008 -0500
@@ -7,7 +7,7 @@
       <p>Parents: 
         <TMPL_LOOP Parents>
 	<TMPL_IF id> : </TMPL_IF>
-	<a href="?view=folder;folder=<TMPL_VAR id>"><TMPL_IF id><TMPL_VAR name>
+	<a href="?action=index&view=folder&folder=<TMPL_VAR id>"><TMPL_IF id><TMPL_VAR name>
 	<TMPL_ELSE>Top </TMPL_IF> (<TMPL_VAR count>)</a>
 	</TMPL_LOOP>
       </p>
@@ -15,20 +15,20 @@
     <h2><TMPL_IF folder><TMPL_VAR name><TMPL_ELSE>Main Folder</TMPL_IF>
     (<TMPL_VAR subtotal>/<TMPL_VAR total>)</h2>
     <DIV class="subfolders">
-    <form action="index.py?view=folder;folder=<TMPL_VAR folder>" method="post" name="edit_folders">
+    <form action="?action=index&view=folder&folder=<TMPL_VAR folder>" 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><button name="delete" value="<TMPL_VAR id>">Delete</button>
-      <a href="index.py?view=folder;folder=<TMPL_VAR id>"><TMPL_VAR name>
+      <a href="?action=index&view=folder&folder=<TMPL_VAR id>"><TMPL_VAR name>
       	(<TMPL_VAR count>)</a></li>
     </TMPL_LOOP>
     </ul>
     </form>
     </div>
-    <form action="index.py?view=folder;folder=<TMPL_VAR folder>" method="post" name="add_folder">
+    <form action="?action=index&view=folder&folder=<TMPL_VAR folder>" method="post" name="add_folder">
       <label>Add subfolder with keyword:
       <input type="hidden" name="folder" value="<TMPL_VAR folder>"/>
       <input type="hidden" name="view" value="folder"/>
@@ -42,7 +42,7 @@
     <hr>
     <TMPL_INCLUDE NAME="bkmarks.tmpl">
     <hr>
-    <a href="?view=dynamic">Switch to dynamic view</a>
+    <a href="?action=index&view=dynamic">Switch to dynamic view</a>
     <TMPL_INCLUDE NAME="footers.tmpl">
   </body>
 </html>
--- a/import.py	Mon Aug 23 23:31:38 2004 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import traceback
-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 templates import Template
-from os import environ
-
-def main():
-    db = my_db.connect(environ["REMOTE_USER"])
-    tmpl = Template("import.tmpl", db.get_preferences())
-    print tmpl.process()
-
-if (__name__ == "__main__"):
-    main()
--- a/import.tmpl	Mon Aug 23 23:31:38 2004 -0400
+++ b/import.tmpl	Sat Dec 27 20:23:39 2008 -0500
@@ -3,12 +3,14 @@
   <TMPL_INCLUDE NAME="headers.tmpl">
   <body>
     <h1><TMPL_VAR remote_user>'s Import XBel File</h1>
-    <form enctype="multipart/form-data" action="do_import.py" name="import" method="post">
+    <form enctype="multipart/form-data" action="index.py" name="import" method="post">
+    <input type="hidden" name="action" value="import"/>
+    <input type="hidden" name="step" value="upload"/>
     <label>XBEL file to import: <input type="file" name="xbelfile"/>
     <button name="upload">Upload</button>
     </form>
     <hr>
-    <p>Retour à la <a href="index.py">page principale</a></p>
+    <p>Retour à la <a href="?action=index">page principale</a></p>
   </body>
 </html>
 <!-- Keep this comment at the end of the file
--- a/inc/bkmarks.tmpl	Mon Aug 23 23:31:38 2004 -0400
+++ b/inc/bkmarks.tmpl	Sat Dec 27 20:23:39 2008 -0500
@@ -2,7 +2,7 @@
   <TMPL_LOOP Bookmarks>
   <dt>
     <a href="<TMPL_VAR url>"><TMPL_VAR name></a>
-    <a href="edit.py?id=<TMPL_VAR id>">edit</a>
+    <a href="?action=edit&id=<TMPL_VAR id>">edit</a>
   </dt>
   <dd><p><TMPL_VAR desc></p></dd>
   </TMPL_LOOP>
--- a/inc/footers.tmpl	Mon Aug 23 23:31:38 2004 -0400
+++ b/inc/footers.tmpl	Sat Dec 27 20:23:39 2008 -0500
@@ -1,7 +1,7 @@
-    <p><a href="add.py">Add new bookmark</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><a href="?action=bookmark">Add new bookmark</a>.<br/>
+    <a href="?action=xbel">Import a XBEL file</a>.<br/>
+    <a href="?action=keywords">Edit keywords</a>.<br/>
+    <a href="?action=prefs">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
--- a/inc/headers.tmpl	Mon Aug 23 23:31:38 2004 -0400
+++ b/inc/headers.tmpl	Sat Dec 27 20:23:39 2008 -0500
@@ -2,5 +2,4 @@
   <title><TMPL_VAR remote_user>'s XBelWeb</title>
   <meta name="generator" content="XBelWeb"/>
   <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"
-  <link rel="home" href="index.py" title="XBelWeb's Main Page"/>
 </head>
--- a/index.py	Mon Aug 23 23:31:38 2004 -0400
+++ b/index.py	Sat Dec 27 20:23:39 2008 -0500
@@ -10,14 +10,25 @@
 	print "Content-type: text/html; charset=iso-8859-1;"
 	print
 
-# import cgitb; cgitb.enable()
+import cgitb; cgitb.enable()
 import cgi
 import my_db
 from os import environ
-from webutils import load_index
+from actions import actions;
 
 if (__name__ == "__main__"):
     form = cgi.FieldStorage()
+    if form.has_key('debug'):
+	sys.stderr = sys.stdout
+	print "<pre>"
     db = my_db.connect(environ["REMOTE_USER"])
     prefs = db.get_preferences()
-    load_index(db, prefs, form)
+    if form.has_key('action'):
+    	action = form['action'].value
+    else:
+    	action = 'default'
+    if action in actions.keys():
+    	actions[action](action, db, prefs, form)
+    else:
+    	actions['default']('default', db, prefs, form)
+    print "</pre>"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/actions.py	Sat Dec 27 20:23:39 2008 -0500
@@ -0,0 +1,32 @@
+import imp
+import sys
+import os
+
+
+class ActionsLoader:
+	def __init__(self):
+		self._actions = {}
+	def keys(self):
+		return self._actions.keys()
+	def _getmodule(self, name):
+		modpath = os.path.join(os.path.dirname(__file__), 'actions')
+		fp, pathname, description = imp.find_module(name, [modpath])
+		try:
+			return imp.load_module(name, fp, pathname, description)
+		finally:
+			if fp:
+				fp.close()
+	def __getitem__(self, item):
+		mname, fname = self._actions[item]
+		return self._getmodule(mname).__dict__[fname]
+	def __setitem__(self, key, value):
+		self._actions[key] = value
+		
+
+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['confirm'] = ('add', 'do_it')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/actions/add.py	Sat Dec 27 20:23:39 2008 -0500
@@ -0,0 +1,108 @@
+from templates import Template
+from bkmark import Bookmark
+from webutils import load_index
+from templates import Template
+from utils import unique
+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 = map(db.get_keyword, kw)
+      kw = kw + get_new_kw_from_form(form)
+      kw = unique(kw) 
+      return kw
+
+def edit(db, prefs, form):
+    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(keywords, title, 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(keywords, title, url, prefs):
+    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()
+
+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':
+		bk = get_bk_from_form(form)
+		kw = get_unique_keywords(form, db)
+		db.update_bookmark(bk)
+                load_index(db, prefs)
+        elif step == 'cancel' or (action == 'delete' and id == -1):
+                load_index(db, prefs)
+        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)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/actions/edit.py	Sat Dec 27 20:23:39 2008 -0500
@@ -0,0 +1,24 @@
+#!/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)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/actions/imp_xbel.py	Sat Dec 27 20:23:39 2008 -0500
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+
+from templates import Template
+from webutils import load_index
+from xbelimp import parse_xbel, import_bookmarks
+
+def upload(db, prefs, form):
+    file = form["xbelfile"].file
+    bms = parse_xbel(file)
+    import_bookmarks(db, bms)
+    load_index(db, prefs)
+
+def prepare(db, prefs, form = None):
+    tmpl = Template("import.tmpl", prefs)
+    print tmpl.process()
+
+def do_it(db, prefs, form):
+	if form.has_value('step'):
+		step = form['step'].value
+	else:
+		step = 'prepare'
+	if step = 'upload':
+		upload(db, prefs, form)
+	else:
+		prepare(db, prefs, form);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/actions/index.py	Sat Dec 27 20:23:39 2008 -0500
@@ -0,0 +1,4 @@
+from webutils import load_index
+
+def do_it(action, db, prefs, form):
+	load_index(db, prefs, form)
--- a/lib/my_db.py	Mon Aug 23 23:31:38 2004 -0400
+++ b/lib/my_db.py	Sat Dec 27 20:23:39 2008 -0500
@@ -74,10 +74,13 @@
 			WHERE u.id = %d AND p.userid = u.id;
 			""" % (self.userid,))
 		res = self.crs.fetchone()
+		rev_kw = 0
+		if (res[2]):
+			rev_kw = 1
 		return {
 		   'keywords_box' : res[0],
 		   'keywords_sort' : res[1],
-		   'keywords_reverse': res[2],
+		   'keywords_reverse': rev_kw,
 		   'fullname': res[3],
 		   'default_view': res[4]
 		   }