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 = {}