~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.
504 by mattgiuca
Warning: Broken build, but rather unavoidable or this commit will spiral out
55
    if req.user:
56
        username = repr(req.user.login)
200 by mattgiuca
fileservice.listing: Now returns a nicer date format for mtime_nice.
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))
553 by mattgiuca
Added new app: Settings (UI for userservice).
64
    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
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
504 by mattgiuca
Warning: Broken build, but rather unavoidable or this commit will spiral out
89
    if req.user:
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
504 by mattgiuca
Warning: Broken build, but rather unavoidable or this commit will spiral out
91
        nickname = req.user.nick
377 by mattgiuca
dispatch/html: Changed the "welcome line" at the top of the page.
92
        req.write('  <p class="userhello">%s (<span '
93
            'class="username">%s</span>) |\n'
553 by mattgiuca
Added new app: Settings (UI for userservice).
94
            '    <a href="%s">Settings</a> |\n'
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
95
            '    <a href="%s">Help</a> |\n'
553 by mattgiuca
Added new app: Settings (UI for userservice).
96
            '    <a href="%s">Sign out</a>\n'
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
97
            '  </p>\n' %
505 by mattgiuca
dispatch.html, consoleservice, userservice, interpret:
98
            (cgi.escape(nickname), cgi.escape(req.user.login),
553 by mattgiuca
Added new app: Settings (UI for userservice).
99
             cgi.escape(util.make_path('settings')),
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
100
             cgi.escape(get_help_url(req)),
101
             cgi.escape(util.make_path('logout'))))
124 by mattgiuca
dispatch/request: Added new fields: method and username.
102
    else:
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
103
        req.write('  <p class="userhello">Not logged in.</p>')
124 by mattgiuca
dispatch/request: Added new fields: method and username.
104
394 by mattgiuca
Fixed display of the "DebugInfo" warning. Due to the new layout, this was
105
    # ivleheader_tabs is a separate div, so it can be positioned absolutely
106
    req.write('</div>\n<div id="ivleheader_tabs">\n')
107
93 by mattgiuca
New directory hierarchy.
108
    # If the "debuginfo" app is installed, display a warning to the admin to
109
    # make sure it is removed in production.
110
    if "debuginfo" in conf.apps.app_url:
581 by mattgiuca
html.py: Updated warning about disabling debuginfo - the new way to disable it
111
        req.write("  <p><small>Warning: debuginfo is enabled. Set "
112
            "enable_debuginfo = False in lib/conf/apps.py, when placing IVLE "
113
            "into production.</small></p>\n")
93 by mattgiuca
New directory hierarchy.
114
455 by mattgiuca
Login now handles the 3 login states: no_agreement, enabled and disabled.
115
    # If req has a "no_agreement" attribute, then it is because the user has
116
    # not signed the agreement; therefore we are displaying the TOS page.
117
    # Do not show apps (see dispatch.login).
504 by mattgiuca
Warning: Broken build, but rather unavoidable or this commit will spiral out
118
    if req.user and not req.user.state == 'no_agreement':
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
119
        # Only print app tabs if logged in
120
        print_apps_list(req, req.app)
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
121
    req.write('</div>\n<div id="ivlebody">\n')
122
93 by mattgiuca
New directory hierarchy.
123
def write_html_foot(req):
124
    """Writes the HTML footer, given a request object.
125
126
    req: An IVLE request object. Written to.
127
    """
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
128
    req.write("</div>\n</body>\n</html>\n")
93 by mattgiuca
New directory hierarchy.
129
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
130
def get_help_url(req):
131
    """Gets the help URL most relevant to this page, to place as the
132
    "help" link at the top of the page."""
455 by mattgiuca
Login now handles the 3 login states: no_agreement, enabled and disabled.
133
    reqapp = req.app if hasattr(req, 'app') else None
134
    if reqapp == 'help':
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
135
        # We're already in help. Link to the exact current page
136
        # instead of the generic help page.
137
        return req.uri
455 by mattgiuca
Login now handles the 3 login states: no_agreement, enabled and disabled.
138
    if reqapp is not None and conf.apps.app_url[reqapp].hashelp:
139
        help_path = os.path.join('help', reqapp)
192 by mattgiuca
dispatch.html: Only prints tabs if logged in.
140
    else:
141
        help_path = 'help'
142
    return util.make_path(help_path)
143
200 by mattgiuca
fileservice.listing: Now returns a nicer date format for mtime_nice.
144
def get_icon_url(appurl, small=False):
145
    """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
146
    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.
147
    if appurl is None: return None
553 by mattgiuca
Added new app: Settings (UI for userservice).
148
    try:
149
        app = conf.apps.app_url[appurl]
150
    except KeyError:
151
        # Due to navigating to a bad app
152
        return None
199 by mattgiuca
Added small versions of all the app icons to images. These are used for
153
    if small:
154
        icon_dir = conf.apps.app_icon_dir_small
155
    else:
156
        icon_dir = conf.apps.app_icon_dir
157
    if app.icon is None: return None
158
    return util.make_path(os.path.join(icon_dir, app.icon))
159
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
160
def print_apps_list(file, thisapp):
93 by mattgiuca
New directory hierarchy.
161
    """Prints all app tabs, as a UL. Prints a list item for each app that has
162
    a tab.
163
164
    file: Object with a "write" method - ie. the request object.
165
    Reads from: conf
166
    """
208 by mattgiuca
dispatch.html, ivle.css: "apptabs" is now an ID, not a class.
167
    file.write('  <ul id="apptabs">\n')
93 by mattgiuca
New directory hierarchy.
168
169
    for urlname in conf.apps.apps_in_tabs:
170
        app = conf.apps.app_url[urlname]
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
171
        if urlname == thisapp:
172
            li_attr = ' class="thisapp"'
173
        else:
174
            li_attr = ''
196 by mattgiuca
Added application icons, displayed in the tabs at the top of the IVLE page.
175
        file.write('    <li%s>' % li_attr)
176
        if app.icon:
303 by mattgiuca
dispatch/html: Do a CGI escape on all text being rendered into the HTML.
177
            file.write('<img src="%s" alt="" /> '
178
                % cgi.escape(get_icon_url(urlname)))
196 by mattgiuca
Added application icons, displayed in the tabs at the top of the IVLE page.
179
        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.
180
            % (cgi.escape(util.make_path(urlname)), cgi.escape(app.name)))
93 by mattgiuca
New directory hierarchy.
181
191 by mattgiuca
dispatch.html, ivle.css, browser.css: Major restyling of the IVLE website.
182
    file.write('  </ul>\n')