Mercurial > piecrust2
comparison piecrust/admin/views/edit.py @ 935:7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
- Use new source APIs in the dashboard to open WIP files.
- Fixed broken/outdated code in some views.
- Fixed cases when Flask is not running at the root URL by using the
`SCRIPT_NAME` variable somewhat more properly.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Wed, 04 Oct 2017 09:15:16 -0700 |
parents | 41db689d36b6 |
children | c50ff76e0596 |
comparison
equal
deleted
inserted
replaced
934:98430e7143d2 | 935:7ecb946bfafd |
---|---|
11 | 11 |
12 | 12 |
13 logger = logging.getLogger(__name__) | 13 logger = logging.getLogger(__name__) |
14 | 14 |
15 | 15 |
16 @foodtruck_bp.route('/edit/', defaults={'uri': ''}, methods=['GET', 'POST']) | 16 @foodtruck_bp.route('/edit/', defaults={'slug': ''}, methods=['GET', 'POST']) |
17 @foodtruck_bp.route('/edit/<path:uri>', methods=['GET', 'POST']) | 17 @foodtruck_bp.route('/edit/<path:slug>', methods=['GET', 'POST']) |
18 @login_required | 18 @login_required |
19 def edit_page(uri): | 19 def edit_page(slug): |
20 site = g.site | 20 site = g.site |
21 pcapp = site.piecrust_app | 21 site_app = site.piecrust_app |
22 rp = get_requested_page(pcapp, '%s/preview/%s' % (site.url_prefix, uri)) | 22 rp = get_requested_page(site_app, |
23 page = rp.page | 23 '/site/%s/%s' % (g.sites.current_site, slug)) |
24 page = rp.qualified_page | |
24 if page is None: | 25 if page is None: |
25 abort(404) | 26 abort(404) |
26 | 27 |
27 if request.method == 'POST': | 28 if request.method == 'POST': |
28 return _submit_page_form(page, uri) | 29 page_text = request.form['page_text'] |
30 if request.form['is_dos_nl'] == '0': | |
31 page_text = page_text.replace('\r\n', '\n') | |
29 | 32 |
30 return _edit_page_form(page, uri) | 33 if 'do_save' in request.form or 'do_save_and_commit' in request.form: |
34 logger.debug("Writing page: %s" % page.path) | |
35 with open(page.path, 'w', encoding='utf8', newline='') as fp: | |
36 fp.write(page_text) | |
37 flash("%s was saved." % os.path.relpath( | |
38 page.path, site_app.root_dir)) | |
39 | |
40 if 'do_save_and_commit' in request.form: | |
41 message = request.form.get('commit_msg') | |
42 if not message: | |
43 message = "Edit %s" % os.path.relpath( | |
44 page.path, site_app.root_dir) | |
45 if site.scm: | |
46 commit_paths = [page.path] | |
47 assets_dir = os.path.splitext(page.path)[0] + '-assets' | |
48 if os.path.isdir(assets_dir): | |
49 commit_paths += list(os.listdir(assets_dir)) | |
50 site.scm.commit(commit_paths, message) | |
51 | |
52 if 'do_save' in request.form or 'do_save_and_commit' in request.form: | |
53 return _edit_page_form(page, slug, site.name) | |
54 | |
55 abort(400) | |
56 | |
57 return _edit_page_form(page, slug, site.name) | |
31 | 58 |
32 | 59 |
33 def _edit_page_form(page, uri): | 60 @foodtruck_bp.route('/upload/<path:slug>', methods=['POST']) |
34 data = {} | 61 def upload_page_asset(slug): |
35 data['is_new_page'] = False | |
36 data['url_postback'] = url_for('.edit_page', uri=uri) | |
37 data['url_upload_asset'] = url_for('.upload_page_asset', uri=uri) | |
38 data['url_preview'] = page.getUri() | |
39 data['url_cancel'] = url_for( | |
40 '.list_source', source_name=page.source.name) | |
41 | |
42 with page.source.openItem(page.content_item, 'r') as fp: | |
43 data['page_text'] = fp.read() | |
44 data['is_dos_nl'] = "1" if '\r\n' in data['page_text'] else "0" | |
45 | |
46 assetor = Assetor(page) | |
47 assets_data = [] | |
48 for n in assetor._getAssetNames(): | |
49 assets_data.append({'name': n, 'url': assetor[n]}) | |
50 data['assets'] = assets_data | |
51 | |
52 data['has_scm'] = (g.site.scm is not None) | |
53 | |
54 with_menu_context(data) | |
55 return render_template('edit_page.html', **data) | |
56 | |
57 | |
58 def _submit_page_form(page, uri): | |
59 page_text = request.form['page_text'] | |
60 if request.form['is_dos_nl'] == '0': | |
61 page_text = page_text.replace('\r\n', '\n') | |
62 | |
63 if 'do_save' in request.form or 'do_save_and_commit' in request.form: | |
64 logger.debug("Writing page: %s" % page.content_spec) | |
65 with page.source.openItem(page.content_item, 'w') as fp: | |
66 fp.write(page_text) | |
67 flash("%s was saved." % page.content_spec) | |
68 | |
69 scm = g.site.scm | |
70 if 'do_save_and_commit' in request.form and scm is not None: | |
71 message = request.form.get('commit_msg') | |
72 if not message: | |
73 message = "Edit %s" % page.content_spec | |
74 scm.commit([page.content_spec], message) | |
75 | |
76 if 'do_save' in request.form or 'do_save_and_commit' in request.form: | |
77 return _edit_page_form(page, uri) | |
78 | |
79 abort(400) | |
80 | |
81 | |
82 @foodtruck_bp.route('/upload/<path:uri>', methods=['POST']) | |
83 def upload_page_asset(uri): | |
84 if 'ft-asset-file' not in request.files: | 62 if 'ft-asset-file' not in request.files: |
85 return redirect(url_for('.edit_page', uri=uri)) | 63 return redirect(url_for('.edit_page', slug=slug)) |
86 | 64 |
87 asset_file = request.files['ft-asset-file'] | 65 asset_file = request.files['ft-asset-file'] |
88 if asset_file.filename == '': | 66 if asset_file.filename == '': |
89 return redirect(url_for('.edit_page', uri=uri)) | 67 return redirect(url_for('.edit_page', slug=slug)) |
90 | 68 |
91 site = g.site | 69 site = g.site |
92 pcapp = site.piecrust_app | 70 site_app = site.piecrust_app |
93 rp = get_requested_page(pcapp, | 71 rp = get_requested_page(site_app, |
94 '/site/%s/%s' % (g.sites.current_site, uri)) | 72 '/site/%s/%s' % (g.sites.current_site, slug)) |
95 page = rp.qualified_page | 73 page = rp.qualified_page |
96 if page is None: | 74 if page is None: |
97 abort(404) | 75 abort(404) |
98 | 76 |
99 filename = asset_file.filename | 77 filename = asset_file.filename |
107 os.makedirs(dirname) | 85 os.makedirs(dirname) |
108 | 86 |
109 asset_path = os.path.join(dirname, filename) | 87 asset_path = os.path.join(dirname, filename) |
110 logger.info("Uploading file to: %s" % asset_path) | 88 logger.info("Uploading file to: %s" % asset_path) |
111 asset_file.save(asset_path) | 89 asset_file.save(asset_path) |
112 return redirect(url_for('.edit_page', uri=uri)) | 90 return redirect(url_for('.edit_page', slug=slug)) |
91 | |
92 | |
93 def _edit_page_form(page, slug, sitename): | |
94 data = {} | |
95 data['is_new_page'] = False | |
96 data['url_postback'] = url_for('.edit_page', slug=slug) | |
97 data['url_upload_asset'] = url_for('.upload_page_asset', slug=slug) | |
98 data['url_preview'] = page.getUri() | |
99 data['url_cancel'] = url_for( | |
100 '.list_source', source_name=page.source.name) | |
101 with open(page.path, 'r', encoding='utf8', newline='') as fp: | |
102 data['page_text'] = fp.read() | |
103 data['is_dos_nl'] = "1" if '\r\n' in data['page_text'] else "0" | |
104 | |
105 page.app.env.base_asset_url_format = \ | |
106 page.app.config.get('site/root') + '_asset/%path%' | |
107 assetor = Assetor(page, 'blah') | |
108 assets_data = [] | |
109 for n in assetor.allNames(): | |
110 assets_data.append({'name': n, 'url': assetor[n]}) | |
111 data['assets'] = assets_data | |
112 | |
113 with_menu_context(data) | |
114 return render_template('edit_page.html', **data) | |
115 |