changeset 202:3a16f55687d4

First version of endpoint customization.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 11 Feb 2014 08:12:38 -0800
parents 7209c934fc9b
children e845ff2b4bd8
files wikked/resources/defaults.cfg wikked/views/read.py wikked/wiki.py
diffstat 3 files changed, 51 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/wikked/resources/defaults.cfg	Tue Feb 11 08:12:21 2014 -0800
+++ b/wikked/resources/defaults.cfg	Tue Feb 11 08:12:38 2014 -0800
@@ -9,3 +9,10 @@
 database_url=sqlite:///%(root)s/.wiki/wiki.db
 async_updates=False
 
+[endpoint:special]
+query=False
+
+[endpoint:user]
+query=False
+default=special:User
+
--- a/wikked/views/read.py	Tue Feb 11 08:12:21 2014 -0800
+++ b/wikked/views/read.py	Tue Feb 11 08:12:38 2014 -0800
@@ -65,6 +65,8 @@
         else:
             additional_info['user'] = False
 
+    force_resolve = ('force_resolve' in request.args)
+
     endpoint, value, path = split_url_from_viewarg(url)
     if endpoint is None:
         # Normal page.
@@ -72,19 +74,37 @@
                 path,
                 convert_url=False,
                 check_perms=CHECK_FOR_READ,
-                force_resolve=('force_resolve' in request.args))
+                force_resolve=force_resolve)
 
         result = {'meta': get_page_meta(page), 'text': page.text}
         result.update(additional_info)
         return jsonify(result)
 
-    # Meta listing page.
+    # Meta listing page or special endpoint.
     meta_page_url = '%s:%s' % (endpoint, path)
     info_page = get_page_or_none(
             meta_page_url,
             convert_url=False,
             check_perms=CHECK_FOR_READ,
-            force_resolve=('force_resolve' in request.args))
+            force_resolve=force_resolve)
+
+    endpoint_info = g.wiki.endpoints.get(endpoint)
+    if endpoint_info is not None:
+        # We have some information about this endpoint...
+        if endpoint_info.default and info_page is None:
+            # Default page text.
+            info_page = get_page_or_404(
+                    endpoint_info.default,
+                    convert_url=False,
+                    check_perms=CHECK_FOR_READ,
+                    force_resolve=force_resolve)
+
+        if not endpoint_info.query:
+            # Not a query-based endpoint (like categories). Let's just
+            # return the text.
+            result = {'meta': get_page_meta(info_page), 'text': info_page.text}
+            result.update(additional_info)
+            return jsonify(result)
 
     # Get the list of pages to show here.
     query = {endpoint: [value]}
--- a/wikked/wiki.py	Tue Feb 11 08:12:21 2014 -0800
+++ b/wikked/wiki.py	Tue Feb 11 08:12:38 2014 -0800
@@ -149,6 +149,13 @@
         self._config = config
 
 
+class EndpointInfo(object):
+    def __init__(self, name):
+        self.name = name
+        self.query = True
+        self.default = None
+
+
 class Wiki(object):
     """ The wiki class! This is where the magic happens.
     """
@@ -166,6 +173,7 @@
 
         self.main_page_url = '/' + parameters.config.get('wiki', 'main_page').strip('/')
         self.templates_url = '/' + parameters.config.get('wiki', 'templates_dir').strip('/') + '/'
+        self.endpoints = self._createEndpointInfos(parameters.config)
 
         self.fs = parameters.fs_factory()
         self.index = parameters.index_factory()
@@ -322,6 +330,18 @@
             for page in self.db.getUncachedPages():
                 page._ensureExtendedData()
 
+    def _createEndpointInfos(self, config):
+        endpoints = {}
+        sections = [s for s in config.sections() if s.startswith('endpoint:')]
+        for s in sections:
+            ep = EndpointInfo(s[9:])   # 9 = len('endpoint:')
+            if config.has_option(s, 'query'):
+                ep.query = config.getboolean(s, 'query')
+            if config.has_option(s, 'default'):
+                ep.default = config.get(s, 'default')
+            endpoints[ep.name] = ep
+        return endpoints
+
 
 def reloader_stat_loop(wiki, interval=1):
     mtimes = {}
@@ -340,3 +360,4 @@
             elif mtime > old_time:
                 print "Change detected in '%s'." % path
         time.sleep(interval)
+