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