39
40
# Note the inline JavaScript, which provides the client with constants
40
41
# derived from the server configuration.
41
42
if req.title != None:
42
titlepart = ' - ' + req.title
43
titlepart = req.title + ' - '
45
46
req.write("""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
46
47
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
47
48
<html xmlns="http://www.w3.org/1999/xhtml">
50
51
<meta http-equiv="Content-Type" content="%s; charset=utf-8" />
51
<script type="text/javascript">
52
""" % (cgi.escape(titlepart), cgi.escape(req.content_type)))
53
# Write inline JavaScript which gives the client code access to certain
54
# server-side variables.
56
username = repr(req.username)
59
req.write(""" <script type="text/javascript">
54
<link rel="stylesheet" type="text/css" href="%s" />
55
""" % (titlepart, req.content_type,
56
repr(conf.root_dir)[1:-1],
57
util.make_path('media/common/ivle.css')))
63
""" % (repr(conf.root_dir), username))
64
iconurl = get_icon_url(req.app)
66
req.write(""" <link rel="shortcut icon" href="%s" />
67
""" % cgi.escape(iconurl))
68
req.write(""" <link rel="stylesheet" type="text/css" href="%s" />
69
""" % cgi.escape(util.make_path('media/common/ivle.css')))
59
71
# Write any app-specific style and script links
60
72
for style in req.styles:
61
73
req.write(' <link rel="stylesheet" type="text/css" href="%s" />\n'
62
% util.make_path(style))
74
% cgi.escape(util.make_path(style)))
63
75
for script in req.scripts:
64
req.write(' <script type="text/javascript" src="%s" />\n'
65
% util.make_path(script))
76
req.write(' <script type="text/javascript" src="%s"></script>\n'
77
% cgi.escape(util.make_path(script)))
67
79
req.write("</head>\n\n")
69
81
# Open the body element and write a bunch of stuff there (the header)
70
82
req.write("""<body>
72
<h1>IVLE - Informatics Virtual Learning Environment</h1>
83
<div id="ivleheader"></div>
84
<div id="ivleheader_text">
86
<h2>Informatics Virtual Learning Environment</h2>
76
req.write(' <p class="userhello">Welcome, <span '
77
'class="username">%s</span> |\n'
90
# Get the user's nickname from the request session
91
nickname = req.get_session()['nick']
92
req.write(' <p class="userhello">%s (<span '
93
'class="username">%s</span>) |\n'
78
94
' <a href="%s">Help</a> |\n'
79
95
' <a href="%s">Logout</a>\n'
81
(req.username, get_help_url(req), util.make_path('logout')))
97
(cgi.escape(nickname), cgi.escape(req.username),
98
cgi.escape(get_help_url(req)),
99
cgi.escape(util.make_path('logout'))))
83
101
req.write(' <p class="userhello">Not logged in.</p>')
103
# ivleheader_tabs is a separate div, so it can be positioned absolutely
104
req.write('</div>\n<div id="ivleheader_tabs">\n')
85
106
# If the "debuginfo" app is installed, display a warning to the admin to
86
107
# make sure it is removed in production.
87
108
if "debuginfo" in conf.apps.app_url:
114
135
help_path = 'help'
115
136
return util.make_path(help_path)
138
def get_icon_url(appurl, small=False):
139
"""Given an app's url name, gets the URL of the icon image for this app,
140
relative to the site root. Returns None if the app has no icon."""
141
if appurl is None: return None
142
app = conf.apps.app_url[appurl]
144
icon_dir = conf.apps.app_icon_dir_small
146
icon_dir = conf.apps.app_icon_dir
147
if app.icon is None: return None
148
return util.make_path(os.path.join(icon_dir, app.icon))
117
150
def print_apps_list(file, thisapp):
118
151
"""Prints all app tabs, as a UL. Prints a list item for each app that has
129
162
li_attr = ' class="thisapp"'
132
file.write(' <li%s><a href="%s">%s</a></li>\n'
133
% (li_attr, util.make_path(urlname), app.name))
165
file.write(' <li%s>' % li_attr)
167
file.write('<img src="%s" alt="" /> '
168
% cgi.escape(get_icon_url(urlname)))
169
file.write('<a href="%s">%s</a></li>\n'
170
% (cgi.escape(util.make_path(urlname)), cgi.escape(app.name)))
135
172
file.write(' </ul>\n')