Dynamically add sidebar items for programs
authorSverre Rabbelier <srabbelier@gmail.com>
Sun, 07 Dec 2008 15:02:29 +0000
changeset 700 8baf8367340d
parent 699 4e8eefe95748
child 701 d6f5d34cff5a
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
app/soc/views/models/program.py
app/soc/views/sitemap/build.py
--- 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())