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
106
ctx['svn_base'] = ivle.conf.svn_addr
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']
107
136
ctx['write_javascript_settings'] = req.write_javascript_settings
109
138
ctx['login'] = req.user.login
162
194
#TODO: Re-factor this to look nicer
163
195
for mplugin in overlay.plugin_scripts:
164
196
for path in overlay.plugin_scripts[mplugin]:
165
req.scripts.append(media_url(req, mplugin, path))
197
scripts.append(media_url(req, mplugin, path))
167
199
for mplugin in overlay.plugin_styles:
168
200
for path in overlay.plugin_styles[mplugin]:
169
req.styles.append(media_url(req, mplugin, path))
201
styles.append(media_url(req, mplugin, path))
171
req.scripts_init += overlay.plugin_scripts_init
203
scripts_init += overlay.plugin_scripts_init
173
205
overlays.append(overlay.render(req))
206
return (overlays, styles, scripts, scripts_init)
177
209
def get_error_view(cls, e):
184
216
class XHTMLErrorView(XHTMLView):
185
217
template = 'xhtmlerror.html'
187
def __init__(self, req, exception):
188
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)
190
226
def populate(self, req, ctx):
191
228
ctx['exception'] = self.context
193
230
class XHTMLUnauthorizedView(XHTMLErrorView):
194
231
template = 'xhtmlunauthorized.html'
196
def __init__(self, req, exception):
197
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:
200
237
# Not logged in. Redirect to login page.
201
238
if req.uri == '/':
202
239
query_string = ''