changeset 98:8f785c5858c6

Added API endpoint for querying pages based on metadata. It uses a very slow implementation, and needs some support from DB caching to be really usable.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 21 Apr 2013 08:11:14 -0700
parents fa8f18c9be9a
children 58a1a7baca25
files wikked/views.py
diffstat 1 files changed, 33 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/wikked/views.py	Sun Apr 21 08:10:15 2013 -0700
+++ b/wikked/views.py	Sun Apr 21 08:11:14 2013 -0700
@@ -17,8 +17,19 @@
 CHECK_FOR_READ = 1
 CHECK_FOR_WRITE = 2
 
+
+def get_category_meta(category):
+    result = []
+    for item in category:
+        result.append({
+            'url': Page.title_to_url(item),
+            'name': item
+            })
+    return result
+
 COERCE_META = {
-    'redirect': Page.title_to_url
+    'redirect': Page.title_to_url,
+    'category': get_category_meta
     }
 
 
@@ -184,6 +195,27 @@
     return make_auth_response(result)
 
 
+@app.route('/api/query')
+def api_query():
+    query = dict(request.args)
+
+    def makelower(i):
+        return i.lower()
+
+    def filterfunc(p):
+        for k, v in query.iteritems():
+            if not k.lower() in p.meta:
+                return False
+            if v is None:
+                return True
+            intersect = set(map(makelower, v)).intersection(map(makelower, p.meta[k]))
+            return len(intersect) > 0
+
+    pages = filter(filterfunc, g.wiki.getPages())
+    result = {'pages': [get_page_meta(p) for p in pages]}
+    return make_auth_response(result)
+
+
 @app.route('/api/diff/<path:url>')
 def api_diff_page(url):
     rev1 = request.args.get('rev1')