Support stuff-other-than-updates.
[zzz-spline-frontpage.git] / splinext / frontpage / controllers / frontpage.py
index fee79aa..fdb0b4c 100644 (file)
@@ -2,12 +2,13 @@ import datetime
 import logging
 
 from pylons import config, request, response, session, tmpl_context as c, url
 import logging
 
 from pylons import config, request, response, session, tmpl_context as c, url
-from pylons.controllers.util import abort, redirect_to
+from pylons.controllers.util import abort, redirect
 from routes import request_config
 from sqlalchemy.orm.exc import NoResultFound
 
 from spline.lib import helpers as h
 from spline.lib.base import BaseController, render
 from routes import request_config
 from sqlalchemy.orm.exc import NoResultFound
 
 from spline.lib import helpers as h
 from spline.lib.base import BaseController, render
+from spline.lib.plugin.load import run_hooks
 from spline.model import meta
 from splinext.frontpage.sources import max_age_to_datetime
 
 from spline.model import meta
 from splinext.frontpage.sources import max_age_to_datetime
 
@@ -45,6 +46,13 @@ class FrontPageController(BaseController):
 
             run_hooks('frontpage_updates_updatetype', opt1=val1, opt2=val2)
 
 
             run_hooks('frontpage_updates_updatetype', opt1=val1, opt2=val2)
 
+        Plugins may also respond to the `frontpage_extras` hook with other
+        interesting things to put on the front page.  There's no way to
+        customize the order of these extras or which appear and which don't, at
+        the moment.  Such hooks should return an object with at least a
+        `template` attribute; the template will be called with the object
+        passed in as its `obj` argument.
+
         Local plugins can override the fairly simple index.mako template to
         customize the front page layout.
         """
         Local plugins can override the fairly simple index.mako template to
         customize the front page layout.
         """
@@ -93,11 +101,21 @@ class FrontPageController(BaseController):
         if c.user:
             c.user.stash['frontpage-last-seen-time'] = now
             meta.Session.add(c.user)
         if c.user:
             c.user.stash['frontpage-last-seen-time'] = now
             meta.Session.add(c.user)
-            meta.Session.commit()
         else:
             response.set_cookie('frontpage-last-seen-time', now)
 
         # Done!  Feed to template
         c.updates = updates
 
         else:
             response.set_cookie('frontpage-last-seen-time', now)
 
         # Done!  Feed to template
         c.updates = updates
 
-        return render('/index.mako')
+        # Hook for non-update interesting things to put on the front page.
+        # This hook should return objects with a 'template' attribute, and
+        # whatever else they need
+        c.extras = run_hooks('frontpage_extras')
+
+        ret = render('/index.mako')
+
+        # Commit AFTER rendering the template!  Committing invalidates
+        # everything in the session, undoing any eagerloading that may have
+        # been done by sources
+        meta.Session.commit()
+        return ret