# HG changeset patch # User Ludovic Chabant # Date 1482033310 28800 # Node ID 22c6f6a3d0a0f42d5dbc32e418641fabfbcc9c67 # Parent 8f2d32f9009509b1a1fb254e10a525052e1e8971 admin: Add ability to upload page assets. diff -r 8f2d32f90095 -r 22c6f6a3d0a0 piecrust/admin/templates/edit_page.html --- a/piecrust/admin/templates/edit_page.html Sat Dec 17 19:54:52 2016 -0800 +++ b/piecrust/admin/templates/edit_page.html Sat Dec 17 19:55:10 2016 -0800 @@ -16,7 +16,7 @@
- + Preview Cancel
@@ -57,5 +57,43 @@
+ +
+
+

Assets

+

Here are the assets you can use on this page with the {%raw%}{{assets.foo}}{%endraw%} syntax.

+ {% if assets %} +
    + {% for a in assets %} +
  • {{a.name}}
  • + {% endfor %} +
+ {% else %} +

...no assets...

+ {% endif %} +
+
+ +
+
+
+

Upload a new asset:

+
+
+ +
+
+
+
+ Name + +
+
+
+ +
+
+
+
{% endblock %} diff -r 8f2d32f90095 -r 22c6f6a3d0a0 piecrust/admin/views/edit.py --- a/piecrust/admin/views/edit.py Sat Dec 17 19:54:52 2016 -0800 +++ b/piecrust/admin/views/edit.py Sat Dec 17 19:55:10 2016 -0800 @@ -1,8 +1,10 @@ import os.path import logging +from werkzeug.utils import secure_filename from flask import ( - g, request, abort, render_template, url_for, flash) + g, request, abort, render_template, url_for, redirect, flash) from flask.ext.login import login_required +from piecrust.data.assetor import Assetor from piecrust.rendering import ( PageRenderingContext, render_page) from piecrust.serving.util import get_requested_page @@ -30,8 +32,7 @@ if request.form['is_dos_nl'] == '0': page_text = page_text.replace('\r\n', '\n') - if 'do_preview' in request.form or 'do_save' in request.form or \ - 'do_save_and_commit' in request.form: + 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) @@ -46,31 +47,67 @@ if site.scm: site.scm.commit([page.path], message) - if 'do_preview' in request.form: - return _preview_page(page) - if 'do_save' in request.form or 'do_save_and_commit' in request.form: - return _edit_page_form(page) + return _edit_page_form(page, slug, site.name) abort(400) - return _edit_page_form(page) + return _edit_page_form(page, slug, site.name) -def _preview_page(page): - render_ctx = PageRenderingContext(page, force_render=True) - rp = render_page(render_ctx) - return rp.content +@foodtruck_bp.route('/upload/', methods=['POST']) +def upload_page_asset(slug): + if 'ft-asset-file' not in request.files: + 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', slug=slug)) + + site = g.site + 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) + + filename = asset_file.filename + if request.form['ft-asset-name']: + _, ext = os.path.splitext(filename) + filename = request.form['ft-asset-name'] + ext + filename = secure_filename(filename) + dirname, _ = os.path.splitext(page.path) + dirname += '-assets' + if not os.path.exists(dirname): + os.makedirs(dirname) + + 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', slug=slug)) -def _edit_page_form(page): +def _edit_page_form(page, slug, sitename): data = {} data['is_new_page'] = False - data['url_cancel'] = url_for('.list_source', source_name=page.source.name) + 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) diff -r 8f2d32f90095 -r 22c6f6a3d0a0 piecrust/data/assetor.py --- a/piecrust/data/assetor.py Sat Dec 17 19:54:52 2016 -0800 +++ b/piecrust/data/assetor.py Sat Dec 17 19:55:10 2016 -0800 @@ -57,9 +57,9 @@ self._cacheAssets() return map(lambda i: i[0], self._cache.values()) - def _getFilenames(self): - assert self._cache is not None - return map(lambda i: i[1], self._cache.values()) + def allNames(self): + self._cacheAssets() + return list(self._cache.keys()) def _debugRenderAssetNames(self): self._cacheAssets()