annotate foodtruck/views/create.py @ 772:3885421c29a3

admin: Make the whole FoodTruck site into a blueprint. This makes it possible to use an app factory, which makes it easier to write unit tests.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 03 Jul 2016 07:54:54 -0700
parents a7726e4862c4
children
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
772
3885421c29a3 admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents: 770
diff changeset
10 from ..blueprint import foodtruck_bp
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 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
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
772
3885421c29a3 admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents: 770
diff changeset
17 @foodtruck_bp.route('/write/<source_name>', methods=['GET', 'POST'])
587
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
770
a7726e4862c4 admin: Fix API changes, don't crash the dashboard on non-binary WIP files.
Ludovic Chabant <ludovic@chabant.com>
parents: 628
diff changeset
48 route = site.getSourceRoute(source.name, fac.metadata)
606
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
49 if route is None:
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
50 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
51 abort(500)
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
52
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
53 dummy = _DummyPage(fac)
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 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
55 uri = route.getUri(route_metadata)
610
efc1dc916e7c admin: Configuration changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 606
diff changeset
56 uri_root = '/site/%s/' % g.site.name
606
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
57 uri = uri[len(uri_root):]
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
58 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
59
772
3885421c29a3 admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents: 770
diff changeset
60 return redirect(url_for('.edit_page', slug=uri))
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 abort(400)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64 return _write_page_form(source)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66
606
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
67 class _DummyPage:
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
68 def __init__(self, fac):
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
69 self.source_metadata = fac.metadata
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
70
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
71 def getRouteMetadata(self):
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
72 return {}
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
73
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
74
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 def _write_page_form(source):
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 data = {}
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 data['is_new_page'] = True
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 data['source_name'] = source.name
772
3885421c29a3 admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents: 770
diff changeset
79 data['url_postback'] = url_for('.write_page', source_name=source.name)
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 data['fields'] = []
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 for f in source.getInteractiveFields():
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 data['fields'].append({
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 'name': f.name,
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 'display_name': f.name,
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 'type': f.field_type,
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 'value': f.default_value})
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 with_menu_context(data)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 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
90