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)