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
101
ctx['apps_in_tabs'] = []
102
109
if hasattr(self, 'help'):
103
110
ctx['help_path'] = self.help
104
for urlname in ivle.conf.apps.apps_in_tabs:
106
app = ivle.conf.apps.app_url[urlname]
107
new_app['this_app'] = hasattr(self, 'appname') \
108
and urlname == self.appname
110
new_app['has_icon'] = True
111
icon_dir = ivle.conf.apps.app_icon_dir
112
icon_url = ivle.util.make_path(os.path.join(icon_dir, app.icon))
113
new_app['icon_url'] = icon_url
114
if new_app['this_app']:
115
ctx['favicon'] = icon_url
117
new_app['has_icon'] = False
118
new_app['path'] = ivle.util.make_path(urlname)
119
new_app['desc'] = app.desc
120
new_app['name'] = app.name
121
ctx['apps_in_tabs'].append(new_app)
112
ctx['apps_in_tabs'] = []
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'])
123
140
def render_overlays(self, req):
124
141
"""Generate XML streams for the overlays.
130
for plugin in req.plugin_index[OverlayPlugin]:
147
if not self.allow_overlays:
150
for plugin in req.config.plugin_index[OverlayPlugin]:
131
151
for overclass in plugin.overlays:
132
152
if overclass in self.overlay_blacklist:
169
189
def __init__(self, req, exception):
170
190
super(XHTMLUnauthorizedView, self).__init__(req, exception)
171
192
if req.user is None:
172
193
# Not logged in. Redirect to login page.
173
req.throw_redirect('/') # XXX: Need proper URL.
197
query_string = '?url=' + urllib.quote(req.uri, safe="/~")
198
req.throw_redirect('/+login' + query_string)