Mercurial > piecrust2
annotate foodtruck/views/create.py @ 628:14c51f5accc9
admin: Fix crashes when creating a new page.
* Use proper default values when the user doesn't provide any.
* Make sure the new page's directory exists.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Mon, 08 Feb 2016 23:28:39 -0800 |
parents | efc1dc916e7c |
children | a7726e4862c4 |
rev | line source |
---|---|
628
14c51f5accc9
admin: Fix crashes when creating a new page.
Ludovic Chabant <ludovic@chabant.com>
parents:
610
diff
changeset
|
1 import os |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import os.path |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 import logging |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 from flask import ( |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 g, request, abort, render_template, url_for, redirect, flash) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 from flask.ext.login import login_required |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 from piecrust.sources.interfaces import IInteractiveSource |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 from piecrust.sources.base import MODE_CREATING |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 from piecrust.routing import create_route_metadata |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 from ..views import with_menu_context |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 from ..web import app |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 logger = logging.getLogger(__name__) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 @app.route('/write/<source_name>', methods=['GET', 'POST']) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 @login_required |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 def write_page(source_name): |
610
efc1dc916e7c
admin: Configuration changes.
Ludovic Chabant <ludovic@chabant.com>
parents:
606
diff
changeset
|
20 site = g.site.piecrust_app |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 source = site.getSource(source_name) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 if source is None: |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 abort(400) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 if not isinstance(source, IInteractiveSource): |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 abort(400) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 if request.method == 'POST': |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 if 'do_save' in request.form: |
606
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
29 metadata = {} |
628
14c51f5accc9
admin: Fix crashes when creating a new page.
Ludovic Chabant <ludovic@chabant.com>
parents:
610
diff
changeset
|
30 for f in source.getInteractiveFields(): |
14c51f5accc9
admin: Fix crashes when creating a new page.
Ludovic Chabant <ludovic@chabant.com>
parents:
610
diff
changeset
|
31 metadata[f.name] = f.default_value |
606
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
32 for fk, fv in request.form.items(): |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
33 if fk.startswith('meta-'): |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
34 metadata[fk[5:]] = fv |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 |
606
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
36 logger.debug("Searching for page with metadata: %s" % metadata) |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 fac = source.findPageFactory(metadata, MODE_CREATING) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 if fac is None: |
606
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
39 logger.error("Can't find page for %s" % metadata) |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
40 abort(500) |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
42 logger.debug("Creating page: %s" % fac.path) |
628
14c51f5accc9
admin: Fix crashes when creating a new page.
Ludovic Chabant <ludovic@chabant.com>
parents:
610
diff
changeset
|
43 os.makedirs(os.path.dirname(fac.path), exist_ok=True) |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 with open(fac.path, 'w', encoding='utf8') as fp: |
606
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
45 fp.write('') |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 flash("%s was created." % os.path.relpath(fac.path, site.root_dir)) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 route = site.getRoute(source.name, fac.metadata, |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 skip_taxonomies=True) |
606
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
50 if route is None: |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
51 logger.error("Can't find route for page: %s" % fac.path) |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
52 abort(500) |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
53 |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
54 dummy = _DummyPage(fac) |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 route_metadata = create_route_metadata(dummy) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 uri = route.getUri(route_metadata) |
610
efc1dc916e7c
admin: Configuration changes.
Ludovic Chabant <ludovic@chabant.com>
parents:
606
diff
changeset
|
57 uri_root = '/site/%s/' % g.site.name |
606
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
58 uri = uri[len(uri_root):] |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
59 logger.debug("Redirecting to: %s" % uri) |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 return redirect(url_for('edit_page', slug=uri)) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 abort(400) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 return _write_page_form(source) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 |
606
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
68 class _DummyPage: |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
69 def __init__(self, fac): |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
70 self.source_metadata = fac.metadata |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
71 |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
72 def getRouteMetadata(self): |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
73 return {} |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
74 |
f1e03f85f14d
admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
587
diff
changeset
|
75 |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 def _write_page_form(source): |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 data = {} |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 data['is_new_page'] = True |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 data['source_name'] = source.name |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 data['url_postback'] = url_for('write_page', source_name=source.name) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 data['fields'] = [] |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 for f in source.getInteractiveFields(): |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
83 data['fields'].append({ |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
84 'name': f.name, |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
85 'display_name': f.name, |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
86 'type': f.field_type, |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
87 'value': f.default_value}) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
88 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
89 with_menu_context(data) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 return render_template('create_page.html', **data) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
91 |