annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import os.path
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import logging
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
3 from werkzeug.utils import secure_filename
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 from flask import (
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
5 g, request, abort, render_template, url_for, redirect, flash)
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 from flask.ext.login import login_required
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
7 from piecrust.data.assetor import Assetor
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 from piecrust.rendering import (
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 PageRenderingContext, render_page)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 from piecrust.serving.util import get_requested_page
772
3885421c29a3 admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents: 761
diff changeset
11 from ..blueprint import foodtruck_bp
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 from ..views import with_menu_context
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 logger = logging.getLogger(__name__)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17
772
3885421c29a3 admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents: 761
diff changeset
18 @foodtruck_bp.route('/edit/', defaults={'slug': ''}, methods=['GET', 'POST'])
3885421c29a3 admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents: 761
diff changeset
19 @foodtruck_bp.route('/edit/<path:slug>', methods=['GET', 'POST'])
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 @login_required
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 def edit_page(slug):
610
efc1dc916e7c admin: Configuration changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 607
diff changeset
22 site = g.site
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 site_app = site.piecrust_app
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 rp = get_requested_page(site_app,
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 '/site/%s/%s' % (g.sites.current_site, slug))
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 page = rp.qualified_page
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 if page is None:
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 abort(404)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 if request.method == 'POST':
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 page_text = request.form['page_text']
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 if request.form['is_dos_nl'] == '0':
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 page_text = page_text.replace('\r\n', '\n')
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
35 if 'do_save' in request.form or 'do_save_and_commit' in request.form:
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 logger.debug("Writing page: %s" % page.path)
658
a920b2ab1f31 admin: Fix OS-specific new line problems when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 610
diff changeset
37 with open(page.path, 'w', encoding='utf8', newline='') as fp:
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 fp.write(page_text)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 flash("%s was saved." % os.path.relpath(
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 page.path, site_app.root_dir))
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 if 'do_save_and_commit' in request.form:
607
c67dcc0fa80f admin: Prompt the user for a commit message when committing a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 598
diff changeset
43 message = request.form.get('commit_msg')
c67dcc0fa80f admin: Prompt the user for a commit message when committing a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 598
diff changeset
44 if not message:
c67dcc0fa80f admin: Prompt the user for a commit message when committing a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 598
diff changeset
45 message = "Edit %s" % os.path.relpath(
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 page.path, site_app.root_dir)
761
4d8e82641597 admin: Don't crash when the site isn't in a source control repository.
Ludovic Chabant <ludovic@chabant.com>
parents: 658
diff changeset
47 if site.scm:
4d8e82641597 admin: Don't crash when the site isn't in a source control repository.
Ludovic Chabant <ludovic@chabant.com>
parents: 658
diff changeset
48 site.scm.commit([page.path], message)
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 if 'do_save' in request.form or 'do_save_and_commit' in request.form:
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
51 return _edit_page_form(page, slug, site.name)
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 abort(400)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
55 return _edit_page_form(page, slug, site.name)
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
58 @foodtruck_bp.route('/upload/<path:slug>', methods=['POST'])
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
59 def upload_page_asset(slug):
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
60 if 'ft-asset-file' not in request.files:
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
61 return redirect(url_for('.edit_page', slug=slug))
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
62
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
63 asset_file = request.files['ft-asset-file']
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
64 if asset_file.filename == '':
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
65 return redirect(url_for('.edit_page', slug=slug))
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
66
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
67 site = g.site
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
68 site_app = site.piecrust_app
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
69 rp = get_requested_page(site_app,
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
70 '/site/%s/%s' % (g.sites.current_site, slug))
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
71 page = rp.qualified_page
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
72 if page is None:
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
73 abort(404)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
74
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
75 filename = asset_file.filename
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
76 if request.form['ft-asset-name']:
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
77 _, ext = os.path.splitext(filename)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
78 filename = request.form['ft-asset-name'] + ext
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
79 filename = secure_filename(filename)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
80 dirname, _ = os.path.splitext(page.path)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
81 dirname += '-assets'
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
82 if not os.path.exists(dirname):
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
83 os.makedirs(dirname)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
84
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
85 asset_path = os.path.join(dirname, filename)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
86 logger.info("Uploading file to: %s" % asset_path)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
87 asset_file.save(asset_path)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
88 return redirect(url_for('.edit_page', slug=slug))
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
91 def _edit_page_form(page, slug, sitename):
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 data = {}
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 data['is_new_page'] = False
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
94 data['url_postback'] = url_for('.edit_page', slug=slug)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
95 data['url_upload_asset'] = url_for('.upload_page_asset', slug=slug)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
96 data['url_preview'] = page.getUri()
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
97 data['url_cancel'] = url_for(
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
98 '.list_source', source_name=page.source.name)
658
a920b2ab1f31 admin: Fix OS-specific new line problems when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 610
diff changeset
99 with open(page.path, 'r', encoding='utf8', newline='') as fp:
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 data['page_text'] = fp.read()
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 data['is_dos_nl'] = "1" if '\r\n' in data['page_text'] else "0"
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
103 page.app.env.base_asset_url_format = \
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
104 page.app.config.get('site/root') + '_asset/%path%'
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
105 assetor = Assetor(page, 'blah')
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
106 assets_data = []
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
107 for n in assetor.allNames():
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
108 assets_data.append({'name': n, 'url': assetor[n]})
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
109 data['assets'] = assets_data
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
110
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 with_menu_context(data)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 return render_template('edit_page.html', **data)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113