# HG changeset patch # User Ludovic Chabant # Date 1357539098 28800 # Node ID f710528f24b0d2874b7676f9284b5ca8c76276dd # Parent 87b9a8eb8a24b1f99671048b53cdb6d81506d921 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. diff -r 87b9a8eb8a24 -r f710528f24b0 wikked/static/js/wikked/views.js --- 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) { diff -r 87b9a8eb8a24 -r f710528f24b0 wikked/static/tpl/error-unauthorized-edit.html --- /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 @@ +
+
+

You're not authorized to edit this page

+

The page you're trying to edit is protected. Please log into an account that has write access to it.

+
+
diff -r 87b9a8eb8a24 -r f710528f24b0 wikked/views.py --- 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/', 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) diff -r 87b9a8eb8a24 -r f710528f24b0 wikked/wiki.py --- 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):