Mercurial > piecrust2
comparison foodtruck/views/dashboard.py @ 772:3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
This makes it possible to use an app factory, which makes it easier to write
unit tests.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 03 Jul 2016 07:54:54 -0700 |
parents | a7726e4862c4 |
children |
comparison
equal
deleted
inserted
replaced
771:673979a5d548 | 772:3885421c29a3 |
---|---|
1 import os | 1 import os |
2 import os.path | 2 import os.path |
3 import logging | 3 import logging |
4 from flask import ( | 4 from flask import ( |
5 g, request, | 5 current_app, g, request, |
6 render_template, url_for, redirect) | 6 render_template, url_for, redirect) |
7 from flask.ext.login import login_user, logout_user, login_required | 7 from flask.ext.login import login_user, logout_user, login_required |
8 from piecrust.configuration import parse_config_header | 8 from piecrust.configuration import parse_config_header |
9 from piecrust.rendering import QualifiedPage | 9 from piecrust.rendering import QualifiedPage |
10 from piecrust.uriutil import split_uri | 10 from piecrust.uriutil import split_uri |
11 from ..textutil import text_preview | 11 from ..textutil import text_preview |
12 from ..blueprint import foodtruck_bp, load_user, after_this_request | |
12 from ..views import with_menu_context | 13 from ..views import with_menu_context |
13 from ..web import app, load_user, after_this_request | |
14 | 14 |
15 | 15 |
16 logger = logging.getLogger(__name__) | 16 logger = logging.getLogger(__name__) |
17 | 17 |
18 | 18 |
19 @app.route('/') | 19 @foodtruck_bp.route('/') |
20 @login_required | 20 @login_required |
21 def index(): | 21 def index(): |
22 data = {} | 22 data = {} |
23 data['sources'] = [] | 23 data['sources'] = [] |
24 site = g.site | 24 site = g.site |
27 if source.is_theme_source: | 27 if source.is_theme_source: |
28 continue | 28 continue |
29 facs = source.getPageFactories() | 29 facs = source.getPageFactories() |
30 src_data = { | 30 src_data = { |
31 'name': source.name, | 31 'name': source.name, |
32 'list_url': url_for('list_source', source_name=source.name), | 32 'list_url': url_for('.list_source', source_name=source.name), |
33 'page_count': len(facs)} | 33 'page_count': len(facs)} |
34 data['sources'].append(src_data) | 34 data['sources'].append(src_data) |
35 | 35 |
36 fe = getattr(source, 'fs_endpoint', None) | 36 fe = getattr(source, 'fs_endpoint', None) |
37 if fe: | 37 if fe: |
55 else: | 55 else: |
56 data['misc_files'].append(p) | 56 data['misc_files'].append(p) |
57 | 57 |
58 data['site_name'] = site.name | 58 data['site_name'] = site.name |
59 data['site_title'] = site.piecrust_app.config.get('site/title', site.name) | 59 data['site_title'] = site.piecrust_app.config.get('site/title', site.name) |
60 data['url_publish'] = url_for('publish') | 60 data['url_publish'] = url_for('.publish') |
61 data['url_preview'] = url_for('preview_site_root', sitename=site.name) | 61 data['url_preview'] = url_for('.preview_site_root', sitename=site.name) |
62 | 62 |
63 data['sites'] = [] | 63 data['sites'] = [] |
64 for s in g.sites.getall(): | 64 for s in g.sites.getall(): |
65 data['sites'].append({ | 65 data['sites'].append({ |
66 'name': s.name, | 66 'name': s.name, |
67 'display_name': s.piecrust_app.config.get('site/title'), | 67 'display_name': s.piecrust_app.config.get('site/title'), |
68 'url': url_for('index', site_name=s.name) | 68 'url': url_for('.index', site_name=s.name) |
69 }) | 69 }) |
70 data['needs_switch'] = len(g.config.get('sites')) > 1 | 70 data['needs_switch'] = len(g.config.get('sites')) > 1 |
71 data['url_switch'] = url_for('switch_site') | 71 data['url_switch'] = url_for('.switch_site') |
72 | 72 |
73 with_menu_context(data) | 73 with_menu_context(data) |
74 return render_template('dashboard.html', **data) | 74 return render_template('dashboard.html', **data) |
75 | 75 |
76 | 76 |
103 header, offset = parse_config_header(raw_text) | 103 header, offset = parse_config_header(raw_text) |
104 extract = text_preview(raw_text, offset=offset) | 104 extract = text_preview(raw_text, offset=offset) |
105 return { | 105 return { |
106 'title': qp.config.get('title'), | 106 'title': qp.config.get('title'), |
107 'slug': slug, | 107 'slug': slug, |
108 'url': url_for('edit_page', slug=slug), | 108 'url': url_for('.edit_page', slug=slug), |
109 'text': extract | 109 'text': extract |
110 } | 110 } |
111 | 111 |
112 | 112 |
113 @login_required | 113 @login_required |
114 @app.route('/switch_site', methods=['POST']) | 114 @foodtruck_bp.route('/switch_site', methods=['POST']) |
115 def switch_site(): | 115 def switch_site(): |
116 site_name = request.form.get('site_name') | 116 site_name = request.form.get('site_name') |
117 if not site_name: | 117 if not site_name: |
118 return redirect(url_for('index')) | 118 return redirect(url_for('.index')) |
119 | 119 |
120 @after_this_request | 120 @after_this_request |
121 def _save_site(resp): | 121 def _save_site(resp): |
122 resp.set_cookie('foodtruck_site_name', site_name) | 122 resp.set_cookie('foodtruck_site_name', site_name) |
123 | 123 |
124 return redirect(url_for('index')) | 124 return redirect(url_for('.index')) |
125 | 125 |
126 | 126 |
127 @app.route('/login', methods=['GET', 'POST']) | 127 @foodtruck_bp.route('/login', methods=['GET', 'POST']) |
128 def login(): | 128 def login(): |
129 data = {} | 129 data = {} |
130 | 130 |
131 if request.method == 'POST': | 131 if request.method == 'POST': |
132 username = request.form.get('username') | 132 username = request.form.get('username') |
133 password = request.form.get('password') | 133 password = request.form.get('password') |
134 remember = request.form.get('remember') | 134 remember = request.form.get('remember') |
135 | 135 |
136 user = load_user(username) | 136 user = load_user(username) |
137 if user is not None and app.bcrypt: | 137 if user is not None and current_app.bcrypt: |
138 if app.bcrypt.check_password_hash(user.password, password): | 138 if current_app.bcrypt.check_password_hash(user.password, password): |
139 login_user(user, remember=bool(remember)) | 139 login_user(user, remember=bool(remember)) |
140 return redirect(url_for('index')) | 140 return redirect(url_for('.index')) |
141 data['message'] = ( | 141 data['message'] = ( |
142 "User '%s' doesn't exist or password is incorrect." % | 142 "User '%s' doesn't exist or password is incorrect." % |
143 username) | 143 username) |
144 | 144 |
145 return render_template('login.html', **data) | 145 return render_template('login.html', **data) |
146 | 146 |
147 | 147 |
148 @app.route('/logout') | 148 @foodtruck_bp.route('/logout') |
149 @login_required | 149 @login_required |
150 def logout(): | 150 def logout(): |
151 logout_user() | 151 logout_user() |
152 return redirect(url_for('index')) | 152 return redirect(url_for('.index')) |
153 | 153 |