changeset 37:f710528f24b0

Better API responses for editing a new page: - No 404 response on `GET`, instead meta info on the page that would be created. - UI reflects what the new page would be.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 06 Jan 2013 22:11:38 -0800
parents 87b9a8eb8a24
children 60691eefbf67
files wikked/static/js/wikked/views.js wikked/static/tpl/error-unauthorized-edit.html wikked/views.py wikked/wiki.py
diffstat 4 files changed, 45 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/wikked/static/js/wikked/views.js	Sun Jan 06 20:59:25 2013 -0800
+++ b/wikked/static/js/wikked/views.js	Sun Jan 06 22:11:38 2013 -0800
@@ -219,7 +219,14 @@
     });
 
     var PageEditView = exports.PageEditView = MasterPageView.extend({
-        defaultTemplateName: 'edit-page',
+        templateName: function() {
+            switch (this.model.get('error_code')) {
+                case 401:
+                    return 'error-unauthorized-edit';
+                default:
+                    return 'edit-page';
+            }
+        },
         renderCallback: function(view, model) {
             PageEditView.__super__.renderCallback.apply(this, arguments);
             this.$('#page-edit').submit(function(e) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wikked/static/tpl/error-unauthorized-edit.html	Sun Jan 06 22:11:38 2013 -0800
@@ -0,0 +1,6 @@
+<article class="row">
+    <div class="page span12">
+        <h1>You're not authorized to edit this page</h1>
+        <p>The page you're trying to edit is protected. Please <a href="/#/login">log into an account</a> that has write access to it.</p>
+    </div>
+</article>
--- a/wikked/views.py	Sun Jan 06 20:59:25 2013 -0800
+++ b/wikked/views.py	Sun Jan 06 22:11:38 2013 -0800
@@ -1,4 +1,5 @@
 import time
+import os.path
 from flask import (
         Response, 
         render_template, url_for, redirect, abort, request, flash,
@@ -9,6 +10,7 @@
 from pygments.lexers import get_lexer_by_name
 from pygments.formatters import get_formatter_by_name
 from wikked import app, wiki
+from wikked.wiki import Page
 from auth import User
 from forms import RegistrationForm, EditPageForm
 from fs import PageNotFoundError
@@ -208,15 +210,29 @@
 @app.route('/api/edit/<path:url>', methods=['GET', 'PUT', 'POST'])
 def api_edit_page(url):
     if request.method == 'GET':
-        page = get_page_or_404(url, CHECK_FOR_WRITE)
-        result = { 
-                'path': url, 
-                'meta': page.all_meta, 
-                'commit_meta': {
-                    'author': request.remote_addr,
-                    'desc': 'Editing ' + page.title
-                    },
-                'text': page.raw_text
+        page = get_page_or_none(url)
+        if page is None:
+            result = {
+                    'path': url,
+                    'meta': {
+                        'url': url,
+                        'name': os.path.basename(url),
+                        'title': Page.url_to_title(url),
+                        'user': {}
+                        },
+                    'text': ''
+                    }
+        else:
+            if not is_page_writable(page):
+                abort(401)
+            result = { 
+                    'path': url, 
+                    'meta': page.all_meta, 
+                    'text': page.raw_text
+                    }
+        result['commit_meta'] = {
+                'author': request.remote_addr,
+                'desc': 'Editing ' + result['meta']['title']
                 }
         return make_auth_response(result)
 
--- a/wikked/wiki.py	Sun Jan 06 20:59:25 2013 -0800
+++ b/wikked/wiki.py	Sun Jan 06 22:11:38 2013 -0800
@@ -224,6 +224,12 @@
         # Now replace spaces and punctuation with a hyphen.
         return re.sub(r'[^A-Za-z0-9_\.\-\(\)/]+', '-', ansi_title.lower())
 
+    @staticmethod
+    def url_to_title(url):
+        def upperChar(m):
+            return m.group(0).upper()
+        return re.sub(r'^.|\s\S', upperChar, url.lower().replace('-', ' '))
+
 
 class Wiki(object):
     def __init__(self, root=None, logger=None):