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