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