[svn r1610] Lots of "small" bugs corrected.
--- a/BUGS Sun Oct 26 22:56:49 2003 -0500
+++ b/BUGS Mon Oct 27 02:26:39 2003 -0500
@@ -1,1 +1,2 @@
-No known bugs.
+* Sorting keywords in folders doesn't respect preferences.
+* handling unicode import from xbel.
--- a/do_edit_kw.py Sun Oct 26 22:56:49 2003 -0500
+++ b/do_edit_kw.py Mon Oct 27 02:26:39 2003 -0500
@@ -19,7 +19,6 @@
def main(action, sel_keywords, keywords, prefs):
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')
--- a/folders.tmpl Sun Oct 26 22:56:49 2003 -0500
+++ b/folders.tmpl Mon Oct 27 02:26:39 2003 -0500
@@ -3,13 +3,17 @@
<TMPL_INCLUDE NAME="headers.tmpl">
<body>
<h1><TMPL_VAR remote_user>'s XBelWeb</h1>
- <h2><TMPL_IF folder><TMPL_VAR name><TMPL_ELSE>Main Folder</TMPL_IF>
- (<TMPL_VAR total>)</h2>
<TMPL_IF folder>
<p>Parents:
- <TMPL_LOOP Parents><a href="?view=folder;folder=<TMPL_VAR id>"><TMPL_VAR name></a>
- : </TMPL_LOOP></p>
+ <TMPL_LOOP Parents>
+ <TMPL_IF id> : </TMPL_IF>
+ <a href="?view=folder;folder=<TMPL_VAR id>"><TMPL_IF id><TMPL_VAR name>
+ <TMPL_ELSE>Top </TMPL_IF> (<TMPL_VAR count>)</a>
+ </TMPL_LOOP>
+ </p>
</TMPL_IF>
+ <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">
<input type="hidden" name="folder" value="<TMPL_VAR folder>"/>
@@ -31,7 +35,7 @@
<select name="sel" size="1">
<TMPL_LOOP Keywords>
<option value="<TMPL_VAR id>"
- ><TMPL_VAR keyword> (<TMPL_VAR count>)</option>
+ ><TMPL_VAR keyword> (<TMPL_VAR removed>/<TMPL_VAR count>)</option>
</TMPL_LOOP></select>
<button name="action" value="add">Add</button>
</form>
--- a/kw_confirm.tmpl Sun Oct 26 22:56:49 2003 -0500
+++ b/kw_confirm.tmpl Mon Oct 27 02:26:39 2003 -0500
@@ -24,7 +24,7 @@
</TMPL_LOOP>
</p>
<label>Merge them with:
- <select name="kw" size="1">
+ <select name="kw" multiple size="<TMPL_VAR kw_size">
<TMPL_LOOP Keywords>
<option value="<TMPL_VAR id>"><TMPL_VAR keyword></option>
</TMPL_LOOP></select><br/>
--- a/kw_result.py Sun Oct 26 22:56:49 2003 -0500
+++ b/kw_result.py Mon Oct 27 02:26:39 2003 -0500
@@ -18,17 +18,20 @@
def do_merge(form, db):
fromids = get_keywords(form, 'id')
- toid = int(form['kw'].value)
- tokw = db.get_keyword(toid)
+ toids = get_keywords(form, 'kw')
remove_them = form.has_key('remove')
+ if remove_them:
+ lastid = toids.pop()
for id in fromids:
fromkw = db.get_keyword(id)
+ for dest in toids:
+ tokw = db.get_keyword(dest)
+ print "<em>Adding '%s' into '%s'.</em><br/>" % (fromkw, tokw)
+ db.add_keywords(id, dest)
if remove_them:
+ tokw = db.get_keyword(lastid)
print "<em>Merging '%s' into '%s'.</em><br/>" % (fromkw, tokw)
- db.merge_keywords(id, toid)
- else:
- print "<em>Adding '%s' into '%s'.</em><br/>" % (fromkw, tokw)
- db.merge_keywords(id, toid)
+ db.merge_keywords(id, lastid)
def do_rename(form, db):
ids = get_keywords(form, 'id')
--- a/lib/folders.py Sun Oct 26 22:56:49 2003 -0500
+++ b/lib/folders.py Mon Oct 27 02:26:39 2003 -0500
@@ -18,16 +18,23 @@
return keyword
return -1
+def sort_kw_with_removed(l, r):
+ result = l['removed'] - r['removed']
+ if result == 0:
+ result = l['count'] - r['count']
+ return -int(result)
+
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))
+ tmpl.set('total', folder['count'])
+ tmpl.set('subtotal', 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)
+ keywords.sort(sort_kw_with_removed)
tmpl.set('Keywords', keywords)
print tmpl.process()
@@ -39,29 +46,32 @@
if form.has_key('action'):
do_folder_action(db, form, folder)
parents = db.get_folder_parents_and_self(folder)
+ parents.reverse()
children = db.get_subfolders(folder)
selection = map(lambda e: e['keyword'], parents)
exclusion = map(lambda e: e['keyword'], children)
- parents.reverse()
- folder = parents.pop()
- bookmarks = db.select_bookmarks(selection)
- selected_keywords = set_selection(db,
- map(lambda e: e[0], bookmarks),
- selection)
+ folders_keywords = []
+ for parent in parents:
+ folders_keywords.append(parent['keyword'])
+ parent['count'] = db.get_bookmarks_count(folders_keywords)
+ for child in children:
+ folders_keywords.append(child['keyword'])
+ # This is really selection, not folders_keywords
+ child['count'] = db.get_bookmarks_count(selection + [child['keyword']])
+ bookmarks = map(lambda bk: bk[0], db.select_bookmarks(selection))
+ allkw = db.get_keywords(bookmarks)
keywords = []
- subfolders = []
- folders_keywords = selection +exclusion
- for keyword in selected_keywords:
- if keyword['id'] not in folders_keywords:
- keywords.append(keyword)
- for child in children:
- if child['keyword'] == keyword['id']:
- child['count'] = keyword['count']
- subfolders.append(child)
- children.remove(child)
- break
+ for keyword in allkw:
+ if keyword[0] not in folders_keywords:
+ kw = { 'id': keyword[0], 'keyword': keyword[1] }
+ kwsel = selection + [kw['id']]
+ kw['count'] = db.get_bookmarks_count(kwsel)
+ kw['removed'] = db.get_bookmarks_count(kwsel, exclusion)
+ keywords.append(kw)
+ del allkw, folders_keywords
bookmarks = db.select_bookmarks(selection, exclusion)
if len(bookmarks) <> 0:
bookmarks = db.get_bookmarks(map(lambda bk: bk[0], bookmarks))
bookmarks = map(lambda bk: bk.dict(), bookmarks)
- output(prefs, folder, parents, subfolders, bookmarks, keywords)
+ output(prefs, parents.pop(), parents, children, bookmarks, keywords)
+
--- a/lib/my_db.py Sun Oct 26 22:56:49 2003 -0500
+++ b/lib/my_db.py Mon Oct 27 02:26:39 2003 -0500
@@ -220,7 +220,8 @@
self.crs.execute("""
INSERT INTO bookmarks_keywords (userid,
bookmark, keyword)
- SELECT (%d, %d, bookmark)
+ SELECT %d, bookmark, %d
+ FROM bookmarks_keywords
WHERE keyword = %d
AND userid = %d
AND bookmark NOT IN
@@ -268,9 +269,9 @@
if not res:
res = [[0,0]]
return res
- def select_bookmarks(self, has_kw = [0], except_kw = []):
+ def _bookmarks_selection(self, has_kw = [0], except_kw = []):
"""
-Return a list of id bookmarks who has /has_kw/ set but not /except_kw/.
+Return a bookmarks selection query used in at least two function.
"""
basic_qry = """
SELECT bk.bookmark FROM bookmarks_keywords bk
@@ -280,12 +281,32 @@
qry = basic_qry % (has_kw[0], self.userid)
for kw in has_kw[1:]:
- qry = qry + ("INTERSECT " + basic_qry % (kw, self.userid))
+ qry += ("INTERSECT " + basic_qry % (kw, self.userid))
for kw in except_kw:
- qry = qry + ("EXCEPT " + basic_qry % (kw, self.userid))
- qry = qry + ';'
+ qry += ("EXCEPT " + basic_qry % (kw, self.userid))
+ return qry
+ def select_bookmarks(self, has_kw = [0], except_kw = []):
+ """
+Return a list of id bookmarks who has /has_kw/ set but not /except_kw/.
+"""
+ qry = self._bookmarks_selection(has_kw, except_kw) + ';'
self.crs.execute(qry)
return self.crs.fetchall()
+ def get_bookmarks_count(self, has_kw = [0], except_kw = []):
+ """
+Return a count of bookmarks which would have been return on
+select_bookmarks qry.
+"""
+ qry = """
+ SELECT COUNT(id) FROM bookmarks
+ WHERE userid = %d AND id IN """ % self.userid
+ qry += "(" + self._bookmarks_selection(has_kw, except_kw) + ");"
+ self.crs.execute(qry)
+ result = self.crs.fetchone()
+ if result:
+ return result[0]
+ else:
+ return 0
def get_folder_keyword(self, id):
self.crs.execute("""
SELECT k.id, k.name