Mercurial > piecrust2
comparison piecrust/admin/views/dashboard.py @ 927:175d80cf75d7
serve: Admin dashboard improvements.
- Remove total source counts to make it faster to display.
- Fix WIP display.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 01 Oct 2017 20:38:19 -0700 |
parents | dcdec4b951a1 |
children | 7ecb946bfafd |
comparison
equal
deleted
inserted
replaced
926:86b684cc0551 | 927:175d80cf75d7 |
---|---|
3 import logging | 3 import logging |
4 from flask import ( | 4 from flask import ( |
5 current_app, 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.sources.fs import FSContentSourceBase |
9 from piecrust.sources.interfaces import IInteractiveSource | 9 from piecrust.sources.interfaces import IInteractiveSource |
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 ..blueprint import foodtruck_bp, load_user |
13 from ..views import with_menu_context | 13 from ..views import with_menu_context |
14 | 14 |
15 | 15 |
16 logger = logging.getLogger(__name__) | 16 logger = logging.getLogger(__name__) |
17 | 17 |
30 if source.is_theme_source: | 30 if source.is_theme_source: |
31 continue | 31 continue |
32 if not isinstance(source, IInteractiveSource): | 32 if not isinstance(source, IInteractiveSource): |
33 continue | 33 continue |
34 | 34 |
35 items = source.getAllContents() | |
36 src_data = { | 35 src_data = { |
37 'name': source.name, | 36 'name': source.name, |
38 'list_url': url_for('.list_source', source_name=source.name), | 37 'list_url': url_for('.list_source', source_name=source.name)} |
39 'page_count': len(items)} | |
40 data['sources'].append(src_data) | 38 data['sources'].append(src_data) |
41 | 39 |
42 fe = getattr(source, 'fs_endpoint', None) | 40 if isinstance(source, FSContentSourceBase): |
43 if fe: | 41 fs_endpoints[source.fs_endpoint] = source |
44 fs_endpoints[fe] = source | |
45 | 42 |
46 data['new_pages'] = [] | 43 data['new_pages'] = [] |
47 data['edited_pages'] = [] | 44 data['edited_pages'] = [] |
48 data['misc_files'] = [] | 45 data['misc_files'] = [] |
49 if site.scm: | 46 if site.scm: |
50 st = site.scm.getStatus() | 47 st = site.scm.getStatus() |
48 auto_formats = site.piecrust_app.config.get('site/auto_formats', | |
49 ['html']) | |
51 for p in st.new_files: | 50 for p in st.new_files: |
52 pd = _getWipData(p, site, fs_endpoints) | 51 pd = _getWipData(p, fs_endpoints, auto_formats, site.piecrust_app) |
53 if pd: | 52 if pd: |
54 data['new_pages'].append(pd) | 53 data['new_pages'].append(pd) |
55 else: | 54 else: |
56 data['misc_files'].append(p) | 55 data['misc_files'].append(p) |
57 for p in st.edited_files: | 56 for p in st.edited_files: |
58 pd = _getWipData(p, site, fs_endpoints) | 57 pd = _getWipData(p, fs_endpoints, auto_formats, site.piecrust_app) |
59 if pd: | 58 if pd: |
60 data['edited_pages'].append(pd) | 59 data['edited_pages'].append(pd) |
61 else: | 60 else: |
62 data['misc_files'].append(p) | 61 data['misc_files'].append(p) |
63 | 62 |
64 data['site_title'] = pcapp.config.get('site/title', "Unnamed Website") | 63 data['site_title'] = pcapp.config.get('site/title', "Unnamed Website") |
65 data['url_publish'] = url_for('.publish') | 64 data['url_publish'] = url_for('.publish') |
66 data['url_preview'] = url_for('.preview_root_page') | 65 data['url_preview'] = url_for('.preview_root_page') |
67 | 66 |
67 pub_tgts = pcapp.config.get('publish', {}) | |
68 data['publish'] = {'targets': list(pub_tgts.keys())} | |
69 | |
70 micropub = pcapp.config.get('micropub', {}) | |
71 data['publish'] = micropub.get('publish_target') | |
72 | |
68 with_menu_context(data) | 73 with_menu_context(data) |
69 return render_template('dashboard.html', **data) | 74 return render_template('dashboard.html', **data) |
70 | 75 |
71 | 76 |
72 def _getWipData(path, site, fs_endpoints): | 77 def _getWipData(path, fs_endpoints, auto_formats, pcapp): |
73 auto_formats = site.piecrust_app.config.get('site/auto_formats', ['html']) | |
74 pathname, pathext = os.path.splitext(path) | 78 pathname, pathext = os.path.splitext(path) |
75 if pathext not in auto_formats: | 79 if pathext.lstrip('.') not in auto_formats: |
76 return None | 80 return None |
77 | 81 |
78 source = None | 82 source = None |
79 for endpoint, s in fs_endpoints.items(): | 83 for endpoint, s in fs_endpoints.items(): |
80 if path.startswith(endpoint): | 84 if path.startswith(endpoint): |
81 source = s | 85 source = s |
82 break | 86 break |
83 if source is None: | 87 if source is None: |
84 return None | 88 return None |
85 | 89 |
86 fac = source.buildPageFactory(os.path.join(site.root_dir, path)) | 90 content_item = source.findContentFromPath(path) |
87 route = site.piecrust_app.getSourceRoute(source.name, fac.metadata) | 91 if content_item is None: |
88 if not route: | |
89 return None | 92 return None |
90 | 93 |
91 qp = QualifiedPage(fac.buildPage(), route, fac.metadata) | 94 page = pcapp.getPage(source, content_item) |
92 uri = qp.getUri() | 95 uri = page.getUri() |
93 _, slug = split_uri(site.piecrust_app, uri) | 96 _, slug = split_uri(pcapp, uri) |
94 | 97 |
95 with open(fac.path, 'r', encoding='utf8') as fp: | 98 seg = page.getSegment() |
96 raw_text = fp.read() | 99 if not seg: |
100 return None | |
97 | 101 |
98 header, offset = parse_config_header(raw_text) | 102 extract = text_preview(seg.content) |
99 extract = text_preview(raw_text, offset=offset) | |
100 return { | 103 return { |
101 'title': qp.config.get('title'), | 104 'title': page.config.get('title'), |
102 'slug': slug, | 105 'slug': slug, |
103 'url': url_for('.edit_page', slug=slug), | 106 'url': url_for('.edit_page', uri=slug), |
104 'text': extract | 107 'text': extract |
105 } | 108 } |
106 | |
107 | |
108 @login_required | |
109 @foodtruck_bp.route('/switch_site', methods=['POST']) | |
110 def switch_site(): | |
111 site_name = request.form.get('site_name') | |
112 if not site_name: | |
113 return redirect(url_for('.index')) | |
114 | |
115 @after_this_request | |
116 def _save_site(resp): | |
117 resp.set_cookie('foodtruck_site_name', site_name) | |
118 | |
119 return redirect(url_for('.index')) | |
120 | 109 |
121 | 110 |
122 @foodtruck_bp.route('/login', methods=['GET', 'POST']) | 111 @foodtruck_bp.route('/login', methods=['GET', 'POST']) |
123 def login(): | 112 def login(): |
124 data = {} | 113 data = {} |