app/soc/views/models/base.py
changeset 493 6976c4d8d0ac
parent 492 4abdeedfc08e
child 494 5e9c656a1b68
--- a/app/soc/views/models/base.py	Sun Nov 16 22:11:58 2008 +0000
+++ b/app/soc/views/models/base.py	Sun Nov 16 23:02:31 2008 +0000
@@ -39,7 +39,7 @@
 from soc.views.helper import access
 
 
-class View:
+class View(object):
   """Views for entity classes.
 
   The View class functions specific to Entity classes by relying
@@ -77,6 +77,8 @@
         create_redirect: the Django template to redirect to after creation
         save_message: the message to display when the entity is saved
         edit_params: the params to use when editing
+        sidebar: the sidebar menu items for this view
+        sidebar_defaults: a dictionary with defaults for the sidebar 
     """
 
     new_rights = {}
@@ -86,6 +88,13 @@
     new_params['create_redirect'] = '/%s' % params['name_short'].lower()
     new_params['missing_redirect'] = '/%s/create' % params['name_short'].lower()
 
+    new_params['sidebar'] = None
+    new_params['sidebar_defaults'] = [
+     ('/%s/create', 'New %(name)s'),
+     ('/%s/list', 'List %(plural)s'),
+    ]
+    new_params['sidebar_additional'] = []
+
     self._rights = dicts.merge(rights, new_rights)
     self._params = dicts.merge(params, new_params)
 
@@ -472,3 +481,54 @@
       fields[field] = value
 
     return key_name, fields
+
+  def _getSidebarItems(self, params):
+    """Retrieves a list of sidebar entries for this view from self._params
+
+    If params['sidebar'] is None default entries will be constructed 
+    """
+
+    # Return the found result
+    if params['sidebar']:
+      return params['sidebar']
+
+    # Construct defaults manualy
+    defaults = params['sidebar_defaults']
+
+    result = []
+
+    for url, title in defaults:
+      url = url % params['name_short'].lower()
+
+      title = title % {
+          'name': params['name'],
+          'plural': params['name_plural']
+          }
+
+      item = (url, title)
+      result.append(item)
+
+    for item in params['sidebar_additional']:
+      result.append(item)
+
+    return result
+
+  def getSidebarLinks(self, params=None):
+    """Returns an dictionary with one sidebar entry
+
+    Args:
+      params: see __init__
+    """
+
+    params = dicts.merge(params, self._params)
+
+    items = []
+
+    for url, title in self._getSidebarItems(params):
+      items.append({'url': url, 'title': title})
+
+    res = {}
+    res['heading'] = params['name']
+    res['items'] = items
+
+    return res