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
202
249
class XHTMLUnauthorizedView(XHTMLErrorView):
203
250
template = 'xhtmlunauthorized.html'
205
def __init__(self, req, exception):
206
super(XHTMLUnauthorizedView, self).__init__(req, exception)
252
def __init__(self, req, exception, lastobj):
253
super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
255
if not req.publicmode and req.user is None:
209
256
# Not logged in. Redirect to login page.
210
257
if req.uri == '/':
211
258
query_string = ''
214
261
req.throw_redirect('/+login' + query_string)
265
class ViewBreadcrumb(object):
266
def __init__(self, req, context):
268
self.context = context
272
return self.context.breadcrumb_text