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)