# HG changeset patch # User Ludovic Chabant # Date 1411688252 25200 # Node ID 24d5464274bb516687e072f64e0d1ae2684df9b3 # Parent bde155a0335b6297c25afdcabfcbe263ce8e873e Handle redirects in the backend instead of the UI. diff -r bde155a0335b -r 24d5464274bb wikked/assets/css/wikked/page.less --- a/wikked/assets/css/wikked/page.less Thu Sep 25 11:35:54 2014 -0700 +++ b/wikked/assets/css/wikked/page.less Thu Sep 25 16:37:32 2014 -0700 @@ -7,7 +7,13 @@ padding: 0 1em; } -// Page title decorator +// Page title decorators +.decorator-sub { + font-size: 0.8em; + margin-top: -0.75em; + margin-bottom: 1.25em; + color: @color-gray-dark; +} .decorator, .decorator-sm { text-transform: uppercase; font-family: @font-family-sans-serif; diff -r bde155a0335b -r 24d5464274bb wikked/assets/js/wikked/models.js --- a/wikked/assets/js/wikked/models.js Thu Sep 25 11:35:54 2014 -0700 +++ b/wikked/assets/js/wikked/models.js Thu Sep 25 16:37:32 2014 -0700 @@ -260,9 +260,13 @@ }, url: function() { var url = PageReadModel.__super__.url.apply(this, arguments); - if (!this.nav.get('user')) { - url += '?user'; - } + var qs = {}; + if (!this.nav.get('user')) + qs.user = 1; + if (this.get('no_redirect')) + qs.no_redirect = 1; + if (_.size(qs) > 0) + url += '?' + $.param(qs); return url; }, checkStatePath: function() { @@ -273,23 +277,6 @@ // Forward user info to the navigation model. this.nav.set('user', this.get('user')); } - if (this.getMeta('redirect')) { - // Handle redirects. - var newPath = this.getMeta('redirect')[0].replace(/^\//, ""); - if (this.get('no_redirect')) { - this.set({ 'redirects_to': newPath }, { 'silent': true }); - } else { - var oldPath = this.get('path'); - this.set({ - 'path': newPath, - 'redirected_from': oldPath - }, { - 'silent': true - }); - this.fetch(); - this.navigate('/read/' + newPath, { replace: true, trigger: false }); - } - } } }); diff -r bde155a0335b -r 24d5464274bb wikked/assets/tpl/read-page.html --- a/wikked/assets/tpl/read-page.html Thu Sep 25 11:35:54 2014 -0700 +++ b/wikked/assets/tpl/read-page.html Thu Sep 25 16:37:32 2014 -0700 @@ -6,7 +6,12 @@
{{meta_query}}
{{/if}} {{#if redirected_from}} - Redirected from {{redirected_from}} +
Redirected from + {{#each redirected_from}} + {{#ifeq @index to=0}} {{else}} | {{/ifeq}} + {{this}} + {{/each}} +
{{/if}} {{#if meta.redirect}} Redirects to {{redirects_to}} diff -r bde155a0335b -r 24d5464274bb wikked/views/read.py --- a/wikked/views/read.py Thu Sep 25 11:35:54 2014 -0700 +++ b/wikked/views/read.py Thu Sep 25 16:37:32 2014 -0700 @@ -6,6 +6,7 @@ is_page_readable, url_from_viewarg, split_url_from_viewarg, CHECK_FOR_READ) +from wikked.utils import get_absolute_url from wikked.web import app from wikked.scm.base import STATE_NAMES @@ -66,16 +67,33 @@ additional_info['user'] = False force_resolve = ('force_resolve' in request.args) + no_redirect = ('no_redirect' in request.args) endpoint, value, path = split_url_from_viewarg(url) if endpoint is None: # Normal page. - page = get_page_or_404( - path, - fields=['url', 'title', 'text', 'meta'], - convert_url=False, - check_perms=CHECK_FOR_READ, - force_resolve=force_resolve) + visited_paths = [] + while True: + page = get_page_or_404( + path, + fields=['url', 'title', 'text', 'meta'], + convert_url=False, + check_perms=CHECK_FOR_READ, + force_resolve=force_resolve) + visited_paths.append(path) + redirect_meta = page.getMeta('redirect') + if redirect_meta is None: + break + path = get_absolute_url(path, redirect_meta) + if no_redirect: + additional_info['redirects_to'] = path + break + if path in visited_paths: + app.logger.error("Circular redirect detected: " + url) + abort(409) + + if len(visited_paths) > 1: + additional_info['redirected_from'] = visited_paths[:-1] result = {'meta': get_page_meta(page), 'text': page.text} result.update(additional_info)