Mercurial > piecrust2
comparison piecrust/admin/views/create.py @ 886:dcdec4b951a1
admin: Get the admin panel working again.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 20 Jun 2017 21:13:08 -0700 |
parents | 4850f8c21b6e |
children | 942565723e99 |
comparison
equal
deleted
inserted
replaced
885:13e8b50a2113 | 886:dcdec4b951a1 |
---|---|
1 import os | |
2 import os.path | |
3 import logging | 1 import logging |
4 from flask import ( | 2 from flask import ( |
5 g, request, abort, render_template, url_for, redirect, flash) | 3 g, request, abort, render_template, url_for, redirect, flash) |
6 from flask.ext.login import login_required | 4 from flask.ext.login import login_required |
5 from piecrust.page import Page | |
7 from piecrust.sources.interfaces import IInteractiveSource | 6 from piecrust.sources.interfaces import IInteractiveSource |
8 from piecrust.routing import create_route_metadata | |
9 from ..blueprint import foodtruck_bp | 7 from ..blueprint import foodtruck_bp |
10 from ..views import with_menu_context | 8 from ..views import with_menu_context |
11 | 9 |
12 | 10 |
13 logger = logging.getLogger(__name__) | 11 logger = logging.getLogger(__name__) |
14 | 12 |
15 | 13 |
16 @foodtruck_bp.route('/write/<source_name>', methods=['GET', 'POST']) | 14 @foodtruck_bp.route('/write/<source_name>', methods=['GET', 'POST']) |
17 @login_required | 15 @login_required |
18 def write_page(source_name): | 16 def write_page(source_name): |
19 site = g.site.piecrust_app | 17 pcapp = g.site.piecrust_app |
20 source = site.getSource(source_name) | 18 source = pcapp.getSource(source_name) |
21 if source is None: | 19 if source is None: |
22 abort(400) | 20 abort(400) |
23 if not isinstance(source, IInteractiveSource): | 21 if not isinstance(source, IInteractiveSource): |
24 abort(400) | 22 abort(400) |
25 | 23 |
26 if request.method == 'POST': | 24 if request.method == 'POST': |
27 if 'do_save' in request.form: | 25 if 'do_save' in request.form: |
28 metadata = {} | 26 return _submit_page_form(pcapp, source) |
29 for f in source.getInteractiveFields(): | |
30 metadata[f.name] = f.default_value | |
31 for fk, fv in request.form.items(): | |
32 if fk.startswith('meta-'): | |
33 metadata[fk[5:]] = fv | |
34 | |
35 logger.debug("Searching for page with metadata: %s" % metadata) | |
36 fac = source.findPageFactory(metadata, MODE_CREATING) | |
37 if fac is None: | |
38 logger.error("Can't find page for %s" % metadata) | |
39 abort(500) | |
40 | |
41 logger.debug("Creating page: %s" % fac.path) | |
42 os.makedirs(os.path.dirname(fac.path), exist_ok=True) | |
43 with open(fac.path, 'w', encoding='utf8') as fp: | |
44 fp.write('') | |
45 flash("%s was created." % os.path.relpath(fac.path, site.root_dir)) | |
46 | |
47 route = site.getSourceRoute(source.name, fac.metadata) | |
48 if route is None: | |
49 logger.error("Can't find route for page: %s" % fac.path) | |
50 abort(500) | |
51 | |
52 dummy = _DummyPage(fac) | |
53 route_metadata = create_route_metadata(dummy) | |
54 uri = route.getUri(route_metadata) | |
55 uri_root = '/site/%s/' % g.site.name | |
56 uri = uri[len(uri_root):] | |
57 logger.debug("Redirecting to: %s" % uri) | |
58 | |
59 return redirect(url_for('.edit_page', slug=uri)) | |
60 | |
61 abort(400) | 27 abort(400) |
62 | |
63 return _write_page_form(source) | 28 return _write_page_form(source) |
64 | |
65 | |
66 class _DummyPage: | |
67 def __init__(self, fac): | |
68 self.source_metadata = fac.metadata | |
69 | |
70 def getRouteMetadata(self): | |
71 return {} | |
72 | 29 |
73 | 30 |
74 def _write_page_form(source): | 31 def _write_page_form(source): |
75 data = {} | 32 data = {} |
76 data['is_new_page'] = True | 33 data['is_new_page'] = True |
85 'value': f.default_value}) | 42 'value': f.default_value}) |
86 | 43 |
87 with_menu_context(data) | 44 with_menu_context(data) |
88 return render_template('create_page.html', **data) | 45 return render_template('create_page.html', **data) |
89 | 46 |
47 | |
48 def _submit_page_form(pcapp, source): | |
49 metadata = {} | |
50 for f in source.getInteractiveFields(): | |
51 metadata[f.name] = f.default_value | |
52 for fk, fv in request.form.items(): | |
53 if fk.startswith('meta-'): | |
54 metadata[fk[5:]] = fv | |
55 | |
56 logger.debug("Searching for item with metadata: %s" % metadata) | |
57 content_item = source.findContent(metadata) | |
58 if content_item is None: | |
59 logger.error("Can't find item for: %s" % metadata) | |
60 abort(500) | |
61 | |
62 logger.debug("Creating item: %s" % content_item.spec) | |
63 with source.openItem(content_item, mode='w') as fp: | |
64 fp.write('') | |
65 flash("'%s' was created." % content_item.spec) | |
66 | |
67 route = pcapp.getSourceRoute(source.name) | |
68 if route is None: | |
69 logger.error("Can't find route for source: %s" % source.name) | |
70 abort(500) | |
71 | |
72 page = Page(source, content_item) | |
73 uri = page.getUri() | |
74 logger.debug("Redirecting to: %s" % uri) | |
75 return redirect(url_for('.edit_page', uri=uri)) | |
76 | |
77 | |
78 class _DummyPage: | |
79 def __init__(self, fac): | |
80 self.source_metadata = fac.metadata | |
81 | |
82 def getRouteMetadata(self): | |
83 return {} | |
84 | |
85 |