Switch to side-by-side view

--- a/ForgeWiki/forgewiki/wiki_main.py
+++ b/ForgeWiki/forgewiki/wiki_main.py
@@ -5,20 +5,20 @@
 from datetime import datetime
 
 # Non-stdlib imports
-import pkg_resources
 from tg import expose, validate, redirect, response, flash
 from tg.decorators import with_trailing_slash, without_trailing_slash
 from tg.controllers import RestController
 from pylons import g, c, request
 from formencode import validators
 from webob import exc
+from ming.orm import session
 
 # Pyforge-specific imports
 from allura import model as M
 from allura.lib import helpers as h
 from allura.app import Application, SitemapEntry, DefaultAdminController
 from allura.lib.search import search
-from allura.lib.decorators import require_post
+from allura.lib.decorators import require_post, Property
 from allura.lib.security import require_access, has_access
 from allura.controllers import AppDiscussionController, BaseController
 from allura.controllers import attachments as ac
@@ -86,35 +86,44 @@
             log.exception('Error getting artifact %s', topic)
         self.handle_artifact_message(page, message)
 
-    @property
-    def root_page_name(self):
-        globals = WM.Globals.query.get(app_config_id=self.config._id)
-        if globals is not None:
-            page_name = globals.root
-        else:
-            page_name = self.default_root_page_name
-        return page_name
-
-    @property
-    def show_discussion(self):
-        if 'show_discussion' in self.config.options:
-            return self.config.options['show_discussion']
-        else:
-            return True
-
-    @property
-    def show_left_bar(self):
-        if 'show_left_bar' in self.config.options:
-            return self.config.options['show_left_bar']
-        else:
-            return True
-
-    @property
-    def show_right_bar(self):
-        if 'show_right_bar' in self.config.options:
-            return self.config.options['show_right_bar']
-        else:
-            return True
+    @Property
+    def root_page_name():
+        def fget(self):
+            globals = WM.Globals.query.get(app_config_id=self.config._id)
+            if globals is not None:
+                page_name = globals.root
+            else:
+                page_name = self.default_root_page_name
+            return page_name
+        def fset(self, new_root_page_name):
+            globals = WM.Globals.query.get(app_config_id=self.config._id)
+            if globals is not None:
+                globals.root = new_root_page_name
+            elif new_root_page_name != self.default_root_page_name:
+                globals = WM.Globals(app_config_id=self.config._id, root=new_root_page_name)
+            if globals is not None:
+                session(globals).flush()
+
+    @Property
+    def show_discussion():
+        def fget(self):
+            return self.config.options.get('show_discussion', True)
+        def fset(self, show):
+            self.config.options['show_discussion'] = bool(show)
+
+    @Property
+    def show_left_bar():
+        def fget(self):
+            return self.config.options.get('show_left_bar', True)
+        def fset(self, show):
+            self.config.options['show_left_bar'] = bool(show)
+
+    @Property
+    def show_right_bar():
+        def fget(self):
+            return self.config.options.get('show_right_bar', True)
+        def fset(self, show):
+            self.config.options['show_right_bar'] = bool(show)
 
     def main_menu(self):
         '''Apps should provide their entries to be added to the main nav
@@ -159,7 +168,7 @@
             SitemapEntry('Browse Pages',c.app.url+'browse_pages/'),
             SitemapEntry('Browse Labels',c.app.url+'browse_tags/')]
         discussion = c.app.config.discussion
-        pending_mod_count = M.Post.query.find({'discussion_id':discussion._id, 'status':'pending'}).count()
+        pending_mod_count = M.Post.query.find({'discussion_id':discussion._id, 'status':'pending'}).count() if discussion else 0
         if pending_mod_count and h.has_access(discussion, 'moderate')():
             links.append(SitemapEntry('Moderate', discussion.url() + 'moderate', ui_icon=g.icons['pencil'],
                 small = pending_mod_count))
@@ -697,11 +706,7 @@
     @expose()
     @require_post()
     def set_home(self, new_home):
-        globals = WM.Globals.query.get(app_config_id=self.app.config._id)
-        if globals is not None:
-            globals.root = new_home
-        else:
-            globals = WM.Globals(app_config_id=self.app.config._id, root=new_home)
+        self.app.root_page_name = new_home
         self.app.upsert_root(new_home)
         flash('Home updated')
         redirect(c.project.url()+self.app.config.options.mount_point+'/'+new_home+'/')
@@ -710,14 +715,8 @@
     @expose()
     @require_post()
     def set_options(self, show_discussion=False, show_left_bar=False, show_right_bar=False):
-        if show_discussion:
-            show_discussion = True
-        if show_left_bar:
-            show_left_bar = True
-        if show_right_bar:
-            show_right_bar = True
-        self.app.config.options['show_discussion'] = show_discussion
-        self.app.config.options['show_left_bar'] = show_left_bar
-        self.app.config.options['show_right_bar'] = show_right_bar
+        self.app.show_discussion = show_discussion
+        self.app.show_left_bar = show_left_bar
+        self.app.show_right_bar = show_right_bar
         flash('Wiki options updated')
         redirect(c.project.url()+'admin/tools')