Mercurial > wikked
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):