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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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