Mercurial > piecrust2
comparison foodtruck/views/create.py @ 587:d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 16 Jan 2016 14:24:35 -0800 |
parents | |
children | f1e03f85f14d |
comparison
equal
deleted
inserted
replaced
586:59268b4d8c71 | 587:d4a01a023998 |
---|---|
1 import os.path | |
2 import logging | |
3 from flask import ( | |
4 g, request, abort, render_template, url_for, redirect, flash) | |
5 from flask.ext.login import login_required | |
6 from piecrust.sources.interfaces import IInteractiveSource | |
7 from piecrust.sources.base import MODE_CREATING | |
8 from piecrust.routing import create_route_metadata | |
9 from ..views import with_menu_context | |
10 from ..web import app | |
11 | |
12 | |
13 logger = logging.getLogger(__name__) | |
14 | |
15 | |
16 @app.route('/write/<source_name>', methods=['GET', 'POST']) | |
17 @login_required | |
18 def write_page(source_name): | |
19 site = g.sites.get().piecrust_app | |
20 source = site.getSource(source_name) | |
21 if source is None: | |
22 abort(400) | |
23 if not isinstance(source, IInteractiveSource): | |
24 abort(400) | |
25 | |
26 if request.method == 'POST': | |
27 if 'do_save' in request.form: | |
28 metadata = dict(request.form.items()) | |
29 form_keys = list(metadata.keys()) | |
30 for k in filter(lambda k: not k.startswith('meta-'), form_keys): | |
31 del metadata[k] | |
32 | |
33 fac = source.findPageFactory(metadata, MODE_CREATING) | |
34 if fac is None: | |
35 raise Exception("Can't find page for %s" % metadata) | |
36 abort(400) | |
37 | |
38 logger.debug("Creating page: %s" % fac.path) | |
39 with open(fac.path, 'w', encoding='utf8') as fp: | |
40 fp.write(request.form['page_text']) | |
41 flash("%s was created." % os.path.relpath(fac.path, site.root_dir)) | |
42 | |
43 route = site.getRoute(source.name, fac.metadata, | |
44 skip_taxonomies=True) | |
45 dummy = object() | |
46 dummy.source_metadata = fac.metadata | |
47 dummy.getRouteMetadata = lambda: {} | |
48 route_metadata = create_route_metadata(dummy) | |
49 uri = route.getUri(route_metadata) | |
50 | |
51 return redirect(url_for('edit_page', slug=uri)) | |
52 | |
53 abort(400) | |
54 | |
55 return _write_page_form(source) | |
56 | |
57 | |
58 def _write_page_form(source): | |
59 data = {} | |
60 data['is_new_page'] = True | |
61 data['source_name'] = source.name | |
62 data['url_postback'] = url_for('write_page', source_name=source.name) | |
63 data['fields'] = [] | |
64 for f in source.getInteractiveFields(): | |
65 data['fields'].append({ | |
66 'name': f.name, | |
67 'display_name': f.name, | |
68 'type': f.field_type, | |
69 'value': f.default_value}) | |
70 | |
71 with_menu_context(data) | |
72 return render_template('create_page.html', **data) | |
73 |