Dynamically add sidebar items for programs
This adds sidebar items for programs as appropriate. From the docstring:
A menu item is generated for each program that is currently
running. The public page for each program is added as menu item,
as well as all public documents for that program.
Additionally, we allow access to a program's public page to everyone,
even if the user is not logged in.
Patch by: Sverre Rabbelier
--- a/app/soc/views/models/program.py Sun Dec 07 15:02:03 2008 +0000
+++ b/app/soc/views/models/program.py Sun Dec 07 15:02:29 2008 +0000
@@ -30,10 +30,13 @@
from soc.logic import cleaning
from soc.logic import dicts
from soc.logic.models import sponsor as sponsor_logic
+from soc.logic.models import document as document_logic
from soc.views import helper
+from soc.views.helper import access
from soc.views.helper import redirects
from soc.views.models import base
from soc.views.models import sponsor as sponsor_view
+from soc.views.models import document as document_view
import soc.logic.models.program
@@ -48,10 +51,15 @@
Params:
params: a dict with params for this View
- """
+ """
+
+ rights = {}
+ rights['any_access'] = [access.allow]
+ rights['public'] = [access.allow]
new_params = {}
new_params['logic'] = soc.logic.models.program.logic
+ new_params['rights'] = rights
new_params['scope_view'] = sponsor_view
new_params['scope_redirect'] = redirects.getCreateRedirect
@@ -74,6 +82,65 @@
super(View, self).__init__(params=params)
+ def _getItemsForProgram(self, entity, params):
+ """Returns the menu items for one specifc program
+
+ Args:
+ entity: the program for which the entry should be constructed
+ params: a dict with params for this View.
+ """
+
+ filter = {
+ 'scope_path': entity.key().name(),
+ 'is_featured': True,
+ }
+
+ doc_params = document_view.view.getParams()
+ entities = document_logic.logic.getForFields(filter)
+
+ submenus = []
+
+ # add a link to the home page
+ submenu = {}
+ submenu['title'] = "Home"
+ submenu['url'] = redirects.getPublicRedirect(entity, params)
+ submenus.append(submenu)
+
+ # add a link to all featured documents
+ for entity in entities:
+ submenu = {}
+ submenu['title'] = entity.short_name
+ submenu['url'] = redirects.getPublicRedirect(entity, doc_params)
+ submenus.append(submenu)
+
+ return submenus
+
+ def getExtraMenus(self, request, params=None):
+ """Returns the extra menu's for this view.
+
+ A menu item is generated for each program that is currently
+ running. The public page for each program is added as menu item,
+ as well as all public documents for that program.
+
+ Args:
+ request: unused
+ params: a dict with params for this View.
+ """
+
+ params = dicts.merge(params, self._params)
+ logic = params['logic']
+
+ entities = logic.getForLimitAndOffset(1000)
+
+ menus = []
+
+ for entity in entities:
+ menu = {}
+ menu['heading'] = entity.short_name
+ menu['items'] = self._getItemsForProgram(entity, params)
+ menus.append(menu)
+
+ return menus
view = View()
--- a/app/soc/views/sitemap/build.py Sun Dec 07 15:02:03 2008 +0000
+++ b/app/soc/views/sitemap/build.py Sun Dec 07 15:02:29 2008 +0000
@@ -48,6 +48,7 @@
sidebar.addMenu(host.view.getSidebarLinks)
sidebar.addMenu(request.view.getSidebarLinks)
sidebar.addMenu(program.view.getSidebarLinks)
+sidebar.addMenu(program.view.getExtraMenus)
sidebar.addMenu(organization.view.getSidebarLinks)
sitemap.addPages(presence.view.getDjangoURLPatterns())