Mercurial > piecrust2
comparison piecrust/admin/views/edit.py @ 809:22c6f6a3d0a0
admin: Add ability to upload page assets.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 17 Dec 2016 19:55:10 -0800 |
parents | 5e91bc0e3b4d |
children | 82509bce94ca |
comparison
equal
deleted
inserted
replaced
808:8f2d32f90095 | 809:22c6f6a3d0a0 |
---|---|
1 import os.path | 1 import os.path |
2 import logging | 2 import logging |
3 from werkzeug.utils import secure_filename | |
3 from flask import ( | 4 from flask import ( |
4 g, request, abort, render_template, url_for, flash) | 5 g, request, abort, render_template, url_for, redirect, flash) |
5 from flask.ext.login import login_required | 6 from flask.ext.login import login_required |
7 from piecrust.data.assetor import Assetor | |
6 from piecrust.rendering import ( | 8 from piecrust.rendering import ( |
7 PageRenderingContext, render_page) | 9 PageRenderingContext, render_page) |
8 from piecrust.serving.util import get_requested_page | 10 from piecrust.serving.util import get_requested_page |
9 from ..blueprint import foodtruck_bp | 11 from ..blueprint import foodtruck_bp |
10 from ..views import with_menu_context | 12 from ..views import with_menu_context |
28 if request.method == 'POST': | 30 if request.method == 'POST': |
29 page_text = request.form['page_text'] | 31 page_text = request.form['page_text'] |
30 if request.form['is_dos_nl'] == '0': | 32 if request.form['is_dos_nl'] == '0': |
31 page_text = page_text.replace('\r\n', '\n') | 33 page_text = page_text.replace('\r\n', '\n') |
32 | 34 |
33 if 'do_preview' in request.form or 'do_save' in request.form or \ | 35 if 'do_save' in request.form or 'do_save_and_commit' in request.form: |
34 'do_save_and_commit' in request.form: | |
35 logger.debug("Writing page: %s" % page.path) | 36 logger.debug("Writing page: %s" % page.path) |
36 with open(page.path, 'w', encoding='utf8', newline='') as fp: | 37 with open(page.path, 'w', encoding='utf8', newline='') as fp: |
37 fp.write(page_text) | 38 fp.write(page_text) |
38 flash("%s was saved." % os.path.relpath( | 39 flash("%s was saved." % os.path.relpath( |
39 page.path, site_app.root_dir)) | 40 page.path, site_app.root_dir)) |
44 message = "Edit %s" % os.path.relpath( | 45 message = "Edit %s" % os.path.relpath( |
45 page.path, site_app.root_dir) | 46 page.path, site_app.root_dir) |
46 if site.scm: | 47 if site.scm: |
47 site.scm.commit([page.path], message) | 48 site.scm.commit([page.path], message) |
48 | 49 |
49 if 'do_preview' in request.form: | |
50 return _preview_page(page) | |
51 | |
52 if 'do_save' in request.form or 'do_save_and_commit' in request.form: | 50 if 'do_save' in request.form or 'do_save_and_commit' in request.form: |
53 return _edit_page_form(page) | 51 return _edit_page_form(page, slug, site.name) |
54 | 52 |
55 abort(400) | 53 abort(400) |
56 | 54 |
57 return _edit_page_form(page) | 55 return _edit_page_form(page, slug, site.name) |
58 | 56 |
59 | 57 |
60 def _preview_page(page): | 58 @foodtruck_bp.route('/upload/<path:slug>', methods=['POST']) |
61 render_ctx = PageRenderingContext(page, force_render=True) | 59 def upload_page_asset(slug): |
62 rp = render_page(render_ctx) | 60 if 'ft-asset-file' not in request.files: |
63 return rp.content | 61 return redirect(url_for('.edit_page', slug=slug)) |
62 | |
63 asset_file = request.files['ft-asset-file'] | |
64 if asset_file.filename == '': | |
65 return redirect(url_for('.edit_page', slug=slug)) | |
66 | |
67 site = g.site | |
68 site_app = site.piecrust_app | |
69 rp = get_requested_page(site_app, | |
70 '/site/%s/%s' % (g.sites.current_site, slug)) | |
71 page = rp.qualified_page | |
72 if page is None: | |
73 abort(404) | |
74 | |
75 filename = asset_file.filename | |
76 if request.form['ft-asset-name']: | |
77 _, ext = os.path.splitext(filename) | |
78 filename = request.form['ft-asset-name'] + ext | |
79 filename = secure_filename(filename) | |
80 dirname, _ = os.path.splitext(page.path) | |
81 dirname += '-assets' | |
82 if not os.path.exists(dirname): | |
83 os.makedirs(dirname) | |
84 | |
85 asset_path = os.path.join(dirname, filename) | |
86 logger.info("Uploading file to: %s" % asset_path) | |
87 asset_file.save(asset_path) | |
88 return redirect(url_for('.edit_page', slug=slug)) | |
64 | 89 |
65 | 90 |
66 def _edit_page_form(page): | 91 def _edit_page_form(page, slug, sitename): |
67 data = {} | 92 data = {} |
68 data['is_new_page'] = False | 93 data['is_new_page'] = False |
69 data['url_cancel'] = url_for('.list_source', source_name=page.source.name) | 94 data['url_postback'] = url_for('.edit_page', slug=slug) |
95 data['url_upload_asset'] = url_for('.upload_page_asset', slug=slug) | |
96 data['url_preview'] = page.getUri() | |
97 data['url_cancel'] = url_for( | |
98 '.list_source', source_name=page.source.name) | |
70 with open(page.path, 'r', encoding='utf8', newline='') as fp: | 99 with open(page.path, 'r', encoding='utf8', newline='') as fp: |
71 data['page_text'] = fp.read() | 100 data['page_text'] = fp.read() |
72 data['is_dos_nl'] = "1" if '\r\n' in data['page_text'] else "0" | 101 data['is_dos_nl'] = "1" if '\r\n' in data['page_text'] else "0" |
73 | 102 |
103 page.app.env.base_asset_url_format = \ | |
104 page.app.config.get('site/root') + '_asset/%path%' | |
105 assetor = Assetor(page, 'blah') | |
106 assets_data = [] | |
107 for n in assetor.allNames(): | |
108 assets_data.append({'name': n, 'url': assetor[n]}) | |
109 data['assets'] = assets_data | |
110 | |
74 with_menu_context(data) | 111 with_menu_context(data) |
75 return render_template('edit_page.html', **data) | 112 return render_template('edit_page.html', **data) |
76 | 113 |