~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/webapp/help/__init__.py

Created a new help system.

The new help system allows plugins to register their help paths, using
a dict of dicts and helpfile paths. This system allows multiple plugins
to use the same heading for their help files (ie. 'admin').

It also allows XHTMLViews to have a 'help' property, which makes the
context-sensitive help link point to their help path.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import os, inspect
 
2
 
 
3
import genshi
 
4
import genshi.template
 
5
 
 
6
import ivle.conf
 
7
from ivle.webapp.base.plugins import ViewPlugin
 
8
from ivle.webapp.base.xhtml import XHTMLView
 
9
 
 
10
def help_url(plugin, path):
 
11
    '''Generates a URL to a media file.
 
12
    
 
13
    Plugin must be a string, which is put into the path literally.'''
 
14
 
 
15
    return os.path.join(ivle.conf.root_dir, plugin, path)
 
16
 
 
17
def generate_toc(plugins, req):
 
18
    toc = {}
 
19
    for plugin in plugins:
 
20
        if hasattr(plugin, 'help'):
 
21
            # Get the dir the plugin resides in
 
22
            plugindir = os.path.dirname(inspect.getmodule(plugin).__file__)
 
23
            add_dict(toc, plugin.help, plugindir)
 
24
    return toc
 
25
 
 
26
def add_dict(newdict, curdict, plugin):
 
27
    for key in curdict:
 
28
        if key not in newdict:
 
29
            newdict[key] = {}
 
30
        if isinstance(curdict[key], dict):
 
31
            add_dict(newdict[key], curdict[key], plugin)
 
32
        else:
 
33
            newdict[key] = help_url(plugin, curdict[key])
 
34
    return newdict
 
35
 
 
36
class HelpView(XHTMLView):
 
37
    """Shows the help file for the specified path."""
 
38
    
 
39
    template = 'helpview.html'
 
40
    
 
41
    def __init__(self, req, path):
 
42
        self.paths = path.split('/')
 
43
    
 
44
    def populate(self, req, ctx):
 
45
        helpfile = generate_toc(req.plugin_index[ViewPlugin], req)
 
46
        try:
 
47
            for path in self.paths:
 
48
                helpfile = helpfile[path]
 
49
                ctx['helpfile'] = helpfile
 
50
        except KeyError:
 
51
            pass
 
52
            
 
53
 
 
54
class HelpToc(XHTMLView):
 
55
    """Displays the help Table of Contents."""
 
56
    appname = 'help'
 
57
    template = 'toc.html'
 
58
    
 
59
    def populate(self, req, ctx):
 
60
        ctx['toc'] = generate_toc(req.plugin_index[ViewPlugin], req)
 
61
        
 
62
        
 
63
 
 
64
class Plugin(ViewPlugin):
 
65
    """The plugin for viewing help files."""
 
66
    
 
67
    urls = [
 
68
        ('+help', HelpToc),
 
69
        ('+help/*path', HelpView)
 
70
    ]