24
23
import genshi.template
26
25
from ivle.webapp.media import media_url
27
from ivle.webapp.core import Plugin as CorePlugin
28
26
from ivle.webapp.base.views import BaseView
29
from ivle.webapp.base.plugins import ViewPlugin, OverlayPlugin
27
from ivle.webapp.base.plugins import OverlayPlugin
30
28
from ivle.webapp.errors import HTTPError, Unauthorized
60
57
app_template = os.path.join(os.path.dirname(
61
58
inspect.getmodule(self).__file__), self.template)
59
req.write_html_head_foot = False
62
60
loader = genshi.template.TemplateLoader(".", auto_reload=True)
63
61
tmpl = loader.load(app_template)
64
62
app = tmpl.generate(viewctx)
75
73
ctx = genshi.template.Context()
76
74
# XXX: Leave this here!! (Before req.styles is read)
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
75
ctx['overlays'] = self.render_overlays(req)
76
ctx['app_styles'] = req.styles
77
ctx['scripts'] = req.scripts
86
78
ctx['scripts_init'] = req.scripts_init
87
79
ctx['app_template'] = app
88
80
self.populate_headings(req, ctx)
106
98
ctx['login'] = None
107
99
ctx['logged_in'] = False
108
100
ctx['publicmode'] = req.publicmode
109
if hasattr(self, 'help'):
110
ctx['help_path'] = self.help
112
101
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'])
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)
140
121
def render_overlays(self, req):
141
122
"""Generate XML streams for the overlays.
147
if not self.allow_overlays:
150
for plugin in req.config.plugin_index[OverlayPlugin]:
128
for plugin in req.plugin_index[OverlayPlugin]:
151
129
for overclass in plugin.overlays:
152
130
if overclass in self.overlay_blacklist:
189
167
def __init__(self, req, exception):
190
168
super(XHTMLUnauthorizedView, self).__init__(req, exception)
192
169
if req.user is None:
193
170
# Not logged in. Redirect to login page.
197
query_string = '?url=' + urllib.quote(req.uri, safe="/~")
198
req.throw_redirect('/+login' + query_string)
171
req.throw_redirect('/') # XXX: Need proper URL.