lib/webutils.py
author fabien
Sun, 12 Oct 2003 10:55:22 -0400
branchxbelweb
changeset 42 6d31ed0f6ad3
parent 41 7b7cd0e74ee3
child 44 87f94936990d
permissions -rwxr-xr-x
[svn r1593] Update to use user's preferences.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
     1
#!/usr/bin/python
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
     2
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
     3
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
     4
import cgi
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
     5
import my_db
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
     6
from htmltmpl import TemplateManager, TemplateProcessor
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
     7
from os import environ
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
     8
from urlparse import urljoin
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
     9
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    10
def get_keywords(form, name):
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    11
	kws = form.getvalue(name)
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    12
	if not isinstance(kws, type([])):
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    13
		if kws:
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    14
			kws = [kws]
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    15
		else:
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    16
			kws = []
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    17
	return map(int, kws)
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    18
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    19
def set_selection(db, bk, sel, exc = []):
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    20
	if len(bk) > 0:
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    21
		ids, names = map(list,apply(zip,db.get_keywords(bk)))
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    22
		for key in exc:
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    23
			if key not in ids:
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    24
				ids.append(key)
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    25
				names.append(db.get_keyword(key))
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    26
		allkw = map(lambda x,y: [x, y], ids, names)
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    27
	else:
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    28
		allkw = db.get_all_keywords()
41
7b7cd0e74ee3 [svn r1585] Restrict keywords count to selection.
fabien
parents: 38
diff changeset
    29
	(kw, cnt) = map(list,apply(zip, db.get_keywords_count(bk)))
31
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    30
	res = []
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    31
	for key in allkw:
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    32
		is_selected = key[0] in sel
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    33
		is_excluded = key[0] in exc
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    34
		is_unselected = not (is_selected or is_excluded)
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    35
		if key[0] in kw:
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    36
			kcnt = cnt[kw.index(key[0])]
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    37
		else:
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    38
			kcnt = 0
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    39
		res.append({'id':key[0],
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    40
			'keyword': key[1],
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    41
			'count' : kcnt,
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    42
			'selected' : is_selected,
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    43
			'excluded' : is_excluded,
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    44
			'unselected' : is_unselected})
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    45
	return res
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    46
38
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    47
def sort_keywords(kw, pref):
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    48
	global _sk_rev_fact
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    49
	global _sk_sort
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    50
	if pref['keywords_reverse']:
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    51
		_sk_rev_fact = -1
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    52
	else:
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    53
		_sk_rev_fact = 1
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    54
	_sk_sort = pref['keywords_sort'] 
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    55
	kw.sort(lambda l, r: _sk_rev_fact*cmp(l[_sk_sort], r[_sk_sort]))
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    56
	return kw
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    57
31
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    58
def get_curl():
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    59
	return urljoin( 'http://' + environ["HTTP_HOST"] + environ["REQUEST_URI"], 'add.py')
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    60
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    61
def load_index(db):
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    62
    	keywords = set_selection(db, [], [], [])
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    63
    	exc = map(lambda e: int(e['id']), keywords[1:])
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    64
   	bookmarks = db.select_bookmarks([0], exc)
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    65
    	total = keywords[0]['count']
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    66
	if len(bookmarks)>0:
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    67
    		bookmarks = db.get_bookmarks(map(lambda x: x[0], bookmarks))
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    68
    	bookmarks = map(lambda bk: bk.dict(), bookmarks)
38
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    69
	pref = db.get_preferences()
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    70
    	process_index(bookmarks, keywords[1:], pref)
31
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    71
38
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    72
def get_template_processor(prefs):
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    73
    tproc = TemplateProcessor()
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    74
    tproc.set("remote_user", environ["REMOTE_USER"])
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    75
    tproc.set("kw_size", prefs['keywords_box'])
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    76
    tproc.set("kw_sort", prefs['keywords_sort'])
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    77
    tproc.set("kw_reverse", prefs['keywords_reverse'])
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    78
    return tproc
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    79
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    80
def process_index(bk, kw, pref):
31
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    81
    tmpl = TemplateManager().prepare("index.tmpl")
38
c30e2402deca [svn r1582] Add some user preferences support (kw sorting and kw select box size).
fabien
parents: 31
diff changeset
    82
    tproc = get_template_processor(pref)
31
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    83
    bk.sort(lambda x,y: cmp(x['name'],y['name']))
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    84
    tproc.set("Bookmarks", bk)
41
7b7cd0e74ee3 [svn r1585] Restrict keywords count to selection.
fabien
parents: 38
diff changeset
    85
    kw = sort_keywords(kw, pref)
31
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    86
    tproc.set("Keywords", kw)
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    87
    tproc.set("curl", get_curl())
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    88
    tproc.set("total", len(bk))
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    89
    print tproc.process(tmpl)
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    90
cee64de4e7e0 [svn r1575] Move index.py generic functions into a separate library.
fabien
parents:
diff changeset
    91