annotate wikked/views.py @ 52:8167b9b6925a

Don't open/close connections all the time in command-line.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 31 Jan 2013 22:40:12 -0800
parents 86ee1b696070
children 4cb946982fca
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import time
37
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
2 import os.path
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
3 from flask import render_template, abort, request, g, jsonify
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
4 from flask.ext.login import login_user, logout_user, current_user
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
5 from pygments import highlight
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
6 from pygments.lexers import get_lexer_by_name
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
7 from pygments.formatters import get_formatter_by_name
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
8 from web import app, login_manager
45
f63a2062fb99 Moved application init to a standalone `web` module.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
9 from wiki import Page
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 from fs import PageNotFoundError
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 import scm
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
14 DONT_CHECK = 0
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
15 CHECK_FOR_READ = 1
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
16 CHECK_FOR_WRITE = 2
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
17
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
18 COERCE_META = {
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
19 'redirect': Page.title_to_url
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
20 }
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
21
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
22
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
23 def get_page_or_none(url):
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 try:
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
25 page = g.wiki.getPage(url)
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 page._ensureMeta()
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 return page
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 except PageNotFoundError:
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
29 return None
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
30
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
31
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
32 def get_page_or_404(url, check_perms=DONT_CHECK):
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
33 page = get_page_or_none(url)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
34 if page is not None:
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
35 if check_perms == CHECK_FOR_READ and not is_page_readable(page):
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
36 abort(401)
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
37 elif check_perms == CHECK_FOR_WRITE and not is_page_writable(page):
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
38 abort(401)
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
39 return page
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
40 abort(404)
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
43 def is_page_readable(page, user=current_user):
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
44 return page.wiki.auth.isPageReadable(page, user.get_id())
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
45
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
46
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
47 def is_page_writable(page, user=current_user):
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
48 return page.wiki.auth.isPageWritable(page, user.get_id())
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
49
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
50
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
51 def get_page_meta(page, local_only=False):
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
52 if local_only:
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
53 meta = dict(page.local_meta)
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
54 else:
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
55 meta = dict(page.all_meta)
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
56 meta['title'] = page.title
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
57 meta['url'] = page.url
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
58 for name in COERCE_META:
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
59 if name in meta:
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
60 meta[name] = COERCE_META(meta[name])
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
61 return meta
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
62
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
63
19
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
64 def get_history_data(history):
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
65 hist_data = []
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
66 for i, rev in enumerate(reversed(history)):
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
67 rev_data = {
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
68 'index': i + 1,
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
69 'rev_id': rev.rev_id,
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
70 'rev_hash': rev.rev_hash,
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
71 'author': rev.author,
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
72 'timestamp': rev.timestamp,
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
73 'description': rev.description,
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
74 'pages': []
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
75 }
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
76 for f in rev.files:
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
77 f_info = g.wiki.fs.getPageInfo(f['path'])
19
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
78 if f_info is None:
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
79 continue
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
80 page = g.wiki.getPage(f_info['url'])
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
81 if not is_page_readable(page):
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
82 continue
19
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
83 rev_data['pages'].append({
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
84 'url': f_info['url'],
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
85 'action': scm.ACTION_NAMES[f['action']]
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
86 })
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
87 if len(rev_data['pages']) > 0:
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
88 hist_data.append(rev_data)
19
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
89 return hist_data
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
90
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
91
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
92 def make_auth_response(data):
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
93 if current_user.is_authenticated():
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
94 data['auth'] = {
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
95 'username': current_user.username,
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
96 'is_admin': current_user.is_admin()
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
97 }
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
98 return jsonify(data)
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
99
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
100
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 @app.route('/')
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102 def home():
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 return render_template('index.html', cache_bust=('?%d' % time.time()))
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105
11
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
106 @app.route('/read/<path:url>')
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
107 def read():
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
108 return render_template('index.html', cache_bust=('?%d' % time.time()))
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
109
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
110
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
111 @app.route('/search')
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
112 def search():
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
113 return render_template('index.html', cache_bust=('?%d' % time.time()))
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
114
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
115
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 @app.route('/api/list')
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 def api_list_all_pages():
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
118 return api_list_pages(None)
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 @app.route('/api/list/<path:url>')
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 def api_list_pages(url):
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
123 pages = filter(is_page_readable, g.wiki.getPages(url))
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
124 page_metas = [get_page_meta(page) for page in pages]
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
125 result = {'path': url, 'pages': list(page_metas)}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
126 return make_auth_response(result)
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 @app.route('/api/read/<path:url>')
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 def api_read_page(url):
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
131 page = get_page_or_404(url, CHECK_FOR_READ)
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
132 result = {'meta': get_page_meta(page), 'text': page.text}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
133 return make_auth_response(result)
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136 @app.route('/api/raw/<path:url>')
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 def api_read_page_raw(url):
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
138 page = get_page_or_404(url, CHECK_FOR_READ)
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
139 result = {'meta': get_page_meta(page), 'text': page.raw_text}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
140 return make_auth_response(result)
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
141
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
142
19
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
143 @app.route('/api/revision/<path:url>')
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
144 def api_read_page_rev(url):
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
145 rev = request.args.get('rev')
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
146 if rev is None:
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
147 abort(400)
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
148 page = get_page_or_404(url, CHECK_FOR_READ)
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
149 page_rev = page.getRevision(rev)
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
150 meta = dict(get_page_meta(page, True), rev=rev)
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
151 result = {'meta': meta, 'text': page_rev}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
152 return make_auth_response(result)
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
153
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
154
19
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
155 @app.route('/api/diff/<path:url>')
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
156 def api_diff_page(url):
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
157 rev1 = request.args.get('rev1')
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
158 rev2 = request.args.get('rev2')
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
159 if rev1 is None:
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
160 abort(400)
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
161 page = get_page_or_404(url, CHECK_FOR_READ)
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
162 diff = page.getDiff(rev1, rev2)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
163 if 'raw' not in request.args:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
164 lexer = get_lexer_by_name('diff')
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
165 formatter = get_formatter_by_name('html')
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
166 diff = highlight(diff, lexer, formatter)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
167 if rev2 is None:
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
168 meta = dict(get_page_meta(page, True), change=rev1)
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
169 else:
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
170 meta = dict(get_page_meta(page, True), rev1=rev1, rev2=rev2)
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
171 result = {'meta': meta, 'diff': diff}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
172 return make_auth_response(result)
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
173
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
174
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
175 @app.route('/api/state/<path:url>')
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
176 def api_get_state(url):
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
177 page = get_page_or_404(url, CHECK_FOR_READ)
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
178 state = page.getState()
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
179 return make_auth_response({
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
180 'meta': get_page_meta(page, True),
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
181 'state': scm.STATE_NAMES[state]
19
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
182 })
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
183
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185 @app.route('/api/outlinks/<path:url>')
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186 def api_get_outgoing_links(url):
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
187 page = get_page_or_404(url, CHECK_FOR_READ)
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
188 links = []
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
189 for link in page.out_links:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
190 other = get_page_or_none(link)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
191 if other is not None:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
192 links.append({
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
193 'url': link,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
194 'title': other.title
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
195 })
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
196 else:
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
197 links.append({'url': link, 'missing': True})
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
198
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
199 result = {'meta': get_page_meta(page, True), 'out_links': links}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
200 return make_auth_response(result)
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
201
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
202
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
203 @app.route('/api/inlinks/<path:url>')
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
204 def api_get_incoming_links(url):
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
205 page = get_page_or_404(url, CHECK_FOR_READ)
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
206 links = []
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
207 for link in page.in_links:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
208 other = get_page_or_none(link)
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
209 if other is not None and is_page_readable(other):
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
210 links.append({
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
211 'url': link,
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
212 'title': other.title
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
213 })
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
214 else:
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
215 links.append({'url': link, 'missing': True})
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
216
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
217 result = {'meta': get_page_meta(page, True), 'in_links': links}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
218 return make_auth_response(result)
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
219
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
220
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221 @app.route('/api/edit/<path:url>', methods=['GET', 'PUT', 'POST'])
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 def api_edit_page(url):
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
223 if request.method == 'GET':
37
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
224 page = get_page_or_none(url)
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
225 if page is None:
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
226 result = {
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
227 'meta': {
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
228 'url': url,
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
229 'name': os.path.basename(url),
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
230 'title': Page.url_to_title(url)
37
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
231 },
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
232 'text': ''
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
233 }
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
234 else:
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
235 if not is_page_writable(page):
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
236 abort(401)
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
237 result = {
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
238 'meta': get_page_meta(page, True),
37
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
239 'text': page.raw_text
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
240 }
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
241 result['commit_meta'] = {
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
242 'author': request.remote_addr,
f710528f24b0 Better API responses for editing a new page:
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
243 'desc': 'Editing ' + result['meta']['title']
10
6ac0b74a57f7 UI improvements for page editing.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
244 }
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
245 return make_auth_response(result)
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
246
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
247 get_page_or_404(url, CHECK_FOR_WRITE)
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
248
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
249 if not 'text' in request.form:
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
250 abort(400)
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
251 text = request.form['text']
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
252 author = request.remote_addr
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
253 if 'author' in request.form and len(request.form['author']) > 0:
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
254 author = request.form['author']
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
255 message = 'Edited ' + url
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
256 if 'message' in request.form and len(request.form['message']) > 0:
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
257 message = request.form['message']
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
258
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
259 page_fields = {
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
260 'text': text,
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
261 'author': author,
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
262 'message': message
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 }
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
264 g.wiki.setPage(url, page_fields)
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
265 result = {'saved': 1}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
266 return make_auth_response(result)
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
268
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
269 @app.route('/api/rename/<path:url>', methods=['POST'])
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
270 def api_rename_page(url):
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
271 pass
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
272
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
273
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
274 @app.route('/api/delete/<path:url>', methods=['POST'])
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
275 def api_delete_page(url):
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
276 pass
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
278
19
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
279 @app.route('/api/orphans')
17
8a4e0fe2c689 Added "Special Pages" section:
Ludovic Chabant <ludovic@chabant.com>
parents: 13
diff changeset
280 def api_special_orphans():
8a4e0fe2c689 Added "Special Pages" section:
Ludovic Chabant <ludovic@chabant.com>
parents: 13
diff changeset
281 orphans = []
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
282 for page in filter(is_page_readable, g.wiki.getPages()):
17
8a4e0fe2c689 Added "Special Pages" section:
Ludovic Chabant <ludovic@chabant.com>
parents: 13
diff changeset
283 if len(page.in_links) == 0:
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
284 orphans.append({'path': page.url, 'meta': get_page_meta(page, True)})
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
285 result = {'orphans': orphans}
17
8a4e0fe2c689 Added "Special Pages" section:
Ludovic Chabant <ludovic@chabant.com>
parents: 13
diff changeset
286 return make_auth_response(result)
8a4e0fe2c689 Added "Special Pages" section:
Ludovic Chabant <ludovic@chabant.com>
parents: 13
diff changeset
287
8a4e0fe2c689 Added "Special Pages" section:
Ludovic Chabant <ludovic@chabant.com>
parents: 13
diff changeset
288
19
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
289 @app.route('/api/history')
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
290 def api_site_history():
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
291 history = g.wiki.getHistory()
19
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
292 hist_data = get_history_data(history)
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
293 result = {'history': hist_data}
19
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
294 return make_auth_response(result)
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
295
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
296
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
297 @app.route('/api/history/<path:url>')
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
298 def api_page_history(url):
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
299 page = get_page_or_404(url, CHECK_FOR_READ)
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
300 history = page.getHistory()
19
884eb6c8edf0 Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
301 hist_data = get_history_data(history)
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
302 result = {'url': url, 'meta': get_page_meta(page, True), 'history': hist_data}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
303 return make_auth_response(result)
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
304
0
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
305
11
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
306 @app.route('/api/search')
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
307 def api_search():
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
308 query = request.args.get('q')
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
309
35
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
310 def is_hit_readable(hit):
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
311 page = get_page_or_none(hit['url'])
2b35d719f342 Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
312 return page is None or is_page_readable(page)
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
313 hits = filter(is_hit_readable, g.wiki.index.search(query))
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
314 result = {'query': query, 'hits': hits}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
315 return make_auth_response(result)
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
316
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
317
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
318 @app.route('/api/admin/reindex', methods=['POST'])
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
319 def api_admin_reindex():
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
320 if not current_user.is_authenticated() or not current_user.is_admin():
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
321 return login_manager.unauthorized()
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
322 g.wiki.index.reset(g.wiki.getPages())
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
323 result = {'ok': 1}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
324 return make_auth_response(result)
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
325
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
326
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
327 @app.route('/api/user/login', methods=['POST'])
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
328 def api_user_login():
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
329 username = request.form.get('username')
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
330 password = request.form.get('password')
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
331 remember = request.form.get('remember')
11
aa6951805e1a New features and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
332
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
333 user = g.wiki.auth.getUser(username)
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
334 if user is not None:
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
335 if app.bcrypt.check_password_hash(user.password, password):
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
336 login_user(user, remember=bool(remember))
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
337 result = {'username': username, 'logged_in': 1}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
338 return make_auth_response(result)
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
339 abort(401)
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
340
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
341
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
342 @app.route('/api/user/is_logged_in')
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
343 def api_user_is_logged_in():
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
344 if current_user.is_authenticated():
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
345 result = {'logged_in': True}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
346 return make_auth_response(result)
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
347 abort(401)
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
348
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
349
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
350 @app.route('/api/user/logout', methods=['POST'])
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
351 def api_user_logout():
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
352 logout_user()
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
353 result = {'ok': 1}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
354 return make_auth_response(result)
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
355
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
356
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
357 @app.route('/api/user/info/<name>')
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
358 def api_user_info(name):
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
359 user = g.wiki.auth.getUser(name)
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
360 if user is not None:
47
86ee1b696070 Big refactoring:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
361 result = {'username': user.username, 'groups': user.groups}
13
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
362 return make_auth_response(result)
30ae685b86df Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
363 abort(404)