changeset 138:df04e6a875ba

Added Celery-powered background updates to wiki pages. TODO: need to make it more customizable and optional.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 08 Dec 2013 12:51:58 -0800
parents d29007463b70
children 2ec24079d9df
files backend.py wikked/db/sql.py wikked/tasks.py wikked/views.py wikked/wiki.py
diffstat 5 files changed, 55 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/backend.py	Sun Dec 08 12:51:58 2013 -0800
@@ -0,0 +1,17 @@
+import logging
+from celery import Celery
+from utils import find_wiki_root
+
+
+logging.basicConfig(level=logging.DEBUG)
+
+
+app = Celery(
+        'wikked',
+        broker='amqp://',
+        backend='amqp://',
+        include=['wikked.tasks'])
+
+if __name__ == '__main__':
+    app.start()
+
--- a/wikked/db/sql.py	Sun Dec 08 12:50:57 2013 -0800
+++ b/wikked/db/sql.py	Sun Dec 08 12:51:58 2013 -0800
@@ -330,7 +330,7 @@
         return po
 
     def _cacheExtendedData(self, page):
-        logger.debug("Caching extended data for page '%s' [%d]." % (page.url, page._id))
+        logger.info("Caching extended data for page '%s' [%d]." % (page.url, page._id))
 
         if not hasattr(page, '_id') or not page._id:
             raise Exception("Given page '%s' has no `_id` attribute set." % page.url)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wikked/tasks.py	Sun Dec 08 12:51:58 2013 -0800
@@ -0,0 +1,30 @@
+import logging
+from backend import app
+from wiki import Wiki, WikiParameters
+
+
+logger = logging.getLogger(__name__)
+
+
+class wiki_session(object):
+    def __init__(self, wiki_root):
+        self.wiki_root = wiki_root
+        self.wiki = None
+
+    def __enter__(self):
+        params = WikiParameters(root=self.wiki_root)
+        self.wiki = Wiki(params)
+        self.wiki.start(False)
+        return self.wiki
+
+    def __exit__(self, type, value, traceback):
+        if self.wiki.db.session:
+            self.wiki.db.session.remove()
+        return False
+
+
+@app.task
+def update_wiki(wiki_root):
+    with wiki_session(wiki_root) as wiki:
+        wiki.update()
+
--- a/wikked/views.py	Sun Dec 08 12:50:57 2013 -0800
+++ b/wikked/views.py	Sun Dec 08 12:51:58 2013 -0800
@@ -13,6 +13,7 @@
 from formatter import PageFormatter, FormattingContext
 from scm.base import STATE_NAMES, ACTION_NAMES
 from utils import split_page_url
+from tasks import update_wiki
 
 
 DONT_CHECK = 0
@@ -210,7 +211,8 @@
             'author': author,
             'message': message
             }
-    g.wiki.setPage(url, page_fields)
+    g.wiki.setPage(url, page_fields, do_update=False)
+    update_wiki.delay(g.wiki.root)
     result = {'saved': 1}
     return make_auth_response(result)
 
@@ -543,6 +545,7 @@
 @app.route('/api/preview', methods=['POST'])
 def api_preview():
     url = request.form.get('url')
+    url = url_from_viewarg(url)
     text = request.form.get('text')
     dummy = DummyPage(g.wiki, url, text)
 
--- a/wikked/wiki.py	Sun Dec 08 12:50:57 2013 -0800
+++ b/wikked/wiki.py	Sun Dec 08 12:51:58 2013 -0800
@@ -176,8 +176,6 @@
     def getPages(self, subdir=None, meta_query=None):
         """ Gets all the pages in the wiki, or in the given sub-directory.
         """
-        if meta_query:
-            self._cachePages()
         for page in self.db.getPages(subdir, meta_query):
             yield page
 
@@ -186,7 +184,7 @@
         """
         return self.db.getPage(url)
 
-    def setPage(self, url, page_fields):
+    def setPage(self, url, page_fields, do_update=True):
         """ Updates or creates a page for a given URL.
         """
         # Validate the parameters.
@@ -211,7 +209,8 @@
         self.scm.commit([page_info.path], commit_meta)
 
         # Update the DB and index with the new/modified page.
-        self.update(url, cache_ext_data=False)
+        if do_update:
+            self.update(url, cache_ext_data=False)
 
     def revertPage(self, url, page_fields):
         """ Reverts the page with the given URL to an older revision.