Changeset 4707

Show
Ignore:
Timestamp:
11/02/08 09:52:25 (2 months ago)
Author:
cbalan
Message:

MenusPlugin:

  • Added 'hide_if_disabled' property. Prevents adding a new option if current user has no access to it, or plugin dissabled. Ex. Admin link having [mainnav]admin.parent=top
  • Added var for 'href' option.
  • Added ctxtnav support(+path_info re).
  • Added '.perm' property.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • menusplugin/0.11/setup.py

    r4285 r4707  
    1010      version="0.1", 
    1111      packages=['tracmenus'], 
     12      author="Catalin Balan",  
     13      author_email="cbalan@optaros.com",  
    1214      url="http://code.optaros.com/trac/oforge", 
    1315      description="Trac Menus", 
  • menusplugin/0.11/tracmenus/web_ui.py

    r4360 r4707  
    1010from trac.config import ListOption, BoolOption 
    1111from trac.util.html import html 
    12 from trac.util.compat import sorted 
    1312 
    1413class MenuManagerModule(Component): 
    1514    implements(IRequestFilter, ITemplateProvider) 
    16     managed_menus = ListOption('menu-custom', 'managed_menus', 'mainnav,metanav', sep=',', doc=""" """) 
    17     serve_ui_files = BoolOption('menu-custom', 'serve_ui_files', 'true') 
     15 
     16    managed_menus = ListOption('menu-custom', 'managed_menus', 'mainnav,metanav',  
     17                        doc="""List of menus to be controlled by the Menu Manager""") 
     18    serve_ui_files = BoolOption('menu-custom', 'serve_ui_files', True) 
    1819 
    1920    # ITemplateProvider 
     
    2829        return handler 
    2930    def post_process_request(self, req, template, data, content_type): 
     31        if 'nav_orig' in req.chrome:  
     32            return template, data, content_type 
    3033        req.chrome['nav_orig'] = req.chrome['nav'].copy() 
    3134        if 'ctxtnav' in self.managed_menus and 'ctxtnav' in req.chrome: 
     
    3437        for menu_name in self.managed_menus: 
    3538            req.chrome['nav'][menu_name] = list(self._get_menu(req, menu_name,  
    36                                                                req.chrome['nav_orig'])) 
     39                                                               req.chrome['nav_orig']))     
    3740            if menu_name=='ctxtnav': 
    3841                req.chrome['ctxtnav'] = [ ctxt_item.get('label') for ctxt_item in req.chrome['nav'][menu_name] ] 
    39                  
     42         
    4043        if self.serve_ui_files: 
    4144            add_script(req, 'tracmenus/js/superfish.js') 
     
    5356             
    5457        tree_menu={}  
    55         for option in sorted(menu_orig+[{'name':key} for key in config_menu.keys()],  
    56                              key=lambda x:config_menu.get(x['name'],{}).get('order','0')): 
    57             if 'visited' in tree_menu.get(option['name'],[]) \ 
    58                     or config_menu.get(option['name'],{}).get('enabled', True)==False \ 
    59                     or config_menu.get(option['name'],{}).get('if_path_info', True)==False: 
     58        for option in sorted(menu_orig+[{'name':key} for key in config_menu.keys() if config_menu[key].get('hide_if_disabled',False)==False],  
     59                             key=lambda x:int(config_menu.get(x['name'],{}).get('order',999))):             
     60            name = option['name'] 
     61            if 'visited' in tree_menu.get(name, []) \ 
     62                    or config_menu.get(name, {}).get('enabled', True)==False \ 
     63                    or config_menu.get(name, {}).get('if_path_info', True)==False \ 
     64                    or False in [req.perm.has_permission(perm) for perm in config_menu.get(name, {}).get('perm', [])]: 
    6065                continue 
    61             name=option['name'] 
    62             tree_menu.setdefault(name, {}).update(option.copy()) 
    63             if 'label' in option and 'label' in config_menu.get(name,[]): 
     66             
     67            tree_node = tree_menu.setdefault(name, {}) 
     68            tree_node.update(option.copy()) 
     69             
     70            if 'label' in option and 'label' in config_menu.get(name, []): 
    6471                del config_menu[name]['label'] 
    65             tree_menu[name].update(config_menu.get(name,{'parent_name':'unassigned'})) 
    66             tree_menu[name]['label']=html(tree_menu[name].setdefault('label',html.a(name))) 
    67             tree_menu[name]['visited']=True  
     72            tree_node.update(config_menu.get(name, {'parent_name':'unassigned'})) 
    6873             
    69             if '_tmp_children' in tree_menu[name]: 
    70                 tree_menu[name]['children']=html.ul() 
    71                 tree_menu[name]['label'].append(tree_menu[name]['children']) 
    72                 tree_menu[name]['children'].children.extend(tree_menu[name]['_tmp_children']) 
    73              
    74             if (tree_menu[name]['parent_name']=='unassigned' and not 'unassigned' in config_menu) or tree_menu[name]['parent_name']=='top':  
    75                 yield tree_menu[name] 
     74            tree_node['label'] = html(tree_node.setdefault('label', html.a(name))) 
     75            tree_node['visited'] = True  
     76            if tree_node.get('href'): 
     77                tree_node.setdefault('active', tree_node['href'].startswith(req.path_info))    
     78 
     79            if '_tmp_children' in tree_node: 
     80                tree_node['children'] = html.ul() 
     81                tree_node['label'].append(tree_node['children']) 
     82                tree_node['children'].children.extend(tree_node['_tmp_children']) 
     83                del tree_node['_tmp_children'] 
     84                         
     85            if (tree_node['parent_name']=='unassigned' and not 'unassigned' in config_menu) \ 
     86                    or tree_node['parent_name']=='top':  
     87                yield tree_node 
    7688                continue 
    7789 
    78             tree_menu[name]['parent']=tree_menu.setdefault(tree_menu[name]['parent_name'],{}) 
     90            tree_node['parent'] = tree_menu.setdefault(tree_node['parent_name'], {}) 
    7991 
    80             child_node=html.li(
    81             child_node.children=[tree_menu[name]['label']] 
    82             if 'label' in tree_menu[name]['parent']: 
    83                 if not 'children' in tree_menu[name]['parent']: 
    84                     tree_menu[name]['parent']['children']=html.ul() 
    85                     tree_menu[name]['parent']['label'].append(tree_menu[name]['parent']['children']) 
    86                 tree_menu[name]['parent']['children'].append(child_node) 
     92            child_node = html.li(class_=tree_node.get('active')==True and 'active' or None
     93            child_node.children=[tree_node['label']] 
     94            if 'label' in tree_node['parent']: 
     95                if not 'children' in tree_node['parent']: 
     96                    tree_node['parent']['children'] = html.ul() 
     97                    tree_node['parent']['label'].append(tree_node['parent']['children']) 
     98                tree_node['parent']['children'].append(child_node) 
    8799            else: 
    88                 tree_menu[name]['parent'].setdefault('_tmp_children',[]).append(child_node) 
     100                tree_node['parent'].setdefault('_tmp_children',[]).append(child_node) 
    89101 
    90102    def _get_config_menus(self, req, menu_name): 
     
    111123            elif prop_name=='path_info': 
    112124                menu[name]['if_path_info'] = re.match(value, req.path_info) and True or False 
     125            elif prop_name=='hide_if_disabled': 
     126                menu[name][prop_name] = self.config[menu_name].getbool(option, False) 
     127                continue 
     128            elif prop_name=='perm': 
     129                menu[name][prop_name] = self.config[menu_name].getlist(option, default=[], sep=',') 
     130                continue 
    113131            menu[name][prop_name]=value 
    114132        return menu, options