Mercurial > piecrust2
comparison piecrust/admin/views/create.py @ 778:5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 16 Jul 2016 15:02:24 +0200 |
parents | foodtruck/views/create.py@3885421c29a3 |
children | 82509bce94ca |
comparison
equal
deleted
inserted
replaced
777:8d633ca59bc5 | 778:5e91bc0e3b4d |
---|---|
1 import os | |
2 import os.path | |
3 import logging | |
4 from flask import ( | |
5 g, request, abort, render_template, url_for, redirect, flash) | |
6 from flask.ext.login import login_required | |
7 from piecrust.sources.interfaces import IInteractiveSource | |
8 from piecrust.sources.base import MODE_CREATING | |
9 from piecrust.routing import create_route_metadata | |
10 from ..blueprint import foodtruck_bp | |
11 from ..views import with_menu_context | |
12 | |
13 | |
14 logger = logging.getLogger(__name__) | |
15 | |
16 | |
17 @foodtruck_bp.route('/write/<source_name>', methods=['GET', 'POST']) | |
18 @login_required | |
19 def write_page(source_name): | |
20 site = g.site.piecrust_app | |
21 source = site.getSource(source_name) | |
22 if source is None: | |
23 abort(400) | |
24 if not isinstance(source, IInteractiveSource): | |
25 abort(400) | |
26 | |
27 if request.method == 'POST': | |
28 if 'do_save' in request.form: | |
29 metadata = {} | |
30 for f in source.getInteractiveFields(): | |
31 metadata[f.name] = f.default_value | |
32 for fk, fv in request.form.items(): | |
33 if fk.startswith('meta-'): | |
34 metadata[fk[5:]] = fv | |
35 | |
36 logger.debug("Searching for page with metadata: %s" % metadata) | |
37 fac = source.findPageFactory(metadata, MODE_CREATING) | |
38 if fac is None: | |
39 logger.error("Can't find page for %s" % metadata) | |
40 abort(500) | |
41 | |
42 logger.debug("Creating page: %s" % fac.path) | |
43 os.makedirs(os.path.dirname(fac.path), exist_ok=True) | |
44 with open(fac.path, 'w', encoding='utf8') as fp: | |
45 fp.write('') | |
46 flash("%s was created." % os.path.relpath(fac.path, site.root_dir)) | |
47 | |
48 route = site.getSourceRoute(source.name, fac.metadata) | |
49 if route is None: | |
50 logger.error("Can't find route for page: %s" % fac.path) | |
51 abort(500) | |
52 | |
53 dummy = _DummyPage(fac) | |
54 route_metadata = create_route_metadata(dummy) | |
55 uri = route.getUri(route_metadata) | |
56 uri_root = '/site/%s/' % g.site.name | |
57 uri = uri[len(uri_root):] | |
58 logger.debug("Redirecting to: %s" % uri) | |
59 | |
60 return redirect(url_for('.edit_page', slug=uri)) | |
61 | |
62 abort(400) | |
63 | |
64 return _write_page_form(source) | |
65 | |
66 | |
67 class _DummyPage: | |
68 def __init__(self, fac): | |
69 self.source_metadata = fac.metadata | |
70 | |
71 def getRouteMetadata(self): | |
72 return {} | |
73 | |
74 | |
75 def _write_page_form(source): | |
76 data = {} | |
77 data['is_new_page'] = True | |
78 data['source_name'] = source.name | |
79 data['url_postback'] = url_for('.write_page', source_name=source.name) | |
80 data['fields'] = [] | |
81 for f in source.getInteractiveFields(): | |
82 data['fields'].append({ | |
83 'name': f.name, | |
84 'display_name': f.name, | |
85 'type': f.field_type, | |
86 'value': f.default_value}) | |
87 | |
88 with_menu_context(data) | |
89 return render_template('create_page.html', **data) | |
90 |