comparison piecrust/admin/views/create.py @ 886:dcdec4b951a1

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