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

« back to all changes in this revision

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

Clean up ivle.webapp.help and improve error handling when traversing to help
documents.

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
import ivle.conf
7
7
from ivle.webapp.base.plugins import ViewPlugin
8
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)
 
9
from ivle.webapp.errors import NotFound, Forbidden
16
10
 
17
11
def generate_toc(plugins, req):
18
12
    toc = {}
30
24
        if isinstance(curdict[key], dict):
31
25
            add_dict(newdict[key], curdict[key], plugin)
32
26
        else:
33
 
            newdict[key] = help_url(plugin, curdict[key])
 
27
            newdict[key] = os.path.join(plugin, curdict[key])
34
28
    return newdict
35
29
 
36
30
class HelpView(XHTMLView):
37
31
    """Shows the help file for the specified path."""
38
 
    
 
32
 
39
33
    template = 'helpview.html'
40
 
    
 
34
 
41
35
    def __init__(self, req, path):
42
36
        self.paths = path.split('/')
43
 
    
 
37
 
44
38
    def populate(self, req, ctx):
45
39
        helpfile = generate_toc(req.plugin_index[ViewPlugin], req)
46
40
        try:
47
41
            for path in self.paths:
48
 
                helpfile = helpfile[path]
49
 
                ctx['helpfile'] = helpfile
50
 
        except KeyError:
51
 
            pass
52
 
            
53
 
 
54
 
class HelpToc(XHTMLView):
 
42
                if len(path) > 0:
 
43
                    helpfile = helpfile[path]
 
44
        except (KeyError, TypeError):
 
45
            # Traversal failed. We 404.
 
46
            raise NotFound()
 
47
 
 
48
        if not isinstance(helpfile, basestring):
 
49
            # It's a virtual directory.
 
50
            raise Forbidden()
 
51
 
 
52
        ctx['helpfile'] = helpfile
 
53
 
 
54
 
 
55
class HelpToCView(XHTMLView):
55
56
    """Displays the help Table of Contents."""
56
57
    appname = 'help'
57
58
    template = 'toc.html'
58
 
    
 
59
 
59
60
    def populate(self, req, ctx):
60
61
        ctx['toc'] = generate_toc(req.plugin_index[ViewPlugin], req)
61
 
        
62
 
        
 
62
 
63
63
 
64
64
class Plugin(ViewPlugin):
65
65
    """The plugin for viewing help files."""
66
 
    
 
66
 
67
67
    urls = [
68
 
        ('+help', HelpToc),
 
68
        ('+help', HelpToCView),
69
69
        ('+help/*path', HelpView)
70
70
    ]