Mercurial > wikked
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 |
rev | line source |
---|---|
0 | 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 | 3 from flask import render_template, abort, request, g, jsonify |
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 | 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 | 10 from fs import PageNotFoundError |
11 import scm | |
12 | |
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 | 18 COERCE_META = { |
19 'redirect': Page.title_to_url | |
20 } | |
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 | 24 try: |
47 | 25 page = g.wiki.getPage(url) |
0 | 26 page._ensureMeta() |
27 return page | |
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 | 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 | 41 |
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 | 51 def get_page_meta(page, local_only=False): |
52 if local_only: | |
53 meta = dict(page.local_meta) | |
54 else: | |
55 meta = dict(page.all_meta) | |
56 meta['title'] = page.title | |
57 meta['url'] = page.url | |
58 for name in COERCE_META: | |
59 if name in meta: | |
60 meta[name] = COERCE_META(meta[name]) | |
61 return meta | |
62 | |
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 | 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 | 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 | 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 | 101 @app.route('/') |
102 def home(): | |
103 return render_template('index.html', cache_bust=('?%d' % time.time())) | |
104 | |
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 | 116 @app.route('/api/list') |
117 def api_list_all_pages(): | |
47 | 118 return api_list_pages(None) |
0 | 119 |
120 | |
121 @app.route('/api/list/<path:url>') | |
122 def api_list_pages(url): | |
47 | 123 pages = filter(is_page_readable, g.wiki.getPages(url)) |
124 page_metas = [get_page_meta(page) for page in pages] | |
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 | 127 |
128 | |
129 @app.route('/api/read/<path:url>') | |
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 | 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 | 134 |
135 | |
136 @app.route('/api/raw/<path:url>') | |
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 | 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 | 150 meta = dict(get_page_meta(page, True), rev=rev) |
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 | 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 | 170 meta = dict(get_page_meta(page, True), rev1=rev1, rev2=rev2) |
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 | 173 |
174 | |
175 @app.route('/api/state/<path:url>') | |
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 | 179 return make_auth_response({ |
180 'meta': get_page_meta(page, True), | |
181 'state': scm.STATE_NAMES[state] | |
19
884eb6c8edf0
Added "wiki history" special page:
Ludovic Chabant <ludovic@chabant.com>
parents:
17
diff
changeset
|
182 }) |
0 | 183 |
184 | |
185 @app.route('/api/outlinks/<path:url>') | |
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 | 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 | 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 | 201 |
202 | |
203 @app.route('/api/inlinks/<path:url>') | |
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 | 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 | 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 | 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 | 219 |
220 | |
221 @app.route('/api/edit/<path:url>', methods=['GET', 'PUT', 'POST']) | |
222 def api_edit_page(url): | |
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 | 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 | 237 result = { |
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 | 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 | 249 if not 'text' in request.form: |
250 abort(400) | |
251 text = request.form['text'] | |
252 author = request.remote_addr | |
253 if 'author' in request.form and len(request.form['author']) > 0: | |
254 author = request.form['author'] | |
255 message = 'Edited ' + url | |
256 if 'message' in request.form and len(request.form['message']) > 0: | |
257 message = request.form['message'] | |
258 | |
259 page_fields = { | |
260 'text': text, | |
261 'author': author, | |
262 'message': message | |
263 } | |
47 | 264 g.wiki.setPage(url, page_fields) |
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 | 267 |
268 | |
269 @app.route('/api/rename/<path:url>', methods=['POST']) | |
270 def api_rename_page(url): | |
271 pass | |
272 | |
273 | |
274 @app.route('/api/delete/<path:url>', methods=['POST']) | |
275 def api_delete_page(url): | |
276 pass | |
277 | |
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 | 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 | 284 orphans.append({'path': page.url, 'meta': get_page_meta(page, True)}) |
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 | 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 | 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 | 297 @app.route('/api/history/<path:url>') |
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 | 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 | 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 | 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 | 313 hits = filter(is_hit_readable, g.wiki.index.search(query)) |
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 | 322 g.wiki.index.reset(g.wiki.getPages()) |
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 | 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 | 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 | 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 | 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 | 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 | 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) |