Added a new create regexp in urls for just scope_path
Now that scope_path is properly defined we can add a url matching
just the scope path. This allows some other custom create regexps to
be removed/rewritten.
Note: It needs to be -after- the full key_name regexp, since for
arbitrarily nested scopes it would always match as just scope_path,
even if there are other fields needed after the scope.
Patch by: Sverre Rabbelier
#!/usr/bin/python2.5## Copyright 2008 the Melange authors.## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License."""Module contains sidebar related functions."""__authors__ = [ '"Sverre Rabbelier" <sverre@rabbelier.nl>', ]from soc.views import out_of_bandfrom soc.views.helper import accessSIDEBAR = []def addMenu(callback): global SIDEBAR SIDEBAR.append(callback)def getSidebar(request): sidebar = [] for callback in SIDEBAR: menu = callback(request) if menu: # only if there is a menu we should append it sidebar.append(menu) return sidebardef getSidebarItems(params): """Retrieves a list of sidebar entries for this view. Params usage: The params dictionary is provided to the menu_text's format. sidebar: The sidebar value is returned directly if non-False sidebar_defaults: The sidebar_defaults are used to construct the sidebar items for this View. It is expected to be a tuple of three items, the item's url, it's menu_text, and it's access_type, see getSidebarLinks on how access_type is used. sidebar_additional: The sidebar_additional values are appended to the list of items verbatim, and should be in the format expected by getSidebarLinks. Args: params: a dict with params for this View. """ # Return the found result if params['sidebar']: return params['sidebar'] # Construct defaults manualy defaults = params['sidebar_defaults'] result = [] for url, menu_text, access_type in defaults: url = url % params['url_name'].lower() item = (url, menu_text % params, access_type) result.append(item) for item in params['sidebar_additional']: result.append(item) return resultdef getSidebarLinks(request, params=None): """Returns an dictionary with one sidebar entry. Calls getSidebarItems to retrieve the items that should be in the menu. Expected is a tuple with an url, a menu_text, and an access_type. The access_type is then passed to checkAccess, if it raises out_of_band.Error, the item will not be added. Args: request: the django request object params: a dict with params for this View Params usage: The params dictionary is passed as argument to getSidebarItems, see the docstring of getSidebarItems on how it uses it. rights: The rights dictionary is used to check if the user has the required rights to see a sidebar item. See checkAccess for more details on how the rights dictionary is used to check access rights. sidebar_heading: The sidebar_heading value is used to set the heading variable in the result. name: The name value is used if sidebar_heading is not present. Returns: A dictionary is returned with it's 'heading' value set as explained above. It's 'items' value is constructed by calling _getSidebarItems. It constists of dictionaries with a url and a title field. """ rights = params['rights'] items = [] for url, menu_text, access_type in getSidebarItems(params): try: access.checkAccess(access_type, request, rights) items.append({'url': url, 'title': menu_text}) except out_of_band.Error: pass if not items: return res = {} if 'sidebar_heading' not in params: params['sidebar_heading'] = params['name'] res['heading'] = params['sidebar_heading'] res['items'] = items return res