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
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)
45
overlay_blacklist = []
47
def __init__(self, req, **kwargs):
49
setattr(self, key, kwargs[key])
60
51
def filter(self, stream, ctx):
75
66
tmpl = loader.load(app_template)
76
67
app = self.filter(tmpl.generate(viewctx), viewctx)
79
69
for plugin in self.plugin_scripts:
80
70
for path in self.plugin_scripts[plugin]:
81
view_scripts.append(media_url(req, plugin, path))
71
req.scripts.append(media_url(req, plugin, path))
84
73
for plugin in self.plugin_styles:
85
74
for path in self.plugin_styles[plugin]:
86
view_styles.append(media_url(req, plugin, path))
75
req.styles.append(media_url(req, plugin, path))
89
78
ctx = genshi.template.Context()
91
overlay_bits = self.render_overlays(req) if req.user else [[]]*4
92
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 []
94
82
ctx['styles'] = [media_url(req, CorePlugin, 'ivle.css')]
95
ctx['styles'] += view_styles
96
ctx['styles'] += overlay_bits[1]
83
ctx['styles'] += req.styles
98
85
ctx['scripts'] = [media_url(req, CorePlugin, path) for path in
99
86
('util.js', 'json2.js', 'md5.js')]
100
87
ctx['scripts'].append(media_url(req, '+external/jquery', 'jquery.js'))
101
ctx['scripts'] += view_scripts
102
ctx['scripts'] += overlay_bits[2]
88
ctx['scripts'] += req.scripts
104
ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
90
ctx['scripts_init'] = req.scripts_init
105
91
ctx['app_template'] = app
106
92
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
93
"images/chrome/title.png")
123
94
self.populate_headings(req, ctx)
124
95
tmpl = loader.load(os.path.join(os.path.dirname(__file__),
125
96
'ivle-headings.html'))
131
102
def populate_headings(self, req, ctx):
132
103
ctx['favicon'] = None
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']
104
ctx['root_dir'] = ivle.conf.root_dir
105
ctx['public_host'] = ivle.conf.public_host
106
ctx['svn_base'] = ivle.conf.svn_addr
136
107
ctx['write_javascript_settings'] = req.write_javascript_settings
138
109
ctx['login'] = req.user.login
194
162
#TODO: Re-factor this to look nicer
195
163
for mplugin in overlay.plugin_scripts:
196
164
for path in overlay.plugin_scripts[mplugin]:
197
scripts.append(media_url(req, mplugin, path))
165
req.scripts.append(media_url(req, mplugin, path))
199
167
for mplugin in overlay.plugin_styles:
200
168
for path in overlay.plugin_styles[mplugin]:
201
styles.append(media_url(req, mplugin, path))
169
req.styles.append(media_url(req, mplugin, path))
203
scripts_init += overlay.plugin_scripts_init
171
req.scripts_init += overlay.plugin_scripts_init
205
173
overlays.append(overlay.render(req))
206
return (overlays, styles, scripts, scripts_init)
209
177
def get_error_view(cls, e):
216
184
class XHTMLErrorView(XHTMLView):
217
185
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)
187
def __init__(self, req, exception):
188
self.context = exception
226
190
def populate(self, req, ctx):
228
191
ctx['exception'] = self.context
230
193
class XHTMLUnauthorizedView(XHTMLErrorView):
231
194
template = 'xhtmlunauthorized.html'
233
def __init__(self, req, exception, lastobj):
234
super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
196
def __init__(self, req, exception):
197
super(XHTMLUnauthorizedView, self).__init__(req, exception)
236
if not req.publicmode and req.user is None:
237
200
# Not logged in. Redirect to login page.
238
201
if req.uri == '/':
239
202
query_string = ''