~azzar1/unity/add-show-desktop-key

93 by mattgiuca
New directory hierarchy.
1
# IVLE - Informatics Virtual Learning Environment
2
# Copyright (C) 2007-2008 The University of Melbourne
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18
# Module: dispatch.html
19
# Author: Matt Giuca
20
# Date: 12/12/2007
21
22
# Provides functions for writing the dispatch-generated HTML header and footer
23
# content (the common parts of the HTML pages shared across the entire site).
24
# Does not include the login page. See login.py.
25
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
26
import cgi
658 by mattgiuca
dispatch/html: Added tooltips based on app descriptions ( to app tabs ).
27
import urllib
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
28
import os.path
29
93 by mattgiuca
New directory hierarchy.
30
import conf
31
import conf.apps
32
from common import util
33
34
def write_html_head(req):
35
    """Writes the HTML header, given a request object.
36
37
    req: An IVLE request object. Reads attributes such as title. Also used to
38
    write to."""
39
40
    # Write the XHTML opening and head element
175 by mattgiuca
dispatch.html: HTML headers for all pages now include a JavaScript
41
    # Note the inline JavaScript, which provides the client with constants
42
    # derived from the server configuration.
93 by mattgiuca
New directory hierarchy.
43
    if req.title != None:
199 by mattgiuca
Added small versions of all the app icons to images. These are used for
44
        titlepart = req.title + ' - '
93 by mattgiuca
New directory hierarchy.
45
    else:
46
        titlepart = ''
47
    req.write("""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
48
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
49
<html xmlns="http://www.w3.org/1999/xhtml">
50
<head>
199 by mattgiuca
Added small versions of all the app icons to images. These are used for
51
  <title>%sIVLE</title>
169 by mattgiuca
Added global common css file (media/common/ivle.css).
52
  <meta http-equiv="Content-Type" content="%s; charset=utf-8" />
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
53
""" % (cgi.escape(titlepart), cgi.escape(req.content_type)))
200 by mattgiuca
fileservice.listing: Now returns a nicer date format for mtime_nice.
54
    # Write inline JavaScript which gives the client code access to certain
55
    # server-side variables.
504 by mattgiuca
Warning: Broken build, but rather unavoidable or this commit will spiral out
56
    if req.user:
57
        username = repr(req.user.login)
200 by mattgiuca
fileservice.listing: Now returns a nicer date format for mtime_nice.
58
    else:
59
        username = "null"
60
    req.write("""  <script type="text/javascript">
61
    root_dir = %s;
728 by dcoles
Browser: Added support for the 'Share this file' button. At the moment it opens
62
    public_host = %s;
200 by mattgiuca
fileservice.listing: Now returns a nicer date format for mtime_nice.
63
    username = %s;
175 by mattgiuca
dispatch.html: HTML headers for all pages now include a JavaScript
64
  </script>
728 by dcoles
Browser: Added support for the 'Share this file' button. At the moment it opens
65
""" % (repr(conf.root_dir), repr(conf.public_host), username))
553 by mattgiuca
Added new app: Settings (UI for userservice).
66
    iconurl = get_icon_url(req.app, small=True)
199 by mattgiuca
Added small versions of all the app icons to images. These are used for
67
    if iconurl:
68
        req.write("""  <link rel="shortcut icon" href="%s" />
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
69
""" % cgi.escape(iconurl))
199 by mattgiuca
Added small versions of all the app icons to images. These are used for
70
    req.write("""  <link rel="stylesheet" type="text/css" href="%s" />
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
71
""" % cgi.escape(util.make_path('media/common/ivle.css')))
169 by mattgiuca
Added global common css file (media/common/ivle.css).
72
73
    # Write any app-specific style and script links
74
    for style in req.styles:
75
        req.write('  <link rel="stylesheet" type="text/css" href="%s" />\n'
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
76
            % cgi.escape(util.make_path(style)))
169 by mattgiuca
Added global common css file (media/common/ivle.css).
77
    for script in req.scripts:
424 by mattgiuca
dispatch.html: Added explicit closing script tag. This presents
78
        req.write('  <script type="text/javascript" src="%s"></script>\n'
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
79
            % cgi.escape(util.make_path(script)))
169 by mattgiuca
Added global common css file (media/common/ivle.css).
80
81
    req.write("</head>\n\n")
93 by mattgiuca
New directory hierarchy.
82
83
    # Open the body element and write a bunch of stuff there (the header)
84
    req.write("""<body>
361 by mattgiuca
dispatch/html , ivle.css: Split header into 3 divs, and used CSS to explicitly
85
<div id="ivleheader"></div>
86
<div id="ivleheader_text">
197 by mattgiuca
dispatch.html, ivle.css: Main IVLE header is now an h1/h2 pair, styled to the
87
  <h1>IVLE</h1>
88
  <h2>Informatics Virtual Learning Environment</h2>
93 by mattgiuca
New directory hierarchy.
89
""")
90
504 by mattgiuca
Warning: Broken build, but rather unavoidable or this commit will spiral out
91
    if req.user:
377 by mattgiuca
dispatch/html: Changed the "welcome line" at the top of the page.
92
        # Get the user's nickname from the request session
504 by mattgiuca
Warning: Broken build, but rather unavoidable or this commit will spiral out
93
        nickname = req.user.nick
605 by mattgiuca
settings.js: Updates the user's nickname in the top bar immediately, to avoid
94
        req.write('  <p class="userhello"><span id="usernick">%s</span> '
95
            '(<span class="username">%s</span>) |\n'
553 by mattgiuca
Added new app: Settings (UI for userservice).
96
            '    <a href="%s">Settings</a> |\n'
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
97
            '    <a href="%s">Help</a> |\n'
553 by mattgiuca
Added new app: Settings (UI for userservice).
98
            '    <a href="%s">Sign out</a>\n'
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
99
            '  </p>\n' %
505 by mattgiuca
dispatch.html, consoleservice, userservice, interpret:
100
            (cgi.escape(nickname), cgi.escape(req.user.login),
553 by mattgiuca
Added new app: Settings (UI for userservice).
101
             cgi.escape(util.make_path('settings')),
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
102
             cgi.escape(get_help_url(req)),
103
             cgi.escape(util.make_path('logout'))))
124 by mattgiuca
dispatch/request: Added new fields: method and username.
104
    else:
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
105
        req.write('  <p class="userhello">Not logged in.</p>')
124 by mattgiuca
dispatch/request: Added new fields: method and username.
106
394 by mattgiuca
Fixed display of the "DebugInfo" warning. Due to the new layout, this was
107
    # ivleheader_tabs is a separate div, so it can be positioned absolutely
108
    req.write('</div>\n<div id="ivleheader_tabs">\n')
109
93 by mattgiuca
New directory hierarchy.
110
    # If the "debuginfo" app is installed, display a warning to the admin to
111
    # make sure it is removed in production.
112
    if "debuginfo" in conf.apps.app_url:
581 by mattgiuca
html.py: Updated warning about disabling debuginfo - the new way to disable it
113
        req.write("  <p><small>Warning: debuginfo is enabled. Set "
114
            "enable_debuginfo = False in lib/conf/apps.py, when placing IVLE "
115
            "into production.</small></p>\n")
93 by mattgiuca
New directory hierarchy.
116
455 by mattgiuca
Login now handles the 3 login states: no_agreement, enabled and disabled.
117
    # If req has a "no_agreement" attribute, then it is because the user has
118
    # not signed the agreement; therefore we are displaying the TOS page.
119
    # Do not show apps (see dispatch.login).
504 by mattgiuca
Warning: Broken build, but rather unavoidable or this commit will spiral out
120
    if req.user and not req.user.state == 'no_agreement':
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
121
        # Only print app tabs if logged in
122
        print_apps_list(req, req.app)
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
123
    req.write('</div>\n<div id="ivlebody">\n')
124
93 by mattgiuca
New directory hierarchy.
125
def write_html_foot(req):
126
    """Writes the HTML footer, given a request object.
127
128
    req: An IVLE request object. Written to.
129
    """
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
130
    req.write("</div>\n</body>\n</html>\n")
93 by mattgiuca
New directory hierarchy.
131
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
132
def get_help_url(req):
133
    """Gets the help URL most relevant to this page, to place as the
134
    "help" link at the top of the page."""
455 by mattgiuca
Login now handles the 3 login states: no_agreement, enabled and disabled.
135
    reqapp = req.app if hasattr(req, 'app') else None
136
    if reqapp == 'help':
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
137
        # We're already in help. Link to the exact current page
138
        # instead of the generic help page.
139
        return req.uri
455 by mattgiuca
Login now handles the 3 login states: no_agreement, enabled and disabled.
140
    if reqapp is not None and conf.apps.app_url[reqapp].hashelp:
141
        help_path = os.path.join('help', reqapp)
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
142
    else:
143
        help_path = 'help'
144
    return util.make_path(help_path)
145
200 by mattgiuca
fileservice.listing: Now returns a nicer date format for mtime_nice.
146
def get_icon_url(appurl, small=False):
147
    """Given an app's url name, gets the URL of the icon image for this app,
199 by mattgiuca
Added small versions of all the app icons to images. These are used for
148
    relative to the site root. Returns None if the app has no icon."""
200 by mattgiuca
fileservice.listing: Now returns a nicer date format for mtime_nice.
149
    if appurl is None: return None
553 by mattgiuca
Added new app: Settings (UI for userservice).
150
    try:
151
        app = conf.apps.app_url[appurl]
152
    except KeyError:
153
        # Due to navigating to a bad app
154
        return None
199 by mattgiuca
Added small versions of all the app icons to images. These are used for
155
    if small:
156
        icon_dir = conf.apps.app_icon_dir_small
157
    else:
158
        icon_dir = conf.apps.app_icon_dir
159
    if app.icon is None: return None
160
    return util.make_path(os.path.join(icon_dir, app.icon))
161
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
162
def print_apps_list(file, thisapp):
93 by mattgiuca
New directory hierarchy.
163
    """Prints all app tabs, as a UL. Prints a list item for each app that has
164
    a tab.
165
166
    file: Object with a "write" method - ie. the request object.
167
    Reads from: conf
168
    """
208 by mattgiuca
dispatch.html, ivle.css: "apptabs" is now an ID, not a class.
169
    file.write('  <ul id="apptabs">\n')
93 by mattgiuca
New directory hierarchy.
170
171
    for urlname in conf.apps.apps_in_tabs:
172
        app = conf.apps.app_url[urlname]
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
173
        if urlname == thisapp:
174
            li_attr = ' class="thisapp"'
175
        else:
176
            li_attr = ''
196 by mattgiuca
Added application icons, displayed in the tabs at the top of the IVLE page.
177
        file.write('    <li%s>' % li_attr)
178
        if app.icon:
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
179
            file.write('<img src="%s" alt="" /> '
658 by mattgiuca
dispatch/html: Added tooltips based on app descriptions ( to app tabs ).
180
                % urllib.quote(get_icon_url(urlname)))
181
        file.write('<a href="%s" title="%s">%s</a></li>\n'
182
            % (urllib.quote(util.make_path(urlname)), cgi.escape(app.desc),
183
                cgi.escape(app.name)))
93 by mattgiuca
New directory hierarchy.
184
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
185
    file.write('  </ul>\n')