annotate piecrust/admin/views/edit.py @ 951:c50ff76e0596

admin: Fix old API calls and bugs when editing pages.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 05 Oct 2017 00:28:34 -0700
parents 7ecb946bfafd
children a1c6050c9801
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 (
812
82509bce94ca internal: PEP8 fixup for admin panel code.
Ludovic Chabant <ludovic@chabant.com>
parents: 809
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.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
9 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
10 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
11
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 logger = logging.getLogger(__name__)
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
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
16 @foodtruck_bp.route('/edit/', defaults={'url': ''}, methods=['GET', 'POST'])
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
17 @foodtruck_bp.route('/edit/<path:url>', methods=['GET', 'POST'])
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 @login_required
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
19 def edit_page(url):
610
efc1dc916e7c admin: Configuration changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 607
diff changeset
20 site = g.site
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
21 site_app = site.piecrust_app
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
22 rp = get_requested_page(site_app, site.make_url('/preview/%s' % url))
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
23 page = rp.page
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 if page is None:
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 abort(404)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 if request.method == 'POST':
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
28 page_text = request.form['page_text']
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
29 if request.form['is_dos_nl'] == '0':
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
30 page_text = page_text.replace('\r\n', '\n')
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
31
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
32 page_spec = page.content_spec
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
33
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
34 if 'do_save' in request.form or 'do_save_and_commit' in request.form:
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
35 logger.debug("Writing page: %s" % page_spec)
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
36 with page.source.openItem(page.content_item, 'w',
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
37 encoding='utf8', newline='') as fp:
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
38 fp.write(page_text)
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
39 flash("%s was saved." % page_spec)
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
41 if 'do_save_and_commit' in request.form:
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
42 message = request.form.get('commit_msg')
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
43 if not message:
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
44 message = "Edit %s" % page_spec
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
45 if site.scm:
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
46 commit_paths = [page_spec]
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
47 assets_dir = os.path.splitext(page_spec)[0] + '-assets'
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
48 if os.path.isdir(assets_dir):
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
49 commit_paths += list(os.listdir(assets_dir))
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
50 site.scm.commit(commit_paths, message)
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
51
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
52 if 'do_save' in request.form or 'do_save_and_commit' in request.form:
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
53 return _edit_page_form(page, url)
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
54
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
55 abort(400)
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
56
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
57 return _edit_page_form(page, url)
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
60 @foodtruck_bp.route('/upload/<path:url>', methods=['POST'])
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
61 def upload_page_asset(url):
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
62 if 'ft-asset-file' not in request.files:
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
63 return redirect(url_for('.edit_page', url=url))
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
64
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
65 asset_file = request.files['ft-asset-file']
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
66 if asset_file.filename == '':
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
67 return redirect(url_for('.edit_page', url=url))
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
68
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
69 site = g.site
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
70 site_app = site.piecrust_app
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
71 rp = get_requested_page(site_app, site.make_url('/preview/%s' % url))
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
72 page = rp.page
809
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
73 if page is None:
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
74 abort(404)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
75
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
76 filename = asset_file.filename
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
77 if request.form['ft-asset-name']:
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
78 _, ext = os.path.splitext(filename)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
79 filename = request.form['ft-asset-name'] + ext
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
80 filename = secure_filename(filename)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
81 dirname, _ = os.path.splitext(page.path)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
82 dirname += '-assets'
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
83 if not os.path.exists(dirname):
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
84 os.makedirs(dirname)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
85
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
86 asset_path = os.path.join(dirname, filename)
22c6f6a3d0a0 admin: Add ability to upload page assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
87 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
88 asset_file.save(asset_path)
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
89 return redirect(url_for('.edit_page', url=url))
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
90
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
91
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
92 def _edit_page_form(page, url):
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
93 data = {}
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
94 data['is_new_page'] = False
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
95 data['url_postback'] = url_for('.edit_page', url=url)
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
96 data['url_upload_asset'] = url_for('.upload_page_asset', url=url)
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
97 data['url_preview'] = url_for('.preview_page', url=url)
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
98 data['url_cancel'] = url_for(
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
99 '.list_source', source_name=page.source.name)
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
100 with page.source.openItem(page.content_item, 'r',
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
101 encoding='utf8', newline='') as fp:
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
102 data['page_text'] = fp.read()
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
103 data['is_dos_nl'] = "1" if '\r\n' in data['page_text'] else "0"
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
104
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
105 page.app.env.base_asset_url_format = \
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
106 page.app.config.get('site/root') + '_asset/%path%'
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
107 assetor = Assetor(page)
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
108 assets_data = []
951
c50ff76e0596 admin: Fix old API calls and bugs when editing pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 935
diff changeset
109 for n in assetor._getAssetNames():
935
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
110 assets_data.append({'name': n, 'url': assetor[n]})
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
111 data['assets'] = assets_data
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
112
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
113 with_menu_context(data)
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
114 return render_template('edit_page.html', **data)
7ecb946bfafd admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents: 928
diff changeset
115