Mercurial > piecrust2
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/piecrust/admin/views/dashboard.py Sat Jul 16 15:02:24 2016 +0200 @@ -0,0 +1,153 @@ +import os +import os.path +import logging +from flask import ( + current_app, g, request, + render_template, url_for, redirect) +from flask.ext.login import login_user, logout_user, login_required +from piecrust.configuration import parse_config_header +from piecrust.rendering import QualifiedPage +from piecrust.uriutil import split_uri +from ..textutil import text_preview +from ..blueprint import foodtruck_bp, load_user, after_this_request +from ..views import with_menu_context + + +logger = logging.getLogger(__name__) + + +@foodtruck_bp.route('/') +@login_required +def index(): + data = {} + data['sources'] = [] + site = g.site + fs_endpoints = {} + for source in site.piecrust_app.sources: + if source.is_theme_source: + continue + facs = source.getPageFactories() + src_data = { + 'name': source.name, + 'list_url': url_for('.list_source', source_name=source.name), + 'page_count': len(facs)} + data['sources'].append(src_data) + + fe = getattr(source, 'fs_endpoint', None) + if fe: + fs_endpoints[fe] = source + + data['new_pages'] = [] + data['edited_pages'] = [] + data['misc_files'] = [] + if site.scm: + st = site.scm.getStatus() + for p in st.new_files: + pd = _getWipData(p, site, fs_endpoints) + if pd: + data['new_pages'].append(pd) + else: + data['misc_files'].append(p) + for p in st.edited_files: + pd = _getWipData(p, site, fs_endpoints) + if pd: + data['edited_pages'].append(pd) + else: + data['misc_files'].append(p) + + data['site_name'] = site.name + data['site_title'] = site.piecrust_app.config.get('site/title', site.name) + data['url_publish'] = url_for('.publish') + data['url_preview'] = url_for('.preview_site_root', sitename=site.name) + + data['sites'] = [] + for s in g.sites.getall(): + data['sites'].append({ + 'name': s.name, + 'display_name': s.piecrust_app.config.get('site/title'), + 'url': url_for('.index', site_name=s.name) + }) + data['needs_switch'] = len(g.config.get('sites')) > 1 + data['url_switch'] = url_for('.switch_site') + + with_menu_context(data) + return render_template('dashboard.html', **data) + + +def _getWipData(path, site, fs_endpoints): + auto_formats = site.piecrust_app.config.get('site/auto_formats', ['html']) + pathname, pathext = os.path.splitext(path) + if pathext not in auto_formats: + return None + + source = None + for endpoint, s in fs_endpoints.items(): + if path.startswith(endpoint): + source = s + break + if source is None: + return None + + fac = source.buildPageFactory(os.path.join(site.root_dir, path)) + route = site.piecrust_app.getSourceRoute(source.name, fac.metadata) + if not route: + return None + + qp = QualifiedPage(fac.buildPage(), route, fac.metadata) + uri = qp.getUri() + _, slug = split_uri(site.piecrust_app, uri) + + with open(fac.path, 'r', encoding='utf8') as fp: + raw_text = fp.read() + + header, offset = parse_config_header(raw_text) + extract = text_preview(raw_text, offset=offset) + return { + 'title': qp.config.get('title'), + 'slug': slug, + 'url': url_for('.edit_page', slug=slug), + 'text': extract + } + + +@login_required +@foodtruck_bp.route('/switch_site', methods=['POST']) +def switch_site(): + site_name = request.form.get('site_name') + if not site_name: + return redirect(url_for('.index')) + + @after_this_request + def _save_site(resp): + resp.set_cookie('foodtruck_site_name', site_name) + + return redirect(url_for('.index')) + + +@foodtruck_bp.route('/login', methods=['GET', 'POST']) +def login(): + data = {} + + if request.method == 'POST': + username = request.form.get('username') + password = request.form.get('password') + remember = request.form.get('remember') + + user = load_user(username) + if user is not None and current_app.bcrypt: + if current_app.bcrypt.check_password_hash(user.password, password): + login_user(user, remember=bool(remember)) + return redirect(url_for('.index')) + data['message'] = ( + "User '%s' doesn't exist or password is incorrect." % + username) + + return render_template('login.html', **data) + + +@foodtruck_bp.route('/logout') +@login_required +def logout(): + logout_user() + return redirect(url_for('.index')) +