annotate foodtruck/views/create.py @ 606:f1e03f85f14d

admin: Fix creating pages.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 27 Jan 2016 22:47:00 -0800
parents d4a01a023998
children efc1dc916e7c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import os.path
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import logging
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 from flask import (
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 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
5 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
6 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
7 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
8 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
9 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
10 from ..web import app
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11
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 logger = logging.getLogger(__name__)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14
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 @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
17 @login_required
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 def write_page(source_name):
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 site = g.sites.get().piecrust_app
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 source = site.getSource(source_name)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 if source is None:
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 abort(400)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 if not isinstance(source, IInteractiveSource):
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 abort(400)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 if request.method == 'POST':
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 if 'do_save' in request.form:
606
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
28 metadata = {}
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
29 for fk, fv in request.form.items():
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
30 if fk.startswith('meta-'):
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
31 metadata[fk[5:]] = fv
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32
606
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
33 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
34 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
35 if fac is None:
606
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
36 logger.error("Can't find page for %s" % metadata)
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
37 abort(500)
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 logger.debug("Creating page: %s" % fac.path)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 with open(fac.path, 'w', encoding='utf8') as fp:
606
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
41 fp.write('')
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 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
43
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 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
45 skip_taxonomies=True)
606
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
46 if route is None:
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
47 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
48 abort(500)
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
49
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
50 dummy = _DummyPage(fac)
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 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
52 uri = route.getUri(route_metadata)
606
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
53 uri_root = '/site/%s/' % g.sites.get().name
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
54 uri = uri[len(uri_root):]
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
55 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
56
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 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
58
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 abort(400)
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 _write_page_form(source)
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
606
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
64 class _DummyPage:
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
65 def __init__(self, fac):
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
66 self.source_metadata = fac.metadata
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
67
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
68 def getRouteMetadata(self):
f1e03f85f14d admin: Fix creating pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 587
diff changeset
69 return {}
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
587
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 def _write_page_form(source):
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 data = {}
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 data['is_new_page'] = True
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 data['source_name'] = source.name
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 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
77 data['fields'] = []
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 for f in source.getInteractiveFields():
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 data['fields'].append({
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 'name': f.name,
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 'display_name': f.name,
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 'type': f.field_type,
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 'value': f.default_value})
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 with_menu_context(data)
d4a01a023998 admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 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
87