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
ctx['title_img'] = media_url(req, CorePlugin,
89
"images/chrome/title.png")
90
80
self.populate_headings(req, ctx)
91
81
tmpl = loader.load(os.path.join(os.path.dirname(__file__),
92
82
'ivle-headings.html'))
108
98
ctx['login'] = None
109
99
ctx['logged_in'] = False
110
100
ctx['publicmode'] = req.publicmode
111
if hasattr(self, 'help'):
112
ctx['help_path'] = self.help
114
101
ctx['apps_in_tabs'] = []
115
for plugin in req.config.plugin_index[ViewPlugin]:
116
if not hasattr(plugin, 'tabs'):
119
for tab in plugin.tabs:
120
# tab is a tuple: name, title, desc, icon, path
122
new_app['this_app'] = hasattr(self, 'tab') \
123
and tab[0] == self.tab
126
if tab[3] is not None:
127
new_app['has_icon'] = True
128
icon_url = media_url(req, plugin, tab[3])
129
new_app['icon_url'] = icon_url
130
if new_app['this_app']:
131
ctx['favicon'] = icon_url
133
new_app['has_icon'] = False
134
new_app['path'] = ivle.util.make_path(tab[4])
135
new_app['desc'] = tab[2]
136
new_app['name'] = tab[1]
137
new_app['weight'] = tab[5]
138
ctx['apps_in_tabs'].append(new_app)
140
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)
142
121
def render_overlays(self, req):
143
122
"""Generate XML streams for the overlays.
149
if not self.allow_overlays:
152
for plugin in req.config.plugin_index[OverlayPlugin]:
128
for plugin in req.plugin_index[OverlayPlugin]:
153
129
for overclass in plugin.overlays:
154
130
if overclass in self.overlay_blacklist:
191
167
def __init__(self, req, exception):
192
168
super(XHTMLUnauthorizedView, self).__init__(req, exception)
194
169
if req.user is None:
195
170
# Not logged in. Redirect to login page.
199
query_string = '?url=' + urllib.quote(req.uri, safe="/~")
200
req.throw_redirect('/+login' + query_string)
171
req.throw_redirect('/') # XXX: Need proper URL.