Mercurial > piecrust2
comparison piecrust/admin/views/dashboard.py @ 778:5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 16 Jul 2016 15:02:24 +0200 |
parents | foodtruck/views/dashboard.py@3885421c29a3 |
children | 82509bce94ca |
comparison
equal
deleted
inserted
replaced
777:8d633ca59bc5 | 778:5e91bc0e3b4d |
---|---|
1 import os | |
2 import os.path | |
3 import logging | |
4 from flask import ( | |
5 current_app, g, request, | |
6 render_template, url_for, redirect) | |
7 from flask.ext.login import login_user, logout_user, login_required | |
8 from piecrust.configuration import parse_config_header | |
9 from piecrust.rendering import QualifiedPage | |
10 from piecrust.uriutil import split_uri | |
11 from ..textutil import text_preview | |
12 from ..blueprint import foodtruck_bp, load_user, after_this_request | |
13 from ..views import with_menu_context | |
14 | |
15 | |
16 logger = logging.getLogger(__name__) | |
17 | |
18 | |
19 @foodtruck_bp.route('/') | |
20 @login_required | |
21 def index(): | |
22 data = {} | |
23 data['sources'] = [] | |
24 site = g.site | |
25 fs_endpoints = {} | |
26 for source in site.piecrust_app.sources: | |
27 if source.is_theme_source: | |
28 continue | |
29 facs = source.getPageFactories() | |
30 src_data = { | |
31 'name': source.name, | |
32 'list_url': url_for('.list_source', source_name=source.name), | |
33 'page_count': len(facs)} | |
34 data['sources'].append(src_data) | |
35 | |
36 fe = getattr(source, 'fs_endpoint', None) | |
37 if fe: | |
38 fs_endpoints[fe] = source | |
39 | |
40 data['new_pages'] = [] | |
41 data['edited_pages'] = [] | |
42 data['misc_files'] = [] | |
43 if site.scm: | |
44 st = site.scm.getStatus() | |
45 for p in st.new_files: | |
46 pd = _getWipData(p, site, fs_endpoints) | |
47 if pd: | |
48 data['new_pages'].append(pd) | |
49 else: | |
50 data['misc_files'].append(p) | |
51 for p in st.edited_files: | |
52 pd = _getWipData(p, site, fs_endpoints) | |
53 if pd: | |
54 data['edited_pages'].append(pd) | |
55 else: | |
56 data['misc_files'].append(p) | |
57 | |
58 data['site_name'] = site.name | |
59 data['site_title'] = site.piecrust_app.config.get('site/title', site.name) | |
60 data['url_publish'] = url_for('.publish') | |
61 data['url_preview'] = url_for('.preview_site_root', sitename=site.name) | |
62 | |
63 data['sites'] = [] | |
64 for s in g.sites.getall(): | |
65 data['sites'].append({ | |
66 'name': s.name, | |
67 'display_name': s.piecrust_app.config.get('site/title'), | |
68 'url': url_for('.index', site_name=s.name) | |
69 }) | |
70 data['needs_switch'] = len(g.config.get('sites')) > 1 | |
71 data['url_switch'] = url_for('.switch_site') | |
72 | |
73 with_menu_context(data) | |
74 return render_template('dashboard.html', **data) | |
75 | |
76 | |
77 def _getWipData(path, site, fs_endpoints): | |
78 auto_formats = site.piecrust_app.config.get('site/auto_formats', ['html']) | |
79 pathname, pathext = os.path.splitext(path) | |
80 if pathext not in auto_formats: | |
81 return None | |
82 | |
83 source = None | |
84 for endpoint, s in fs_endpoints.items(): | |
85 if path.startswith(endpoint): | |
86 source = s | |
87 break | |
88 if source is None: | |
89 return None | |
90 | |
91 fac = source.buildPageFactory(os.path.join(site.root_dir, path)) | |
92 route = site.piecrust_app.getSourceRoute(source.name, fac.metadata) | |
93 if not route: | |
94 return None | |
95 | |
96 qp = QualifiedPage(fac.buildPage(), route, fac.metadata) | |
97 uri = qp.getUri() | |
98 _, slug = split_uri(site.piecrust_app, uri) | |
99 | |
100 with open(fac.path, 'r', encoding='utf8') as fp: | |
101 raw_text = fp.read() | |
102 | |
103 header, offset = parse_config_header(raw_text) | |
104 extract = text_preview(raw_text, offset=offset) | |
105 return { | |
106 'title': qp.config.get('title'), | |
107 'slug': slug, | |
108 'url': url_for('.edit_page', slug=slug), | |
109 'text': extract | |
110 } | |
111 | |
112 | |
113 @login_required | |
114 @foodtruck_bp.route('/switch_site', methods=['POST']) | |
115 def switch_site(): | |
116 site_name = request.form.get('site_name') | |
117 if not site_name: | |
118 return redirect(url_for('.index')) | |
119 | |
120 @after_this_request | |
121 def _save_site(resp): | |
122 resp.set_cookie('foodtruck_site_name', site_name) | |
123 | |
124 return redirect(url_for('.index')) | |
125 | |
126 | |
127 @foodtruck_bp.route('/login', methods=['GET', 'POST']) | |
128 def login(): | |
129 data = {} | |
130 | |
131 if request.method == 'POST': | |
132 username = request.form.get('username') | |
133 password = request.form.get('password') | |
134 remember = request.form.get('remember') | |
135 | |
136 user = load_user(username) | |
137 if user is not None and current_app.bcrypt: | |
138 if current_app.bcrypt.check_password_hash(user.password, password): | |
139 login_user(user, remember=bool(remember)) | |
140 return redirect(url_for('.index')) | |
141 data['message'] = ( | |
142 "User '%s' doesn't exist or password is incorrect." % | |
143 username) | |
144 | |
145 return render_template('login.html', **data) | |
146 | |
147 | |
148 @foodtruck_bp.route('/logout') | |
149 @login_required | |
150 def logout(): | |
151 logout_user() | |
152 return redirect(url_for('.index')) | |
153 |