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