~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
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
27
import os.path
28
93 by mattgiuca
New directory hierarchy.
29
import conf
30
import conf.apps
31
from common import util
32
33
def write_html_head(req):
34
    """Writes the HTML header, given a request object.
35
36
    req: An IVLE request object. Reads attributes such as title. Also used to
37
    write to."""
38
39
    # Write the XHTML opening and head element
175 by mattgiuca
dispatch.html: HTML headers for all pages now include a JavaScript
40
    # Note the inline JavaScript, which provides the client with constants
41
    # derived from the server configuration.
93 by mattgiuca
New directory hierarchy.
42
    if req.title != None:
199 by mattgiuca
Added small versions of all the app icons to images. These are used for
43
        titlepart = req.title + ' - '
93 by mattgiuca
New directory hierarchy.
44
    else:
45
        titlepart = ''
46
    req.write("""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
47
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
48
<html xmlns="http://www.w3.org/1999/xhtml">
49
<head>
199 by mattgiuca
Added small versions of all the app icons to images. These are used for
50
  <title>%sIVLE</title>
169 by mattgiuca
Added global common css file (media/common/ivle.css).
51
  <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.
52
""" % (cgi.escape(titlepart), cgi.escape(req.content_type)))
200 by mattgiuca
fileservice.listing: Now returns a nicer date format for mtime_nice.
53
    # Write inline JavaScript which gives the client code access to certain
54
    # server-side variables.
55
    if req.username:
56
        username = repr(req.username)
57
    else:
58
        username = "null"
59
    req.write("""  <script type="text/javascript">
60
    root_dir = %s;
61
    username = %s;
175 by mattgiuca
dispatch.html: HTML headers for all pages now include a JavaScript
62
  </script>
200 by mattgiuca
fileservice.listing: Now returns a nicer date format for mtime_nice.
63
""" % (repr(conf.root_dir), username))
64
    iconurl = get_icon_url(req.app)
199 by mattgiuca
Added small versions of all the app icons to images. These are used for
65
    if iconurl:
66
        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.
67
""" % cgi.escape(iconurl))
199 by mattgiuca
Added small versions of all the app icons to images. These are used for
68
    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.
69
""" % cgi.escape(util.make_path('media/common/ivle.css')))
169 by mattgiuca
Added global common css file (media/common/ivle.css).
70
71
    # Write any app-specific style and script links
72
    for style in req.styles:
73
        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.
74
            % cgi.escape(util.make_path(style)))
169 by mattgiuca
Added global common css file (media/common/ivle.css).
75
    for script in req.scripts:
424 by mattgiuca
dispatch.html: Added explicit closing script tag. This presents
76
        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.
77
            % cgi.escape(util.make_path(script)))
169 by mattgiuca
Added global common css file (media/common/ivle.css).
78
79
    req.write("</head>\n\n")
93 by mattgiuca
New directory hierarchy.
80
81
    # Open the body element and write a bunch of stuff there (the header)
82
    req.write("""<body>
361 by mattgiuca
dispatch/html , ivle.css: Split header into 3 divs, and used CSS to explicitly
83
<div id="ivleheader"></div>
84
<div id="ivleheader_text">
197 by mattgiuca
dispatch.html, ivle.css: Main IVLE header is now an h1/h2 pair, styled to the
85
  <h1>IVLE</h1>
86
  <h2>Informatics Virtual Learning Environment</h2>
93 by mattgiuca
New directory hierarchy.
87
""")
88
124 by mattgiuca
dispatch/request: Added new fields: method and username.
89
    if req.username:
377 by mattgiuca
dispatch/html: Changed the "welcome line" at the top of the page.
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'
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
94
            '    <a href="%s">Help</a> |\n'
95
            '    <a href="%s">Logout</a>\n'
96
            '  </p>\n' %
377 by mattgiuca
dispatch/html: Changed the "welcome line" at the top of the page.
97
            (cgi.escape(nickname), cgi.escape(req.username),
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
98
             cgi.escape(get_help_url(req)),
99
             cgi.escape(util.make_path('logout'))))
124 by mattgiuca
dispatch/request: Added new fields: method and username.
100
    else:
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
101
        req.write('  <p class="userhello">Not logged in.</p>')
124 by mattgiuca
dispatch/request: Added new fields: method and username.
102
394 by mattgiuca
Fixed display of the "DebugInfo" warning. Due to the new layout, this was
103
    # ivleheader_tabs is a separate div, so it can be positioned absolutely
104
    req.write('</div>\n<div id="ivleheader_tabs">\n')
105
93 by mattgiuca
New directory hierarchy.
106
    # If the "debuginfo" app is installed, display a warning to the admin to
107
    # make sure it is removed in production.
108
    if "debuginfo" in conf.apps.app_url:
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
109
        req.write("  <p><small>Warning: debuginfo is enabled. Remove this "
110
            "app from conf.apps.app_url when placed into production."
186 by mattgiuca
Added a bit of "chrome" (some CSS styling and minor touching up of the HTML).
111
            "</small></p>\n")
93 by mattgiuca
New directory hierarchy.
112
455 by mattgiuca
Login now handles the 3 login states: no_agreement, enabled and disabled.
113
    # If req has a "no_agreement" attribute, then it is because the user has
114
    # not signed the agreement; therefore we are displaying the TOS page.
115
    # Do not show apps (see dispatch.login).
116
    if req.username and not hasattr(req, 'no_agreement'):
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
117
        # Only print app tabs if logged in
118
        print_apps_list(req, req.app)
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
119
    req.write('</div>\n<div id="ivlebody">\n')
120
93 by mattgiuca
New directory hierarchy.
121
def write_html_foot(req):
122
    """Writes the HTML footer, given a request object.
123
124
    req: An IVLE request object. Written to.
125
    """
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
126
    req.write("</div>\n</body>\n</html>\n")
93 by mattgiuca
New directory hierarchy.
127
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
128
def get_help_url(req):
129
    """Gets the help URL most relevant to this page, to place as the
130
    "help" link at the top of the page."""
455 by mattgiuca
Login now handles the 3 login states: no_agreement, enabled and disabled.
131
    reqapp = req.app if hasattr(req, 'app') else None
132
    if reqapp == 'help':
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
133
        # We're already in help. Link to the exact current page
134
        # instead of the generic help page.
135
        return req.uri
455 by mattgiuca
Login now handles the 3 login states: no_agreement, enabled and disabled.
136
    if reqapp is not None and conf.apps.app_url[reqapp].hashelp:
137
        help_path = os.path.join('help', reqapp)
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
138
    else:
139
        help_path = 'help'
140
    return util.make_path(help_path)
141
200 by mattgiuca
fileservice.listing: Now returns a nicer date format for mtime_nice.
142
def get_icon_url(appurl, small=False):
143
    """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
144
    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.
145
    if appurl is None: return None
146
    app = conf.apps.app_url[appurl]
199 by mattgiuca
Added small versions of all the app icons to images. These are used for
147
    if small:
148
        icon_dir = conf.apps.app_icon_dir_small
149
    else:
150
        icon_dir = conf.apps.app_icon_dir
151
    if app.icon is None: return None
152
    return util.make_path(os.path.join(icon_dir, app.icon))
153
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
154
def print_apps_list(file, thisapp):
93 by mattgiuca
New directory hierarchy.
155
    """Prints all app tabs, as a UL. Prints a list item for each app that has
156
    a tab.
157
158
    file: Object with a "write" method - ie. the request object.
159
    Reads from: conf
160
    """
208 by mattgiuca
dispatch.html, ivle.css: "apptabs" is now an ID, not a class.
161
    file.write('  <ul id="apptabs">\n')
93 by mattgiuca
New directory hierarchy.
162
163
    for urlname in conf.apps.apps_in_tabs:
164
        app = conf.apps.app_url[urlname]
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
165
        if urlname == thisapp:
166
            li_attr = ' class="thisapp"'
167
        else:
168
            li_attr = ''
196 by mattgiuca
Added application icons, displayed in the tabs at the top of the IVLE page.
169
        file.write('    <li%s>' % li_attr)
170
        if app.icon:
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
171
            file.write('<img src="%s" alt="" /> '
172
                % cgi.escape(get_icon_url(urlname)))
196 by mattgiuca
Added application icons, displayed in the tabs at the top of the IVLE page.
173
        file.write('<a href="%s">%s</a></li>\n'
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
174
            % (cgi.escape(util.make_path(urlname)), cgi.escape(app.name)))
93 by mattgiuca
New directory hierarchy.
175
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
176
    file.write('  </ul>\n')