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
for ancestor in ancestry:
117
crumb = crumber.crumb(ancestor)
121
if hasattr(crumb, 'extra_breadcrumbs_before'):
122
ctx['breadcrumbs'].extend(crumb.extra_breadcrumbs_before)
123
ctx['breadcrumbs'].append(crumb)
124
if hasattr(crumb, 'extra_breadcrumbs_after'):
125
ctx['breadcrumbs'].extend(crumb.extra_breadcrumbs_after)
127
# If the view has specified text for a breadcrumb, add one.
128
if self.breadcrumb_text:
129
ctx['breadcrumbs'].append(ViewBreadcrumb(req, self))
131
# Allow the view to add its own fake breadcrumbs.
132
ctx['breadcrumbs'].extend(self.extra_breadcrumbs)
99
"images/chrome/title.png")
134
100
self.populate_headings(req, ctx)
135
101
tmpl = loader.load(os.path.join(os.path.dirname(__file__),
136
102
'ivle-headings.html'))
164
130
for tab in plugin.tabs:
165
# tab is a tuple: name, title, desc, icon, path, weight, admin
166
# (Admin is optional, defaults to false)
131
# tab is a tuple: name, title, desc, icon, path
168
133
new_app['this_app'] = hasattr(self, 'tab') \
169
134
and tab[0] == self.tab
177
142
ctx['favicon'] = icon_url
179
144
new_app['has_icon'] = False
180
# The following check is here, so it is AFTER setting the
181
# icon, but BEFORE actually installing the tab in the menu
182
if len(tab) > 6 and tab[6]:
184
if not (req.user and req.user.admin):
186
145
new_app['path'] = req.make_path(tab[4])
187
146
new_app['desc'] = tab[2]
188
147
new_app['name'] = tab[1]
234
193
class XHTMLErrorView(XHTMLView):
235
194
template = 'xhtmlerror.html'
237
def __init__(self, req, context, lastobj):
238
super(XHTMLErrorView, self).__init__(req, context)
239
self.lastobj = lastobj
241
def get_context_ancestry(self, req):
242
return req.publisher.get_ancestors(self.lastobj)
196
def __init__(self, req, exception):
197
self.context = exception
244
199
def populate(self, req, ctx):
246
200
ctx['exception'] = self.context
248
202
class XHTMLUnauthorizedView(XHTMLErrorView):
249
203
template = 'xhtmlunauthorized.html'
251
def __init__(self, req, exception, lastobj):
252
super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
205
def __init__(self, req, exception):
206
super(XHTMLUnauthorizedView, self).__init__(req, exception)
254
if not req.publicmode and req.user is None:
255
209
# Not logged in. Redirect to login page.
256
210
if req.uri == '/':
257
211
query_string = ''
260
214
req.throw_redirect('/+login' + query_string)
264
class ViewBreadcrumb(object):
265
def __init__(self, req, context):
267
self.context = context
271
return self.context.breadcrumb_text