diff 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
line wrap: on
line diff
--- a/piecrust/admin/views/create.py	Tue Jun 20 21:12:35 2017 -0700
+++ b/piecrust/admin/views/create.py	Tue Jun 20 21:13:08 2017 -0700
@@ -1,11 +1,9 @@
-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.page import Page
 from piecrust.sources.interfaces import IInteractiveSource
-from piecrust.routing import create_route_metadata
 from ..blueprint import foodtruck_bp
 from ..views import with_menu_context
 
@@ -16,8 +14,8 @@
 @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)
+    pcapp = g.site.piecrust_app
+    source = pcapp.getSource(source_name)
     if source is None:
         abort(400)
     if not isinstance(source, IInteractiveSource):
@@ -25,52 +23,11 @@
 
     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))
-
+            return _submit_page_form(pcapp, source)
         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
@@ -87,3 +44,42 @@
     with_menu_context(data)
     return render_template('create_page.html', **data)
 
+
+def _submit_page_form(pcapp, source):
+    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 item with metadata: %s" % metadata)
+    content_item = source.findContent(metadata)
+    if content_item is None:
+        logger.error("Can't find item for: %s" % metadata)
+        abort(500)
+
+    logger.debug("Creating item: %s" % content_item.spec)
+    with source.openItem(content_item, mode='w') as fp:
+        fp.write('')
+    flash("'%s' was created." % content_item.spec)
+
+    route = pcapp.getSourceRoute(source.name)
+    if route is None:
+        logger.error("Can't find route for source: %s" % source.name)
+        abort(500)
+
+    page = Page(source, content_item)
+    uri = page.getUri()
+    logger.debug("Redirecting to: %s" % uri)
+    return redirect(url_for('.edit_page', uri=uri))
+
+
+class _DummyPage:
+    def __init__(self, fac):
+        self.source_metadata = fac.metadata
+
+    def getRouteMetadata(self):
+        return {}
+
+