Mercurial > piecrust2
diff piecrust/admin/views/edit.py @ 935:7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
- Use new source APIs in the dashboard to open WIP files.
- Fixed broken/outdated code in some views.
- Fixed cases when Flask is not running at the root URL by using the
`SCRIPT_NAME` variable somewhat more properly.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Wed, 04 Oct 2017 09:15:16 -0700 |
parents | 41db689d36b6 |
children | c50ff76e0596 |
line wrap: on
line diff
--- a/piecrust/admin/views/edit.py Wed Oct 04 09:11:58 2017 -0700 +++ b/piecrust/admin/views/edit.py Wed Oct 04 09:15:16 2017 -0700 @@ -13,85 +13,63 @@ logger = logging.getLogger(__name__) -@foodtruck_bp.route('/edit/', defaults={'uri': ''}, methods=['GET', 'POST']) -@foodtruck_bp.route('/edit/<path:uri>', methods=['GET', 'POST']) +@foodtruck_bp.route('/edit/', defaults={'slug': ''}, methods=['GET', 'POST']) +@foodtruck_bp.route('/edit/<path:slug>', methods=['GET', 'POST']) @login_required -def edit_page(uri): +def edit_page(slug): site = g.site - pcapp = site.piecrust_app - rp = get_requested_page(pcapp, '%s/preview/%s' % (site.url_prefix, uri)) - page = rp.page + site_app = site.piecrust_app + rp = get_requested_page(site_app, + '/site/%s/%s' % (g.sites.current_site, slug)) + page = rp.qualified_page if page is None: abort(404) if request.method == 'POST': - return _submit_page_form(page, uri) + page_text = request.form['page_text'] + if request.form['is_dos_nl'] == '0': + page_text = page_text.replace('\r\n', '\n') + + if 'do_save' in request.form or 'do_save_and_commit' in request.form: + logger.debug("Writing page: %s" % page.path) + with open(page.path, 'w', encoding='utf8', newline='') as fp: + fp.write(page_text) + flash("%s was saved." % os.path.relpath( + page.path, site_app.root_dir)) - return _edit_page_form(page, uri) + if 'do_save_and_commit' in request.form: + message = request.form.get('commit_msg') + if not message: + message = "Edit %s" % os.path.relpath( + page.path, site_app.root_dir) + if site.scm: + commit_paths = [page.path] + assets_dir = os.path.splitext(page.path)[0] + '-assets' + if os.path.isdir(assets_dir): + commit_paths += list(os.listdir(assets_dir)) + site.scm.commit(commit_paths, message) + + if 'do_save' in request.form or 'do_save_and_commit' in request.form: + return _edit_page_form(page, slug, site.name) + + abort(400) + + return _edit_page_form(page, slug, site.name) -def _edit_page_form(page, uri): - data = {} - data['is_new_page'] = False - data['url_postback'] = url_for('.edit_page', uri=uri) - data['url_upload_asset'] = url_for('.upload_page_asset', uri=uri) - data['url_preview'] = page.getUri() - data['url_cancel'] = url_for( - '.list_source', source_name=page.source.name) - - with page.source.openItem(page.content_item, 'r') as fp: - data['page_text'] = fp.read() - data['is_dos_nl'] = "1" if '\r\n' in data['page_text'] else "0" - - assetor = Assetor(page) - assets_data = [] - for n in assetor._getAssetNames(): - assets_data.append({'name': n, 'url': assetor[n]}) - data['assets'] = assets_data - - data['has_scm'] = (g.site.scm is not None) - - with_menu_context(data) - return render_template('edit_page.html', **data) - - -def _submit_page_form(page, uri): - page_text = request.form['page_text'] - if request.form['is_dos_nl'] == '0': - page_text = page_text.replace('\r\n', '\n') - - if 'do_save' in request.form or 'do_save_and_commit' in request.form: - logger.debug("Writing page: %s" % page.content_spec) - with page.source.openItem(page.content_item, 'w') as fp: - fp.write(page_text) - flash("%s was saved." % page.content_spec) - - scm = g.site.scm - if 'do_save_and_commit' in request.form and scm is not None: - message = request.form.get('commit_msg') - if not message: - message = "Edit %s" % page.content_spec - scm.commit([page.content_spec], message) - - if 'do_save' in request.form or 'do_save_and_commit' in request.form: - return _edit_page_form(page, uri) - - abort(400) - - -@foodtruck_bp.route('/upload/<path:uri>', methods=['POST']) -def upload_page_asset(uri): +@foodtruck_bp.route('/upload/<path:slug>', methods=['POST']) +def upload_page_asset(slug): if 'ft-asset-file' not in request.files: - return redirect(url_for('.edit_page', uri=uri)) + return redirect(url_for('.edit_page', slug=slug)) asset_file = request.files['ft-asset-file'] if asset_file.filename == '': - return redirect(url_for('.edit_page', uri=uri)) + return redirect(url_for('.edit_page', slug=slug)) site = g.site - pcapp = site.piecrust_app - rp = get_requested_page(pcapp, - '/site/%s/%s' % (g.sites.current_site, uri)) + site_app = site.piecrust_app + rp = get_requested_page(site_app, + '/site/%s/%s' % (g.sites.current_site, slug)) page = rp.qualified_page if page is None: abort(404) @@ -109,4 +87,29 @@ asset_path = os.path.join(dirname, filename) logger.info("Uploading file to: %s" % asset_path) asset_file.save(asset_path) - return redirect(url_for('.edit_page', uri=uri)) + return redirect(url_for('.edit_page', slug=slug)) + + +def _edit_page_form(page, slug, sitename): + data = {} + data['is_new_page'] = False + data['url_postback'] = url_for('.edit_page', slug=slug) + data['url_upload_asset'] = url_for('.upload_page_asset', slug=slug) + data['url_preview'] = page.getUri() + data['url_cancel'] = url_for( + '.list_source', source_name=page.source.name) + with open(page.path, 'r', encoding='utf8', newline='') as fp: + data['page_text'] = fp.read() + data['is_dos_nl'] = "1" if '\r\n' in data['page_text'] else "0" + + page.app.env.base_asset_url_format = \ + page.app.config.get('site/root') + '_asset/%path%' + assetor = Assetor(page, 'blah') + assets_data = [] + for n in assetor.allNames(): + assets_data.append({'name': n, 'url': assetor[n]}) + data['assets'] = assets_data + + with_menu_context(data) + return render_template('edit_page.html', **data) +