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
32
class XHTMLView(BaseView):
41
39
template = 'template.html'
42
45
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)
46
overlay_blacklist = []
48
def __init__(self, req, **kwargs):
50
setattr(self, key, kwargs[key])
60
52
def filter(self, stream, ctx):
104
96
ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
105
97
ctx['app_template'] = app
106
98
ctx['title_img'] = media_url(req, CorePlugin,
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)
99
"images/chrome/title.png")
135
100
self.populate_headings(req, ctx)
136
101
tmpl = loader.load(os.path.join(os.path.dirname(__file__),
137
102
'ivle-headings.html'))
165
130
for tab in plugin.tabs:
166
# tab is a tuple: name, title, desc, icon, path, weight, admin
167
# (Admin is optional, defaults to false)
131
# tab is a tuple: name, title, desc, icon, path
169
133
new_app['this_app'] = hasattr(self, 'tab') \
170
134
and tab[0] == self.tab
178
142
ctx['favicon'] = icon_url
180
144
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):
187
145
new_app['path'] = req.make_path(tab[4])
188
146
new_app['desc'] = tab[2]
189
147
new_app['name'] = tab[1]
235
193
class XHTMLErrorView(XHTMLView):
236
194
template = 'xhtmlerror.html'
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)
196
def __init__(self, req, exception):
197
self.context = exception
245
199
def populate(self, req, ctx):
247
200
ctx['exception'] = self.context
248
req.headers_out['X-IVLE-Error'] = self.context.message
250
202
class XHTMLUnauthorizedView(XHTMLErrorView):
251
203
template = 'xhtmlunauthorized.html'
253
def __init__(self, req, exception, lastobj):
254
super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
205
def __init__(self, req, exception):
206
super(XHTMLUnauthorizedView, self).__init__(req, exception)
256
if not req.publicmode and req.user is None:
257
209
# Not logged in. Redirect to login page.
258
210
if req.uri == '/':
259
211
query_string = ''
262
214
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