32
35
It is expected that apps which use this view will be written using Genshi
39
template = 'template.html'
42
overlay_blacklist = []
35
44
def __init__(self, req, **kwargs):
37
setattr(self, key, kwargs[key])
46
setattr(self, key, kwargs[key])
39
48
def render(self, req):
40
49
req.content_type = 'text/html' # TODO: Detect application/xhtml+xml
52
61
tmpl = loader.load(app_template)
53
62
app = tmpl.generate(viewctx)
64
for plugin in self.plugin_scripts:
65
for path in self.plugin_scripts[plugin]:
66
req.scripts.append(media_url(req, plugin, path))
68
for plugin in self.plugin_styles:
69
for path in self.plugin_styles[plugin]:
70
req.styles.append(media_url(req, plugin, path))
56
73
ctx = genshi.template.Context()
74
# XXX: Leave this here!! (Before req.styles is read)
75
ctx['overlays'] = self.render_overlays(req)
57
76
ctx['app_styles'] = req.styles
58
77
ctx['scripts'] = req.scripts
59
78
ctx['scripts_init'] = req.scripts_init
62
81
tmpl = loader.load(os.path.join(os.path.dirname(__file__),
63
82
'ivle-headings.html'))
64
83
req.write(tmpl.generate(ctx).render('xhtml', doctype='xhtml'))
85
def populate(self, req, ctx):
86
raise NotImplementedError()
66
88
def populate_headings(self, req, ctx):
67
89
ctx['favicon'] = None
94
117
new_app['desc'] = app.desc
95
118
new_app['name'] = app.name
96
119
ctx['apps_in_tabs'].append(new_app)
121
def render_overlays(self, req):
122
"""Generate XML streams for the overlays.
124
Returns a list of streams. Populates the scripts, styles, and
128
for plugin in req.plugin_index[OverlayPlugin]:
129
for overclass in plugin.overlays:
130
if overclass in self.overlay_blacklist:
132
overlay = overclass(req)
133
#TODO: Re-factor this to look nicer
134
for mplugin in overlay.plugin_scripts:
135
for path in overlay.plugin_scripts[mplugin]:
136
req.scripts.append(media_url(req, mplugin, path))
138
for mplugin in overlay.plugin_styles:
139
for path in overlay.plugin_styles[mplugin]:
140
req.styles.append(media_url(req, mplugin, path))
142
req.scripts_init += overlay.plugin_scripts_init
144
overlays.append(overlay.render(req))
148
def get_error_view(cls, e):
149
view_map = {HTTPError: XHTMLErrorView,
150
Unauthorized: XHTMLUnauthorizedView}
151
for exccls in inspect.getmro(type(e)):
152
if exccls in view_map:
153
return view_map[exccls]
155
class XHTMLErrorView(XHTMLView):
156
template = 'xhtmlerror.html'
158
def __init__(self, req, exception):
159
self.context = exception
161
def populate(self, req, ctx):
162
ctx['exception'] = self.context
164
class XHTMLUnauthorizedView(XHTMLErrorView):
165
template = 'xhtmlunauthorized.html'
167
def __init__(self, req, exception):
168
super(XHTMLUnauthorizedView, self).__init__(req, exception)
170
# Not logged in. Redirect to login page.
171
req.throw_redirect('/') # XXX: Need proper URL.