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