[svn r1610] Lots of "small" bugs corrected. xbelweb
authorfabien
Mon, 27 Oct 2003 02:26:39 -0500
branchxbelweb
changeset 53 e80160a19653
parent 52 fe0d02f344cb
child 54 f74bad856bce
[svn r1610] Lots of "small" bugs corrected.
BUGS
do_edit_kw.py
folders.tmpl
kw_confirm.tmpl
kw_result.py
lib/folders.py
lib/my_db.py
--- 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