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'
42
44
allow_overlays = True
44
def __init__(self, *args, **kwargs):
45
super(XHTMLView, self).__init__(*args, **kwargs)
47
self.overlay_blacklist = []
49
self.plugin_scripts = {}
50
self.plugin_styles = {}
51
self.scripts_init = []
53
self.extra_breadcrumbs = []
54
self.overlay_blacklist = []
56
def get_context_ancestry(self, req):
57
return req.publisher.get_ancestors(self.context)
45
overlay_blacklist = []
47
def __init__(self, req, **kwargs):
49
setattr(self, key, kwargs[key])
59
51
def filter(self, stream, ctx):
74
66
tmpl = loader.load(app_template)
75
67
app = self.filter(tmpl.generate(viewctx), viewctx)
78
69
for plugin in self.plugin_scripts:
79
70
for path in self.plugin_scripts[plugin]:
80
view_scripts.append(media_url(req, plugin, path))
71
req.scripts.append(media_url(req, plugin, path))
83
73
for plugin in self.plugin_styles:
84
74
for path in self.plugin_styles[plugin]:
85
view_styles.append(media_url(req, plugin, path))
75
req.styles.append(media_url(req, plugin, path))
88
78
ctx = genshi.template.Context()
90
overlay_bits = self.render_overlays(req) if req.user else [[]]*4
91
ctx['overlays'] = overlay_bits[0]
79
# XXX: Leave this here!! (Before req.styles is read)
80
ctx['overlays'] = self.render_overlays(req) if req.user else []
93
82
ctx['styles'] = [media_url(req, CorePlugin, 'ivle.css')]
94
ctx['styles'] += view_styles
95
ctx['styles'] += overlay_bits[1]
83
ctx['styles'] += req.styles
97
85
ctx['scripts'] = [media_url(req, CorePlugin, path) for path in
98
86
('util.js', 'json2.js', 'md5.js')]
99
87
ctx['scripts'].append(media_url(req, '+external/jquery', 'jquery.js'))
100
ctx['scripts'] += view_scripts
101
ctx['scripts'] += overlay_bits[2]
88
ctx['scripts'] += req.scripts
103
ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
90
ctx['scripts_init'] = req.scripts_init
104
91
ctx['app_template'] = app
105
92
ctx['title_img'] = media_url(req, CorePlugin,
106
"images/chrome/root-breadcrumb.png")
108
ctx['ancestry'] = self.get_context_ancestry(req)
112
# Allow the view to add its own fake breadcrumbs.
113
ctx['extra_breadcrumbs'] = self.extra_breadcrumbs
115
ctx['crumb'] = Breadcrumber(req).crumb
93
"images/chrome/title.png")
116
94
self.populate_headings(req, ctx)
117
95
tmpl = loader.load(os.path.join(os.path.dirname(__file__),
118
96
'ivle-headings.html'))
124
102
def populate_headings(self, req, ctx):
125
103
ctx['favicon'] = None
126
ctx['root_dir'] = req.config['urls']['root']
127
ctx['public_host'] = req.config['urls']['public_host']
128
ctx['svn_base'] = req.config['urls']['svn_addr']
104
ctx['root_dir'] = ivle.conf.root_dir
105
ctx['public_host'] = ivle.conf.public_host
129
106
ctx['write_javascript_settings'] = req.write_javascript_settings
131
108
ctx['login'] = req.user.login
187
161
#TODO: Re-factor this to look nicer
188
162
for mplugin in overlay.plugin_scripts:
189
163
for path in overlay.plugin_scripts[mplugin]:
190
scripts.append(media_url(req, mplugin, path))
164
req.scripts.append(media_url(req, mplugin, path))
192
166
for mplugin in overlay.plugin_styles:
193
167
for path in overlay.plugin_styles[mplugin]:
194
styles.append(media_url(req, mplugin, path))
168
req.styles.append(media_url(req, mplugin, path))
196
scripts_init += overlay.plugin_scripts_init
170
req.scripts_init += overlay.plugin_scripts_init
198
172
overlays.append(overlay.render(req))
199
return (overlays, styles, scripts, scripts_init)
202
176
def get_error_view(cls, e):
209
183
class XHTMLErrorView(XHTMLView):
210
184
template = 'xhtmlerror.html'
212
def __init__(self, req, context, lastobj):
213
super(XHTMLErrorView, self).__init__(req, context)
214
self.lastobj = lastobj
216
def get_context_ancestry(self, req):
217
return req.publisher.get_ancestors(self.lastobj)
186
def __init__(self, req, exception):
187
self.context = exception
219
189
def populate(self, req, ctx):
221
190
ctx['exception'] = self.context
223
192
class XHTMLUnauthorizedView(XHTMLErrorView):
224
193
template = 'xhtmlunauthorized.html'
226
def __init__(self, req, exception, lastobj):
227
super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
195
def __init__(self, req, exception):
196
super(XHTMLUnauthorizedView, self).__init__(req, exception)
229
198
if req.user is None:
230
199
# Not logged in. Redirect to login page.