# HG changeset patch # User fabien # Date 1067239599 18000 # Node ID e80160a196535c36ed206218c769104ceb202da1 # Parent fe0d02f344cb06b2e0b87f8c2110a7788234c02f [svn r1610] Lots of "small" bugs corrected. diff -r fe0d02f344cb -r e80160a19653 BUGS --- 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. diff -r fe0d02f344cb -r e80160a19653 do_edit_kw.py --- 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') diff -r fe0d02f344cb -r e80160a19653 folders.tmpl --- 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> diff -r fe0d02f344cb -r e80160a19653 kw_confirm.tmpl --- 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/> diff -r fe0d02f344cb -r e80160a19653 kw_result.py --- 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') diff -r fe0d02f344cb -r e80160a19653 lib/folders.py --- 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) + diff -r fe0d02f344cb -r e80160a19653 lib/my_db.py --- 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