Mercurial > piecrust2
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/piecrust/admin/views/create.py Sat Jul 16 15:02:24 2016 +0200 @@ -0,0 +1,90 @@ +import os +import os.path +import logging +from flask import ( + g, request, abort, render_template, url_for, redirect, flash) +from flask.ext.login import login_required +from piecrust.sources.interfaces import IInteractiveSource +from piecrust.sources.base import MODE_CREATING +from piecrust.routing import create_route_metadata +from ..blueprint import foodtruck_bp +from ..views import with_menu_context + + +logger = logging.getLogger(__name__) + + +@foodtruck_bp.route('/write/<source_name>', methods=['GET', 'POST']) +@login_required +def write_page(source_name): + site = g.site.piecrust_app + source = site.getSource(source_name) + if source is None: + abort(400) + if not isinstance(source, IInteractiveSource): + abort(400) + + if request.method == 'POST': + if 'do_save' in request.form: + metadata = {} + for f in source.getInteractiveFields(): + metadata[f.name] = f.default_value + for fk, fv in request.form.items(): + if fk.startswith('meta-'): + metadata[fk[5:]] = fv + + logger.debug("Searching for page with metadata: %s" % metadata) + fac = source.findPageFactory(metadata, MODE_CREATING) + if fac is None: + logger.error("Can't find page for %s" % metadata) + abort(500) + + logger.debug("Creating page: %s" % fac.path) + os.makedirs(os.path.dirname(fac.path), exist_ok=True) + with open(fac.path, 'w', encoding='utf8') as fp: + fp.write('') + flash("%s was created." % os.path.relpath(fac.path, site.root_dir)) + + route = site.getSourceRoute(source.name, fac.metadata) + if route is None: + logger.error("Can't find route for page: %s" % fac.path) + abort(500) + + dummy = _DummyPage(fac) + route_metadata = create_route_metadata(dummy) + uri = route.getUri(route_metadata) + uri_root = '/site/%s/' % g.site.name + uri = uri[len(uri_root):] + logger.debug("Redirecting to: %s" % uri) + + return redirect(url_for('.edit_page', slug=uri)) + + abort(400) + + return _write_page_form(source) + + +class _DummyPage: + def __init__(self, fac): + self.source_metadata = fac.metadata + + def getRouteMetadata(self): + return {} + + +def _write_page_form(source): + data = {} + data['is_new_page'] = True + data['source_name'] = source.name + data['url_postback'] = url_for('.write_page', source_name=source.name) + data['fields'] = [] + for f in source.getInteractiveFields(): + data['fields'].append({ + 'name': f.name, + 'display_name': f.name, + 'type': f.field_type, + 'value': f.default_value}) + + with_menu_context(data) + return render_template('create_page.html', **data) +