Mercurial > code > home > repos > href
comparison lookup.py @ 24:ab9a6132529a
redo siteRoot handling. fix some pathing bugs.
Ignore-this: 30fa1b320f62623e9b6a683f81d842a5
author | drewp@bigasterisk.com |
---|---|
date | Mon, 23 May 2016 23:39:24 -0700 |
parents | fa55f4439977 |
children | e02fc021ab89 |
comparison
equal
deleted
inserted
replaced
23:d6a09e8efa56 | 24:ab9a6132529a |
---|---|
6 /user/tag+tag+tag | 6 /user/tag+tag+tag |
7 | 7 |
8 and the add-bookmark stuff | 8 and the add-bookmark stuff |
9 | 9 |
10 """ | 10 """ |
11 import pymongo, bottle, time, urllib, datetime, json, restkit | 11 import pymongo, bottle, time, urllib, datetime, json, restkit, logging |
12 from collections import defaultdict | 12 from collections import defaultdict |
13 from urllib2 import urlparse | 13 from urllib2 import urlparse |
14 from dateutil.tz import tzlocal | 14 from dateutil.tz import tzlocal |
15 from bottle import static_file | 15 from bottle import static_file |
16 from jadestache import Renderer | 16 from jadestache import Renderer |
18 from link import Links, NotFound | 18 from link import Links, NotFound |
19 db = pymongo.Connection('bang', tz_aware=True)['href'] | 19 db = pymongo.Connection('bang', tz_aware=True)['href'] |
20 pageTitle = PageTitle(db) | 20 pageTitle = PageTitle(db) |
21 links = Links(db) | 21 links = Links(db) |
22 renderer = Renderer(search_dirs=['template'], debug=bottle.DEBUG) | 22 renderer = Renderer(search_dirs=['template'], debug=bottle.DEBUG) |
23 log = logging.getLogger() | |
23 | 24 |
24 siteRoot = 'https://bigasterisk.com/href' | 25 siteRoot = 'https://bigasterisk.com/href' |
25 | 26 |
26 def getLoginBar(): | 27 def getLoginBar(): |
27 openidProxy = restkit.Resource("http://bang:9023/") | 28 openidProxy = restkit.Resource("http://bang:9023/") |
28 return openidProxy.get("_loginBar", | 29 return openidProxy.get("_loginBar", |
29 headers={"Cookie" : bottle.request.headers.get('cookie')}).body_string() | 30 headers={ |
31 "Cookie" : bottle.request.headers.get('cookie'), | |
32 'x-site': 'http://bigasterisk.com/openidProxySite/href', | |
33 }).body_string() | |
30 | 34 |
31 def getUser(): | 35 def getUser(): |
32 agent = bottle.request.headers.get('x-foaf-agent', None) | 36 agent = bottle.request.headers.get('x-foaf-agent', None) |
33 username = db['user'].find_one({'_id':agent})['username'] if agent else None | 37 username = db['user'].find_one({'_id':agent})['username'] if agent else None |
34 return username, agent | 38 return username, agent |
39 | |
40 def siteRoot(): | |
41 try: | |
42 return bottle.request.headers['x-site-root'].rstrip('/') | |
43 except KeyError: | |
44 log.warn(repr(bottle.request.__dict__)) | |
45 raise | |
35 | 46 |
36 @bottle.route('/static/<path:path>') | 47 @bottle.route('/static/<path:path>') |
37 def server_static(path): | 48 def server_static(path): |
38 return static_file(path, root='static') | 49 return static_file(path, root='static') |
39 | 50 |
40 def recentLinks(user, tags=None): | 51 def recentLinks(user, tags, allowEdit): |
41 out = {'links':[]} | 52 out = {'links':[]} |
42 t1 = time.time() | 53 t1 = time.time() |
43 spec = {'user':user} | 54 spec = {'user':user} |
44 if tags: | 55 if tags: |
45 spec['extracted.tags'] = {'$all' : tags} | 56 spec['extracted.tags'] = {'$all' : tags} |
46 for doc in db['links'].find(spec, sort=[('t', -1)], limit=50): | 57 for doc in db['links'].find(spec, sort=[('t', -1)], limit=50): |
47 out['links'].append(links.forDisplay(doc)) | 58 link = links.forDisplay(doc) |
59 link['allowEdit'] = allowEdit | |
60 out['links'].append(link) | |
48 out['stats'] = {'queryTimeMs' : round((time.time() - t1) * 1000, 2)} | 61 out['stats'] = {'queryTimeMs' : round((time.time() - t1) * 1000, 2)} |
49 return out | 62 return out |
50 | 63 |
51 def allTags(user, withTags=[]): | 64 def allTags(user, withTags=[]): |
52 """withTags limits results to other tags that have been used with | 65 """withTags limits results to other tags that have been used with |
71 return rendered | 84 return rendered |
72 | 85 |
73 @bottle.route('/addLink') | 86 @bottle.route('/addLink') |
74 def addLink(): | 87 def addLink(): |
75 out = { | 88 out = { |
76 'toRoot': '.', | 89 'toRoot': siteRoot(), |
77 'absRoot': siteRoot, | 90 'absRoot': siteRoot, |
78 'user': getUser()[0], | 91 'user': getUser()[0], |
79 'withKnockout': True, | 92 'withKnockout': True, |
80 'fillHrefJson': json.dumps(bottle.request.params.get('url', '')), | 93 'fillHrefJson': json.dumps(bottle.request.params.get('url', '')), |
81 'loginBar': getLoginBar(), | 94 'loginBar': getLoginBar(), |
132 | 145 |
133 return {'tags' : out} | 146 return {'tags' : out} |
134 | 147 |
135 @bottle.route('/<user>/') | 148 @bottle.route('/<user>/') |
136 def userSlash(user): | 149 def userSlash(user): |
137 bottle.redirect("/%s" % urllib.quote(user)) | 150 bottle.redirect(siteRoot() + "/%s" % urllib.quote(user)) |
138 | 151 |
139 @bottle.route('/<user>.json', method='GET') | 152 @bottle.route('/<user>.json', method='GET') |
140 def userAllJson(user): | 153 def userAllJson(user): |
141 data = recentLinks(user, []) | 154 data = recentLinks(user, [], allowEdit=getUser()[0] == user) |
142 data['toRoot'] = "." | 155 data['toRoot'] = siteRoot() |
143 return json.dumps(data) | 156 return json.dumps(data) |
144 | 157 |
145 @bottle.route('/<user>', method='GET') | 158 @bottle.route('/<user>', method='GET') |
146 def userAll(user): | 159 def userAll(user): |
147 return userLinks(user, "", toRoot=".") | 160 return userLinks(user, "") |
148 | 161 |
149 | 162 |
150 @bottle.route('/<user>', method='POST') | 163 @bottle.route('/<user>', method='POST') |
151 def userAddLink(user): | 164 def userAddLink(user): |
152 if getUser()[0] != user: | 165 if getUser()[0] != user: |
166 return filter(None, tagComponent.replace("%20", "+").split('+')) | 179 return filter(None, tagComponent.replace("%20", "+").split('+')) |
167 | 180 |
168 @bottle.route('/<user>/<tags:re:.*>.json') | 181 @bottle.route('/<user>/<tags:re:.*>.json') |
169 def userLinksJson(user, tags): | 182 def userLinksJson(user, tags): |
170 tags = parseTags(tags) | 183 tags = parseTags(tags) |
171 data = recentLinks(user, tags) | 184 data = recentLinks(user, tags, allowEdit=getUser()[0] == user) |
172 data['toRoot'] = ".." | 185 data['toRoot'] = siteRoot() |
173 return json.dumps(data) | 186 return json.dumps(data) |
174 | 187 |
175 | 188 |
176 @bottle.route('/<user>/<tags>') | 189 @bottle.route('/<user>/<tags>') |
177 def userLinks(user, tags, toRoot=".."): | 190 def userLinks(user, tags): |
178 tags = parseTags(tags) | 191 tags = parseTags(tags) |
179 data = recentLinks(user, tags) | 192 log.info('userLinks user=%r tags=%r', user, tags) |
193 data = recentLinks(user, tags, allowEdit=getUser()[0] == user) | |
180 data['loginBar'] = getLoginBar() | 194 data['loginBar'] = getLoginBar() |
181 data['desc'] = ("%s's recent links" % user) + (" tagged %s" % (tags,) if tags else "") | 195 data['desc'] = ("%s's recent links" % user) + (" tagged %s" % (tags,) if tags else "") |
182 data['toRoot'] = toRoot | 196 data['toRoot'] = siteRoot() |
183 data['allTags'] = allTags(user) | 197 data['allTags'] = allTags(user) |
184 data['user'] = user | 198 data['user'] = user |
185 data['showPrivateData'] = (user == getUser()[0]) | 199 data['showPrivateData'] = (user == getUser()[0]) |
186 | 200 |
187 data['pageTags'] = [{"word":t} for t in tags] | 201 data['pageTags'] = [{"word":t} for t in tags] |
194 | 208 |
195 @bottle.route('/') | 209 @bottle.route('/') |
196 def root(): | 210 def root(): |
197 data = { | 211 data = { |
198 'loginBar': getLoginBar(), | 212 'loginBar': getLoginBar(), |
199 'toRoot': ".", | 213 'toRoot': siteRoot(), |
200 'stats': {'template': 'TEMPLATETIME'}, | 214 'stats': {'template': 'TEMPLATETIME'}, |
201 'users': [{'user':doc['username']} for doc in db['user'].find()], | 215 'users': [{'user':doc['username']} for doc in db['user'].find()], |
202 } | 216 } |
203 return renderWithTime('index.jade', data) | 217 return renderWithTime('index.jade', data) |
204 | 218 |
205 if __name__ == '__main__': | 219 if __name__ == '__main__': |
220 logging.basicConfig(level=logging.INFO) | |
206 bottle.run(server='gunicorn', host='0.0.0.0', port=10002, workers=4) | 221 bottle.run(server='gunicorn', host='0.0.0.0', port=10002, workers=4) |