changeset 474:db73b12ad212

web: Give special pages a linkable URL. All special pages are now in the built-in `special` endpoint, at URLs like `special:/Broken Links`. This makes it possible to link to them from other pages, especially help pages.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 08 Oct 2018 23:49:09 -0700
parents 93d84f2c2b31
children 0ecf8303a135
files wikked/endpoint.py wikked/resolver.py wikked/views/history.py wikked/views/special.py
diffstat 4 files changed, 21 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/wikked/endpoint.py	Mon Oct 08 23:47:02 2018 -0700
+++ b/wikked/endpoint.py	Mon Oct 08 23:49:09 2018 -0700
@@ -14,6 +14,9 @@
 _resources_root_dir = os.path.join(os.path.dirname(__file__), 'resources')
 
 
+SPECIAL_ENDPOINT = 'special'
+
+
 def create_endpoint_infos(config):
     endpoints = {}
     sections = [s for s in config.sections() if s.startswith('endpoint:')]
--- a/wikked/resolver.py	Mon Oct 08 23:47:02 2018 -0700
+++ b/wikked/resolver.py	Mon Oct 08 23:49:09 2018 -0700
@@ -4,6 +4,7 @@
 import logging
 import jinja2
 from wikked.formatter import PageFormatter, FormattingContext
+from wikked.endpoint import SPECIAL_ENDPOINT
 from wikked.utils import (
         PageNotFoundError,
         get_meta_name_and_modifiers, get_absolute_url, split_page_url,
@@ -232,9 +233,14 @@
                 endpoint = m.group('endpoint')
                 is_edit = bool(m.group('isedit'))
                 url = self.ctx.getAbsoluteUrl(raw_url, force_endpoint=endpoint)
-                validated_url = self.wiki.db.validateUrl(url)
-                if validated_url:
-                    url = validated_url
+
+                if endpoint != SPECIAL_ENDPOINT:
+                    validated_url = self.wiki.db.validateUrl(url)
+                    if validated_url:
+                        url = validated_url
+                else:
+                    # TODO: check the URL against a list of known special URLs.
+                    validated_url = url
 
                 self.output.out_links.append(url)
                 action = 'edit' if is_edit else 'read'
--- a/wikked/views/history.py	Mon Oct 08 23:47:02 2018 -0700
+++ b/wikked/views/history.py	Mon Oct 08 23:49:09 2018 -0700
@@ -10,7 +10,7 @@
         read_page_rev, diff_revs, diff_page_revs)
 
 
-@app.route('/special/history')
+@app.route('/read/special:/History')
 @requires_permission('wikihistory')
 def site_history():
     wiki = get_wiki()
--- a/wikked/views/special.py	Mon Oct 08 23:47:02 2018 -0700
+++ b/wikked/views/special.py	Mon Oct 08 23:49:09 2018 -0700
@@ -54,7 +54,7 @@
         "template": "special-double-redirects.html"
     },
     'dead-ends': {
-        "title": "Dead-End Pages",
+        "title": "Dead Ends",
         "view": 'special_list_dead_ends',
         "description": ("Lists pages that don't have any "
                         "outgoing links."),
@@ -85,7 +85,7 @@
 }
 
 
-@app.route('/special')
+@app.route('/read/special:/Dashboard')
 @requires_permission('read')
 def special_pages_dashboard():
     data = {
@@ -134,42 +134,42 @@
     return render_template(info['template'], **data)
 
 
-@app.route('/special/list/orphans')
+@app.route('/read/special:/Orphaned Pages')
 @requires_permission('read')
 def special_list_orphans():
     return call_api('orphans', get_orphans,
                     raw_url='/api/orphans')
 
 
-@app.route('/special/list/broken-redirects')
+@app.route('/read/special:/Broken Redirects')
 @requires_permission('read')
 def special_list_broken_redirects():
     return call_api('broken-redirects', get_broken_redirects,
                     raw_url='/api/broken-redirects')
 
 
-@app.route('/special/list/double-redirects')
+@app.route('/read/special:/Double Redirects')
 @requires_permission('read')
 def special_list_double_redirects():
     return call_api('double-redirects', get_double_redirects,
                     raw_url='/api/double-redirects')
 
 
-@app.route('/special/list/dead-ends')
+@app.route('/read/special:/Dead Ends')
 @requires_permission('read')
 def special_list_dead_ends():
     return call_api('dead-ends', get_dead_ends,
                     raw_url='/api/dead-ends')
 
 
-@app.route('/special/list/broken-links')
+@app.route('/read/special:/Broken Links')
 @requires_permission('read')
 def special_list_broken_links():
     return call_api('broken-links', get_broken_links,
                     raw_url='/api/broken-links')
 
 
-@app.route('/special/list/wanted-pages')
+@app.route('/read/special:/Wanted Pages')
 @requires_permission('read')
 def special_list_wanted_pages():
     return call_api('wanted-pages', get_wanted_pages,