28
28
from ivle.webapp.base.views import BaseView
29
29
from ivle.webapp.base.plugins import ViewPlugin, OverlayPlugin
30
30
from ivle.webapp.errors import HTTPError, Unauthorized
31
from ivle.webapp.publisher import NoPath
32
from ivle.webapp.breadcrumbs import Breadcrumber
32
34
class XHTMLView(BaseView):
39
41
template = 'template.html'
42
42
allow_overlays = True
43
overlay_blacklist = []
45
def __init__(self, req, **kwargs):
47
setattr(self, key, kwargs[key])
43
breadcrumb_text = None
45
def __init__(self, *args, **kwargs):
46
super(XHTMLView, self).__init__(*args, **kwargs)
48
self.overlay_blacklist = []
50
self.plugin_scripts = {}
51
self.plugin_styles = {}
52
self.scripts_init = []
54
self.extra_breadcrumbs = []
55
self.overlay_blacklist = []
57
def get_context_ancestry(self, req):
58
return req.publisher.get_ancestors(self.context)
49
60
def filter(self, stream, ctx):
64
75
tmpl = loader.load(app_template)
65
76
app = self.filter(tmpl.generate(viewctx), viewctx)
67
79
for plugin in self.plugin_scripts:
68
80
for path in self.plugin_scripts[plugin]:
69
req.scripts.append(media_url(req, plugin, path))
81
view_scripts.append(media_url(req, plugin, path))
71
84
for plugin in self.plugin_styles:
72
85
for path in self.plugin_styles[plugin]:
73
req.styles.append(media_url(req, plugin, path))
86
view_styles.append(media_url(req, plugin, path))
76
89
ctx = genshi.template.Context()
77
# XXX: Leave this here!! (Before req.styles is read)
78
ctx['overlays'] = self.render_overlays(req) if req.user else []
91
overlay_bits = self.render_overlays(req) if req.user else [[]]*4
92
ctx['overlays'] = overlay_bits[0]
80
94
ctx['styles'] = [media_url(req, CorePlugin, 'ivle.css')]
81
ctx['styles'] += req.styles
95
ctx['styles'] += view_styles
96
ctx['styles'] += overlay_bits[1]
83
98
ctx['scripts'] = [media_url(req, CorePlugin, path) for path in
84
99
('util.js', 'json2.js', 'md5.js')]
85
100
ctx['scripts'].append(media_url(req, '+external/jquery', 'jquery.js'))
86
ctx['scripts'] += req.scripts
101
ctx['scripts'] += view_scripts
102
ctx['scripts'] += overlay_bits[2]
88
ctx['scripts_init'] = req.scripts_init
104
ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
89
105
ctx['app_template'] = app
90
106
ctx['title_img'] = media_url(req, CorePlugin,
91
"images/chrome/title.png")
107
"images/chrome/root-breadcrumb.png")
109
ctx['ancestry'] = self.get_context_ancestry(req)
113
# If the view has specified text for a breadcrumb, add one.
114
if self.breadcrumb_text:
115
ctx['extra_breadcrumbs'] = [ViewBreadcrumb(req, self)]
117
ctx['extra_breadcrumbs'] = []
119
# Allow the view to add its own fake breadcrumbs.
120
ctx['extra_breadcrumbs'] += self.extra_breadcrumbs
122
ctx['crumb'] = Breadcrumber(req).crumb
92
123
self.populate_headings(req, ctx)
93
124
tmpl = loader.load(os.path.join(os.path.dirname(__file__),
94
125
'ivle-headings.html'))
160
194
#TODO: Re-factor this to look nicer
161
195
for mplugin in overlay.plugin_scripts:
162
196
for path in overlay.plugin_scripts[mplugin]:
163
req.scripts.append(media_url(req, mplugin, path))
197
scripts.append(media_url(req, mplugin, path))
165
199
for mplugin in overlay.plugin_styles:
166
200
for path in overlay.plugin_styles[mplugin]:
167
req.styles.append(media_url(req, mplugin, path))
201
styles.append(media_url(req, mplugin, path))
169
req.scripts_init += overlay.plugin_scripts_init
203
scripts_init += overlay.plugin_scripts_init
171
205
overlays.append(overlay.render(req))
206
return (overlays, styles, scripts, scripts_init)
175
209
def get_error_view(cls, e):
182
216
class XHTMLErrorView(XHTMLView):
183
217
template = 'xhtmlerror.html'
185
def __init__(self, req, exception):
186
self.context = exception
219
def __init__(self, req, context, lastobj):
220
super(XHTMLErrorView, self).__init__(req, context)
221
self.lastobj = lastobj
223
def get_context_ancestry(self, req):
224
return req.publisher.get_ancestors(self.lastobj)
188
226
def populate(self, req, ctx):
189
228
ctx['exception'] = self.context
191
230
class XHTMLUnauthorizedView(XHTMLErrorView):
192
231
template = 'xhtmlunauthorized.html'
194
def __init__(self, req, exception):
195
super(XHTMLUnauthorizedView, self).__init__(req, exception)
233
def __init__(self, req, exception, lastobj):
234
super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
236
if not req.publicmode and req.user is None:
198
237
# Not logged in. Redirect to login page.
199
238
if req.uri == '/':
200
239
query_string = ''