[svn r1604] Implement default_view preferences, which move things around a lot.
--- 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><Right-Mouse
+ Click> 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><Right-Mouse
- Click> 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>