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