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
34
32
class XHTMLView(BaseView):
41
39
template = 'template.html'
42
42
allow_overlays = True
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)
43
overlay_blacklist = []
45
def __init__(self, req, **kwargs):
47
setattr(self, key, kwargs[key])
60
49
def filter(self, stream, ctx):
75
64
tmpl = loader.load(app_template)
76
65
app = self.filter(tmpl.generate(viewctx), viewctx)
79
67
for plugin in self.plugin_scripts:
80
68
for path in self.plugin_scripts[plugin]:
81
view_scripts.append(media_url(req, plugin, path))
69
req.scripts.append(media_url(req, plugin, path))
84
71
for plugin in self.plugin_styles:
85
72
for path in self.plugin_styles[plugin]:
86
view_styles.append(media_url(req, plugin, path))
73
req.styles.append(media_url(req, plugin, path))
89
76
ctx = genshi.template.Context()
91
overlay_bits = self.render_overlays(req) if req.user else [[]]*4
92
ctx['overlays'] = overlay_bits[0]
77
# XXX: Leave this here!! (Before req.styles is read)
78
ctx['overlays'] = self.render_overlays(req) if req.user else []
94
80
ctx['styles'] = [media_url(req, CorePlugin, 'ivle.css')]
95
ctx['styles'] += view_styles
96
ctx['styles'] += overlay_bits[1]
81
ctx['styles'] += req.styles
98
83
ctx['scripts'] = [media_url(req, CorePlugin, path) for path in
99
84
('util.js', 'json2.js', 'md5.js')]
100
85
ctx['scripts'].append(media_url(req, '+external/jquery', 'jquery.js'))
101
ctx['scripts'] += view_scripts
102
ctx['scripts'] += overlay_bits[2]
86
ctx['scripts'] += req.scripts
104
ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
88
ctx['scripts_init'] = req.scripts_init
105
89
ctx['app_template'] = app
106
90
ctx['title_img'] = media_url(req, CorePlugin,
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
91
"images/chrome/title.png")
123
92
self.populate_headings(req, ctx)
124
93
tmpl = loader.load(os.path.join(os.path.dirname(__file__),
125
94
'ivle-headings.html'))
194
160
#TODO: Re-factor this to look nicer
195
161
for mplugin in overlay.plugin_scripts:
196
162
for path in overlay.plugin_scripts[mplugin]:
197
scripts.append(media_url(req, mplugin, path))
163
req.scripts.append(media_url(req, mplugin, path))
199
165
for mplugin in overlay.plugin_styles:
200
166
for path in overlay.plugin_styles[mplugin]:
201
styles.append(media_url(req, mplugin, path))
167
req.styles.append(media_url(req, mplugin, path))
203
scripts_init += overlay.plugin_scripts_init
169
req.scripts_init += overlay.plugin_scripts_init
205
171
overlays.append(overlay.render(req))
206
return (overlays, styles, scripts, scripts_init)
209
175
def get_error_view(cls, e):
216
182
class XHTMLErrorView(XHTMLView):
217
183
template = 'xhtmlerror.html'
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)
185
def __init__(self, req, exception):
186
self.context = exception
226
188
def populate(self, req, ctx):
228
189
ctx['exception'] = self.context
230
191
class XHTMLUnauthorizedView(XHTMLErrorView):
231
192
template = 'xhtmlunauthorized.html'
233
def __init__(self, req, exception, lastobj):
234
super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
194
def __init__(self, req, exception):
195
super(XHTMLUnauthorizedView, self).__init__(req, exception)
236
if not req.publicmode and req.user is None:
237
198
# Not logged in. Redirect to login page.
238
199
if req.uri == '/':
239
200
query_string = ''