changeset 439:debeff30d9bd

update: Do a reset if the DB requires an upgrade.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 17 Apr 2017 21:36:49 -0700
parents b259b440a9bd
children 50938f53ce8c
files wikked/db/base.py wikked/db/sql.py wikked/web.py wikked/wiki.py
diffstat 4 files changed, 26 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/wikked/db/base.py	Mon Apr 17 21:36:33 2017 -0700
+++ b/wikked/db/base.py	Mon Apr 17 21:36:49 2017 -0700
@@ -1,6 +1,13 @@
 from wikked.utils import PageNotFoundError
 
 
+class DatabaseUpgradeRequired(Exception):
+    def __init__(self, *args):
+        super().__init__(
+            "This wiki needs a database update. Please run `wk reset`.",
+            *args)
+
+
 class PageListNotFound(Exception):
     def __init__(self, list_name):
         super(PageListNotFound, self).__init__(
--- a/wikked/db/sql.py	Mon Apr 17 21:36:33 2017 -0700
+++ b/wikked/db/sql.py	Mon Apr 17 21:36:49 2017 -0700
@@ -16,7 +16,9 @@
     Load)
 from sqlalchemy.orm.exc import NoResultFound
 from sqlalchemy.orm.session import Session
-from wikked.db.base import Database, PageListNotFound, NoWantedPages
+from wikked.db.base import (
+    Database,
+    DatabaseUpgradeRequired, PageListNotFound, NoWantedPages)
 from wikked.page import Page, PageData, FileSystemPage, WantedPage
 from wikked.utils import split_page_url, lower_url
 
@@ -362,8 +364,7 @@
 
     def updatePage(self, page_info):
         if self._needsSchemaUpdate():
-            raise Exception("This wiki needs a database update. "
-                            "Please run `wk reset`.")
+            raise DatabaseUpgradeRequired()
 
         logger.debug("Updating SQL database for page: %s" % page_info.url)
 
@@ -384,8 +385,7 @@
 
     def updateAll(self, page_infos, force=False):
         if self._needsSchemaUpdate():
-            raise Exception("This wiki needs a database upgrade. "
-                            "Please run `wk reset`.")
+            raise DatabaseUpgradeRequired()
 
         logger.debug("Updating SQL database...")
 
--- a/wikked/web.py	Mon Apr 17 21:36:33 2017 -0700
+++ b/wikked/web.py	Mon Apr 17 21:36:49 2017 -0700
@@ -170,7 +170,7 @@
     })
 
 
-from flask.ext.login import LoginManager
+from flask.ext.login import LoginManager  # NOQA
 login_manager = LoginManager()
 login_manager.init_app(app)
 login_manager.user_loader(user_loader)
@@ -178,12 +178,12 @@
 
 
 # Bcrypt extension.
-from wikked.bcryptfallback import Bcrypt
+from wikked.bcryptfallback import Bcrypt  # NOQA
 app.bcrypt = Bcrypt(app)
 
 
 # Import the views.
-# (this creates a PyFlakes warning but it's OK)
+import wikked.commonroutes    # NOQA
 import wikked.api.admin       # NOQA
 import wikked.api.edit        # NOQA
 import wikked.api.history     # NOQA
@@ -253,4 +253,3 @@
 
     request_started.connect(on_request_started, app)
     request_tearing_down.connect(on_request_tearing_down, app)
-
--- a/wikked/wiki.py	Mon Apr 17 21:36:33 2017 -0700
+++ b/wikked/wiki.py	Mon Apr 17 21:36:49 2017 -0700
@@ -5,6 +5,7 @@
 import importlib
 import multiprocessing
 from configparser import SafeConfigParser, NoOptionError
+from wikked.db import DatabaseUpgradeRequired
 from wikked.fs import FileSystem
 from wikked.auth import UserManager
 from wikked.scheduler import ResolveScheduler
@@ -312,18 +313,22 @@
             page_info.url,
             fields=['url', 'path', 'title', 'text']))
 
-    def updateAll(self, parallel=False):
+    def updateAll(self, parallel=False, reset_on_db_upgrade_required=True):
         """ Completely updates all pages, i.e. read them from the file-system
             and have them fully resolved and cached in the DB.
             This function will check for timestamps to only update pages that
             need it.
         """
         logger.info("Updating all pages...")
-        page_infos = self.fs.getPageInfos()
-        self.db.updateAll(page_infos)
-        self.resolve(parallel=parallel)
-        self.index.updateAll(self.db.getPages(
-            fields=['url', 'path', 'title', 'text']))
+        try:
+            page_infos = self.fs.getPageInfos()
+            self.db.updateAll(page_infos)
+            self.resolve(parallel=parallel)
+            self.index.updateAll(self.db.getPages(
+                fields=['url', 'path', 'title', 'text']))
+        except DatabaseUpgradeRequired:
+            logger.info("Database upgrade required... running full reset.")
+            self.reset(parallel=parallel)
 
     def getPageUrls(self, subdir=None):
         """ Returns all the page URLs in the wiki, or in the given