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
34
class XHTMLView(BaseView):
41
41
template = 'template.html'
44
42
allow_overlays = True
45
overlay_blacklist = []
47
def __init__(self, req, **kwargs):
49
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)
51
60
def filter(self, stream, ctx):
66
75
tmpl = loader.load(app_template)
67
76
app = self.filter(tmpl.generate(viewctx), viewctx)
69
79
for plugin in self.plugin_scripts:
70
80
for path in self.plugin_scripts[plugin]:
71
req.scripts.append(media_url(req, plugin, path))
81
view_scripts.append(media_url(req, plugin, path))
73
84
for plugin in self.plugin_styles:
74
85
for path in self.plugin_styles[plugin]:
75
req.styles.append(media_url(req, plugin, path))
86
view_styles.append(media_url(req, plugin, path))
78
89
ctx = genshi.template.Context()
79
# XXX: Leave this here!! (Before req.styles is read)
80
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]
82
94
ctx['styles'] = [media_url(req, CorePlugin, 'ivle.css')]
83
ctx['styles'] += req.styles
95
ctx['styles'] += view_styles
96
ctx['styles'] += overlay_bits[1]
85
98
ctx['scripts'] = [media_url(req, CorePlugin, path) for path in
86
99
('util.js', 'json2.js', 'md5.js')]
87
100
ctx['scripts'].append(media_url(req, '+external/jquery', 'jquery.js'))
88
ctx['scripts'] += req.scripts
101
ctx['scripts'] += view_scripts
102
ctx['scripts'] += overlay_bits[2]
90
ctx['scripts_init'] = req.scripts_init
104
ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
91
105
ctx['app_template'] = app
92
106
ctx['title_img'] = media_url(req, CorePlugin,
93
"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
94
123
self.populate_headings(req, ctx)
95
124
tmpl = loader.load(os.path.join(os.path.dirname(__file__),
96
125
'ivle-headings.html'))
102
131
def populate_headings(self, req, ctx):
103
132
ctx['favicon'] = None
104
ctx['root_dir'] = ivle.conf.root_dir
105
ctx['public_host'] = ivle.conf.public_host
133
ctx['root_dir'] = req.config['urls']['root']
134
ctx['public_host'] = req.config['urls']['public_host']
135
ctx['svn_base'] = req.config['urls']['svn_addr']
106
136
ctx['write_javascript_settings'] = req.write_javascript_settings
108
138
ctx['login'] = req.user.login
161
194
#TODO: Re-factor this to look nicer
162
195
for mplugin in overlay.plugin_scripts:
163
196
for path in overlay.plugin_scripts[mplugin]:
164
req.scripts.append(media_url(req, mplugin, path))
197
scripts.append(media_url(req, mplugin, path))
166
199
for mplugin in overlay.plugin_styles:
167
200
for path in overlay.plugin_styles[mplugin]:
168
req.styles.append(media_url(req, mplugin, path))
201
styles.append(media_url(req, mplugin, path))
170
req.scripts_init += overlay.plugin_scripts_init
203
scripts_init += overlay.plugin_scripts_init
172
205
overlays.append(overlay.render(req))
206
return (overlays, styles, scripts, scripts_init)
176
209
def get_error_view(cls, e):
183
216
class XHTMLErrorView(XHTMLView):
184
217
template = 'xhtmlerror.html'
186
def __init__(self, req, exception):
187
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)
189
226
def populate(self, req, ctx):
190
228
ctx['exception'] = self.context
192
230
class XHTMLUnauthorizedView(XHTMLErrorView):
193
231
template = 'xhtmlunauthorized.html'
195
def __init__(self, req, exception):
196
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:
199
237
# Not logged in. Redirect to login page.
200
238
if req.uri == '/':
201
239
query_string = ''