Mercurial > code > home > repos > href
comparison lookup.py @ 5:f8c4c7ce5f4a
lots of href additions: add/edit, nav fixes
Ignore-this: 863335c4680ac9bcc6a7fc5867638d61
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Thu, 21 Feb 2013 01:39:01 -0800 |
parents | 409da49c148d |
children | 93d94f327e82 |
comparison
equal
deleted
inserted
replaced
4:409da49c148d | 5:f8c4c7ce5f4a |
---|---|
3 serve some queries over bookmarks: | 3 serve some queries over bookmarks: |
4 | 4 |
5 /user | 5 /user |
6 /user/tag+tag+tag | 6 /user/tag+tag+tag |
7 | 7 |
8 and the add-bookmark stuff | |
9 | |
8 """ | 10 """ |
9 import pymongo, bottle, time, urllib, datetime | 11 import pymongo, bottle, time, urllib, datetime, json, restkit |
10 from urllib2 import urlparse | 12 from urllib2 import urlparse |
11 from dateutil.tz import tzlocal | 13 from dateutil.tz import tzlocal |
12 from bottle import static_file | 14 from bottle import static_file |
13 from jadestache import Renderer | 15 from jadestache import Renderer |
16 from pagetitle import PageTitle | |
17 from link import Links, NotFound | |
14 db = pymongo.Connection('bang', tz_aware=True)['href'] | 18 db = pymongo.Connection('bang', tz_aware=True)['href'] |
15 | 19 pageTitle = PageTitle(db) |
20 links = Links(db) | |
16 renderer = Renderer(search_dirs=['template'], debug=bottle.DEBUG) | 21 renderer = Renderer(search_dirs=['template'], debug=bottle.DEBUG) |
17 | 22 |
23 siteRoot = 'https://bigasterisk.com/href' | |
24 | |
25 def getLoginBar(): | |
26 openidProxy = restkit.Resource("http://bang:9023/") | |
27 return openidProxy.get("_loginBar", | |
28 headers={"Cookie" : bottle.request.headers.get('cookie')}).body_string() | |
29 | |
30 def getUser(): | |
31 agent = bottle.request.headers.get('x-foaf-agent', None) | |
32 username = db['user'].find_one({'_id':agent})['username'] if agent else None | |
33 return username, agent | |
34 | |
18 @bottle.route('/static/<filename>') | 35 @bottle.route('/static/<filename>') |
19 def server_static(filename): | 36 def server_static(filename): |
20 return static_file(filename, root='static') | 37 return static_file(filename, root='static') |
21 | 38 |
22 def recentTags(user, tags=None): | 39 def recentTags(user, tags=None): |
33 else: | 50 else: |
34 doc['displayDescription'] = doc['description'] | 51 doc['displayDescription'] = doc['description'] |
35 | 52 |
36 doc['tagWords'] = [{'word' : w} for w in doc['tag'].split(None)] | 53 doc['tagWords'] = [{'word' : w} for w in doc['tag'].split(None)] |
37 doc['domain'] = urlparse.urlparse(doc['href']).netloc | 54 doc['domain'] = urlparse.urlparse(doc['href']).netloc |
55 doc['editLink'] = 'addLink?' + urllib.urlencode([('url', doc['href'])]) | |
38 | 56 |
39 out['links'].append(doc) | 57 out['links'].append(doc) |
40 out['stats'] = {'queryTimeMs' : round((time.time() - t1) * 1000, 2)} | 58 out['stats'] = {'queryTimeMs' : round((time.time() - t1) * 1000, 2)} |
41 return out | 59 return out |
42 | 60 |
44 t1 = time.time() | 62 t1 = time.time() |
45 rendered = renderer.render_name(name, data) | 63 rendered = renderer.render_name(name, data) |
46 dt = (time.time() - t1) * 1000 | 64 dt = (time.time() - t1) * 1000 |
47 rendered = rendered.replace('TEMPLATETIME', "%.02f ms" % dt) | 65 rendered = rendered.replace('TEMPLATETIME', "%.02f ms" % dt) |
48 return rendered | 66 return rendered |
49 | |
50 def getUser(): | |
51 return 'drewpca' # logged in user | |
52 | 67 |
53 @bottle.route('/addLink') | 68 @bottle.route('/addLink') |
54 def addLink(): | 69 def addLink(): |
55 out = {'toRoot': '.'} | 70 out = { |
56 out['user'] = getUser() | 71 'toRoot': '.', |
57 out['withKnockout'] = True | 72 'absRoot': siteRoot, |
73 'user': getUser()[0], | |
74 'withKnockout': True, | |
75 'fillHrefJson': json.dumps(bottle.request.params.get('url', '')), | |
76 'loginBar': getLoginBar(), | |
77 } | |
58 return renderWithTime('add.jade', out) | 78 return renderWithTime('add.jade', out) |
59 | 79 |
60 @bottle.route('/addOverlay') | 80 @bottle.route('/addOverlay') |
61 def addOverlay(): | 81 def addOverlay(): |
62 p = bottle.request.params | 82 p = bottle.request.params |
63 | 83 |
64 return "" | 84 return "" |
65 | 85 |
86 | |
87 @bottle.route('/addLink/proposedUri') | |
88 def proposedUri(): | |
89 uri = bottle.request.params.uri | |
90 user, _ = getUser() | |
66 | 91 |
67 proposal check existing links, get page title (stuff that in db), get tags from us and other serviecs. maybe the deferred ones ater | 92 try: |
93 prevDoc = links.find(uri) | |
94 except NotFound: | |
95 prevDoc = None | |
96 | |
97 return { | |
98 'description': prevDoc['description'] if prevDoc else pageTitle.pageTitle(uri), | |
99 'tag' : prevDoc['tag'] if prevDoc else '', | |
100 'extended' : prevDoc['extended'] if prevDoc else '', | |
101 'suggestedTags':['tag1', 'tag2'], | |
102 'existed':prevDoc is not None, | |
103 } | |
104 | |
105 if 0: | |
106 pass#proposal check existing links, get page title (stuff that in db), get tags from us and other serviecs. maybe the deferred ones ater | |
68 | 107 |
69 | 108 |
70 @bottle.route('/<user>/') | 109 @bottle.route('/<user>/') |
71 def userSlash(user): | 110 def userSlash(user): |
72 bottle.redirect("/%s" % urllib.quote(user)) | 111 bottle.redirect("/%s" % urllib.quote(user)) |
73 | 112 |
74 @bottle.route('/<user>', method='GET') | 113 @bottle.route('/<user>', method='GET') |
75 def userAll(user): | 114 def userAll(user): |
76 data = recentTags(user, tags=None) | 115 data = recentTags(user, tags=None) |
77 | 116 |
117 data['loginBar'] = getLoginBar() | |
78 data['desc'] = "%s's recent links" % user | 118 data['desc'] = "%s's recent links" % user |
79 data['toRoot'] = "." | 119 data['toRoot'] = "." |
80 data['stats']['template'] = 'TEMPLATETIME' | 120 data['stats']['template'] = 'TEMPLATETIME' |
81 return renderWithTime('links.jade', data) | 121 return renderWithTime('links.jade', data) |
82 | 122 |
83 @bottle.route('/<user>', method='POST') | 123 @bottle.route('/<user>', method='POST') |
84 def userAddLink(user): | 124 def userAddLink(user): |
85 p = bottle.request.params | 125 p = bottle.request.params |
86 doc = dict( | 126 if getUser()[0] != user: |
127 raise ValueError("not logged in as %s" % user) | |
128 links.insertOrUpdate(dict( | |
87 user=user, | 129 user=user, |
88 description=p.description, | 130 description=p.description, |
89 extended=p.extended, | 131 extended=p.extended, |
90 href=p.href, | 132 href=p.href, |
91 #private=p.private, == checked, | 133 #private=p.private, == checked, |
92 #shared ?? | 134 #shared ?? |
93 tag=p.tag, | 135 tag=p.tag, |
94 t=datetime.datetime.now(tzlocal()), | 136 t=datetime.datetime.now(tzlocal()), |
95 ) | 137 )) |
96 db['links'].insert(doc, safe=True) | |
97 | 138 |
98 bottle.redirect(user) | 139 bottle.redirect(siteRoot + '/' + user) |
99 | 140 |
100 @bottle.route('/<user>/<tags>') | 141 @bottle.route('/<user>/<tags>') |
101 def userLinks(user, tags): | 142 def userLinks(user, tags): |
102 tags = tags.split('+') | 143 tags = tags.split('+') |
103 data = recentTags(user, tags) | 144 data = recentTags(user, tags) |
145 data['loginBar'] = getLoginBar() | |
104 data['desc'] = "%s's recent links tagged %s" % (user, tags) | 146 data['desc'] = "%s's recent links tagged %s" % (user, tags) |
105 data['toRoot'] = ".." | 147 data['toRoot'] = ".." |
106 | 148 |
107 data['pageTags'] = [{"word":t} for t in tags] | 149 data['pageTags'] = [{"word":t} for t in tags] |
108 data['stats']['template'] = 'TEMPLATETIME' | 150 data['stats']['template'] = 'TEMPLATETIME' |
109 return renderWithTime('links.jade', data) | 151 return renderWithTime('links.jade', data) |
152 | |
153 @bottle.route('/') | |
154 def root(): | |
155 data = { | |
156 'loginBar': getLoginBar(), | |
157 'toRoot': ".", | |
158 'stats': {'template': 'TEMPLATETIME'}, | |
159 'users': [{'user':doc['username']} for doc in db['user'].find()], | |
160 } | |
161 return renderWithTime('index.jade', data) | |
110 | 162 |
111 if __name__ == '__main__': | 163 if __name__ == '__main__': |
112 bottle.run(server='gunicorn', host='0.0.0.0', port=10002, workers=4) | 164 bottle.run(server='gunicorn', host='0.0.0.0', port=10002, workers=4) |