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
32
34
class XHTMLView(BaseView):
39
41
template = 'template.html'
45
42
allow_overlays = True
46
overlay_blacklist = []
48
def __init__(self, req, **kwargs):
50
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)
52
60
def filter(self, stream, ctx):
96
104
ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
97
105
ctx['app_template'] = app
98
106
ctx['title_img'] = media_url(req, CorePlugin,
99
"images/chrome/title.png")
107
"images/chrome/root-breadcrumb.png")
109
ancestry = self.get_context_ancestry(req)
113
crumber = Breadcrumber(req)
115
ctx['breadcrumbs'] = []
116
if not req.publicmode:
117
for ancestor in ancestry:
118
crumb = crumber.crumb(ancestor)
122
if hasattr(crumb, 'extra_breadcrumbs_before'):
123
ctx['breadcrumbs'].extend(crumb.extra_breadcrumbs_before)
124
ctx['breadcrumbs'].append(crumb)
125
if hasattr(crumb, 'extra_breadcrumbs_after'):
126
ctx['breadcrumbs'].extend(crumb.extra_breadcrumbs_after)
128
# If the view has specified text for a breadcrumb, add one.
129
if self.breadcrumb_text:
130
ctx['breadcrumbs'].append(ViewBreadcrumb(req, self))
132
# Allow the view to add its own fake breadcrumbs.
133
ctx['breadcrumbs'].extend(self.extra_breadcrumbs)
100
135
self.populate_headings(req, ctx)
101
136
tmpl = loader.load(os.path.join(os.path.dirname(__file__),
102
137
'ivle-headings.html'))
130
165
for tab in plugin.tabs:
131
# tab is a tuple: name, title, desc, icon, path
166
# tab is a tuple: name, title, desc, icon, path, weight, admin
167
# (Admin is optional, defaults to false)
133
169
new_app['this_app'] = hasattr(self, 'tab') \
134
170
and tab[0] == self.tab
142
178
ctx['favicon'] = icon_url
144
180
new_app['has_icon'] = False
181
# The following check is here, so it is AFTER setting the
182
# icon, but BEFORE actually installing the tab in the menu
183
if len(tab) > 6 and tab[6]:
185
if not (req.user and req.user.admin):
145
187
new_app['path'] = req.make_path(tab[4])
146
188
new_app['desc'] = tab[2]
147
189
new_app['name'] = tab[1]
193
235
class XHTMLErrorView(XHTMLView):
194
236
template = 'xhtmlerror.html'
196
def __init__(self, req, exception):
197
self.context = exception
238
def __init__(self, req, context, lastobj):
239
super(XHTMLErrorView, self).__init__(req, context)
240
self.lastobj = lastobj
242
def get_context_ancestry(self, req):
243
return req.publisher.get_ancestors(self.lastobj)
199
245
def populate(self, req, ctx):
200
247
ctx['exception'] = self.context
248
req.headers_out['X-IVLE-Error'] = self.context.message
202
250
class XHTMLUnauthorizedView(XHTMLErrorView):
203
251
template = 'xhtmlunauthorized.html'
205
def __init__(self, req, exception):
206
super(XHTMLUnauthorizedView, self).__init__(req, exception)
253
def __init__(self, req, exception, lastobj):
254
super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
256
if not req.publicmode and req.user is None:
209
257
# Not logged in. Redirect to login page.
210
258
if req.uri == '/':
211
259
query_string = ''
214
262
req.throw_redirect('/+login' + query_string)
266
class ViewBreadcrumb(object):
267
def __init__(self, req, context):
269
self.context = context
273
return self.context.breadcrumb_text