70
73
ctx = genshi.template.Context()
74
# XXX: Leave this here!! (Before req.styles is read)
75
ctx['overlays'] = self.render_overlays(req)
71
76
ctx['app_styles'] = req.styles
72
77
ctx['scripts'] = req.scripts
73
78
ctx['scripts_init'] = req.scripts_init
76
81
tmpl = loader.load(os.path.join(os.path.dirname(__file__),
77
82
'ivle-headings.html'))
78
83
req.write(tmpl.generate(ctx).render('xhtml', doctype='xhtml'))
85
def populate(self, req, ctx):
86
raise NotImplementedError()
80
88
def populate_headings(self, req, ctx):
81
89
ctx['favicon'] = None
88
96
ctx['nick'] = req.user.nick
90
98
ctx['login'] = None
99
ctx['logged_in'] = False
91
100
ctx['publicmode'] = req.publicmode
92
101
ctx['apps_in_tabs'] = []
102
if hasattr(self, 'help'):
103
ctx['help_path'] = self.help
93
104
for urlname in ivle.conf.apps.apps_in_tabs:
95
106
app = ivle.conf.apps.app_url[urlname]
108
119
new_app['desc'] = app.desc
109
120
new_app['name'] = app.name
110
121
ctx['apps_in_tabs'].append(new_app)
123
def render_overlays(self, req):
124
"""Generate XML streams for the overlays.
126
Returns a list of streams. Populates the scripts, styles, and
130
for plugin in req.plugin_index[OverlayPlugin]:
131
for overclass in plugin.overlays:
132
if overclass in self.overlay_blacklist:
134
overlay = overclass(req)
135
#TODO: Re-factor this to look nicer
136
for mplugin in overlay.plugin_scripts:
137
for path in overlay.plugin_scripts[mplugin]:
138
req.scripts.append(media_url(req, mplugin, path))
140
for mplugin in overlay.plugin_styles:
141
for path in overlay.plugin_styles[mplugin]:
142
req.styles.append(media_url(req, mplugin, path))
144
req.scripts_init += overlay.plugin_scripts_init
146
overlays.append(overlay.render(req))
150
def get_error_view(cls, e):
151
view_map = {HTTPError: XHTMLErrorView,
152
Unauthorized: XHTMLUnauthorizedView}
153
for exccls in inspect.getmro(type(e)):
154
if exccls in view_map:
155
return view_map[exccls]
157
class XHTMLErrorView(XHTMLView):
158
template = 'xhtmlerror.html'
160
def __init__(self, req, exception):
161
self.context = exception
163
def populate(self, req, ctx):
164
ctx['exception'] = self.context
166
class XHTMLUnauthorizedView(XHTMLErrorView):
167
template = 'xhtmlunauthorized.html'
169
def __init__(self, req, exception):
170
super(XHTMLUnauthorizedView, self).__init__(req, exception)
172
# Not logged in. Redirect to login page.
173
req.throw_redirect('/') # XXX: Need proper URL.