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