23
24
import genshi.template
25
26
from ivle.webapp.media import media_url
27
from ivle.webapp.core import Plugin as CorePlugin
26
28
from ivle.webapp.base.views import BaseView
27
from ivle.webapp.base.plugins import OverlayPlugin
29
from ivle.webapp.base.plugins import ViewPlugin, OverlayPlugin
28
30
from ivle.webapp.errors import HTTPError, Unauthorized
57
60
app_template = os.path.join(os.path.dirname(
58
61
inspect.getmodule(self).__file__), self.template)
59
req.write_html_head_foot = False
60
62
loader = genshi.template.TemplateLoader(".", auto_reload=True)
61
63
tmpl = loader.load(app_template)
62
64
app = tmpl.generate(viewctx)
73
75
ctx = genshi.template.Context()
74
76
# XXX: Leave this here!! (Before req.styles is read)
75
ctx['overlays'] = self.render_overlays(req)
76
ctx['app_styles'] = req.styles
77
ctx['scripts'] = req.scripts
77
ctx['overlays'] = self.render_overlays(req) if req.user else []
79
ctx['styles'] = [media_url(req, CorePlugin, 'ivle.css')]
80
ctx['styles'] += req.styles
82
ctx['scripts'] = [media_url(req, CorePlugin, path) for path in
83
('util.js', 'json2.js', 'md5.js')]
84
ctx['scripts'] += req.scripts
78
86
ctx['scripts_init'] = req.scripts_init
79
87
ctx['app_template'] = app
80
88
self.populate_headings(req, ctx)
98
106
ctx['login'] = None
99
107
ctx['logged_in'] = False
100
108
ctx['publicmode'] = req.publicmode
109
if hasattr(self, 'help'):
110
ctx['help_path'] = self.help
101
112
ctx['apps_in_tabs'] = []
102
for urlname in ivle.conf.apps.apps_in_tabs:
104
app = ivle.conf.apps.app_url[urlname]
105
new_app['this_app'] = hasattr(self, 'appname') \
106
and urlname == self.appname
108
new_app['has_icon'] = True
109
icon_dir = ivle.conf.apps.app_icon_dir
110
icon_url = ivle.util.make_path(os.path.join(icon_dir, app.icon))
111
new_app['icon_url'] = icon_url
112
if new_app['this_app']:
113
ctx['favicon'] = icon_url
115
new_app['has_icon'] = False
116
new_app['path'] = ivle.util.make_path(urlname)
117
new_app['desc'] = app.desc
118
new_app['name'] = app.name
119
ctx['apps_in_tabs'].append(new_app)
113
for plugin in req.config.plugin_index[ViewPlugin]:
114
if not hasattr(plugin, 'tabs'):
117
for tab in plugin.tabs:
118
# tab is a tuple: name, title, desc, icon, path
120
new_app['this_app'] = hasattr(self, 'appname') \
121
and tab[0] == self.appname
124
if tab[3] is not None:
125
new_app['has_icon'] = True
126
icon_url = media_url(req, plugin, tab[3])
127
new_app['icon_url'] = icon_url
128
if new_app['this_app']:
129
ctx['favicon'] = icon_url
131
new_app['has_icon'] = False
132
new_app['path'] = ivle.util.make_path(tab[4])
133
new_app['desc'] = tab[2]
134
new_app['name'] = tab[1]
135
new_app['weight'] = tab[5]
136
ctx['apps_in_tabs'].append(new_app)
138
ctx['apps_in_tabs'].sort(key=lambda tab: tab['weight'])
121
140
def render_overlays(self, req):
122
141
"""Generate XML streams for the overlays.
128
for plugin in req.plugin_index[OverlayPlugin]:
147
if not self.allow_overlays:
150
for plugin in req.config.plugin_index[OverlayPlugin]:
129
151
for overclass in plugin.overlays:
130
152
if overclass in self.overlay_blacklist:
167
189
def __init__(self, req, exception):
168
190
super(XHTMLUnauthorizedView, self).__init__(req, exception)
169
192
if req.user is None:
170
193
# Not logged in. Redirect to login page.
171
req.throw_redirect('/') # XXX: Need proper URL.
197
query_string = '?url=' + urllib.quote(req.uri, safe="/~")
198
req.throw_redirect('/+login' + query_string)