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)
+