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

« back to all changes in this revision

Viewing changes to ivle/webapp/base/xhtml.py

  • Committer: William Grant
  • Date: 2009-02-17 03:24:50 UTC
  • mto: (1099.1.143 new-dispatch)
  • mto: This revision was merged to the branch mainline in revision 1100.
  • Revision ID: grantw@unimelb.edu.au-20090217032450-r7z6k1k5i9urexe8
Support downloading of a selection of files as a zip.
Again.

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
import genshi.template
25
25
 
26
26
from ivle.webapp.media import media_url
27
 
from ivle.webapp.core import Plugin as CorePlugin
28
27
from ivle.webapp.base.views import BaseView
29
28
from ivle.webapp.base.plugins import ViewPlugin, OverlayPlugin
30
29
from ivle.webapp.errors import HTTPError, Unauthorized
31
 
from ivle.webapp.publisher import NoPath
32
 
from ivle.webapp.breadcrumbs import Breadcrumber
 
30
import ivle.conf
 
31
import ivle.util
33
32
 
34
33
class XHTMLView(BaseView):
35
34
    """
39
38
    """
40
39
 
41
40
    template = 'template.html'
 
41
    plugin_scripts = {}
 
42
    plugin_styles = {}
42
43
    allow_overlays = True
43
 
    breadcrumb_text = None
44
 
 
45
 
    def __init__(self, *args, **kwargs):
46
 
        super(XHTMLView, self).__init__(*args, **kwargs)
47
 
 
48
 
        self.overlay_blacklist = []
49
 
 
50
 
        self.plugin_scripts = {}
51
 
        self.plugin_styles = {}
52
 
        self.scripts_init = []
53
 
 
54
 
        self.extra_breadcrumbs = []
55
 
        self.overlay_blacklist = []
56
 
 
57
 
    def get_context_ancestry(self, req):
58
 
        return req.publisher.get_ancestors(self.context)
59
 
 
60
 
    def filter(self, stream, ctx):
61
 
        return stream
 
44
    overlay_blacklist = []
 
45
 
 
46
    def __init__(self, req, **kwargs):
 
47
        for key in kwargs:
 
48
            setattr(self, key, kwargs[key])
62
49
 
63
50
    def render(self, req):
64
51
        req.content_type = 'text/html' # TODO: Detect application/xhtml+xml
71
58
        # view.
72
59
        app_template = os.path.join(os.path.dirname(
73
60
                        inspect.getmodule(self).__file__), self.template) 
 
61
        req.write_html_head_foot = False
74
62
        loader = genshi.template.TemplateLoader(".", auto_reload=True)
75
63
        tmpl = loader.load(app_template)
76
 
        app = self.filter(tmpl.generate(viewctx), viewctx)
 
64
        app = tmpl.generate(viewctx)
77
65
 
78
 
        view_scripts = []
79
66
        for plugin in self.plugin_scripts:
80
67
            for path in self.plugin_scripts[plugin]:
81
 
                view_scripts.append(media_url(req, plugin, path))
 
68
                req.scripts.append(media_url(req, plugin, path))
82
69
 
83
 
        view_styles = []
84
70
        for plugin in self.plugin_styles:
85
71
            for path in self.plugin_styles[plugin]:
86
 
                view_styles.append(media_url(req, plugin, path))
 
72
                req.styles.append(media_url(req, plugin, path))
87
73
 
88
74
        # Global template
89
75
        ctx = genshi.template.Context()
90
 
 
91
 
        overlay_bits = self.render_overlays(req) if req.user else [[]]*4
92
 
        ctx['overlays'] = overlay_bits[0]
93
 
 
94
 
        ctx['styles'] = [media_url(req, CorePlugin, 'ivle.css')]
95
 
        ctx['styles'] += view_styles
96
 
        ctx['styles'] += overlay_bits[1]
97
 
 
98
 
        ctx['scripts'] = [media_url(req, CorePlugin, path) for path in
99
 
                           ('util.js', 'json2.js', 'md5.js')]
100
 
        ctx['scripts'].append(media_url(req, '+external/jquery', 'jquery.js'))
101
 
        ctx['scripts'] += view_scripts
102
 
        ctx['scripts'] += overlay_bits[2]
103
 
 
104
 
        ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
 
76
        # XXX: Leave this here!! (Before req.styles is read)
 
77
        ctx['overlays'] = self.render_overlays(req)
 
78
        ctx['app_styles'] = req.styles
 
79
        ctx['scripts'] = req.scripts
 
80
        ctx['scripts_init'] = req.scripts_init
105
81
        ctx['app_template'] = app
106
 
        ctx['title_img'] = media_url(req, CorePlugin,
107
 
                                     "images/chrome/root-breadcrumb.png")
108
 
        try:
109
 
            ancestry = self.get_context_ancestry(req)
110
 
        except NoPath:
111
 
            ancestry = []
112
 
 
113
 
        crumber = Breadcrumber(req)
114
 
 
115
 
        ctx['breadcrumbs'] = []
116
 
        for ancestor in ancestry:
117
 
            crumb = crumber.crumb(ancestor)
118
 
            if crumb is None:
119
 
                continue
120
 
 
121
 
            if hasattr(crumb, 'extra_breadcrumbs_before'):
122
 
                ctx['breadcrumbs'].extend(crumb.extra_breadcrumbs_before)
123
 
            ctx['breadcrumbs'].append(crumb)
124
 
            if hasattr(crumb, 'extra_breadcrumbs_after'):
125
 
                ctx['breadcrumbs'].extend(crumb.extra_breadcrumbs_after)
126
 
 
127
 
        # If the view has specified text for a breadcrumb, add one.
128
 
        if self.breadcrumb_text:
129
 
            ctx['breadcrumbs'].append(ViewBreadcrumb(req, self))
130
 
 
131
 
        # Allow the view to add its own fake breadcrumbs.
132
 
        ctx['breadcrumbs'].extend(self.extra_breadcrumbs)
133
 
 
134
82
        self.populate_headings(req, ctx)
135
83
        tmpl = loader.load(os.path.join(os.path.dirname(__file__), 
136
84
                                                        'ivle-headings.html'))
141
89
 
142
90
    def populate_headings(self, req, ctx):
143
91
        ctx['favicon'] = None
144
 
        ctx['root_dir'] = req.config['urls']['root']
145
 
        ctx['public_host'] = req.config['urls']['public_host']
146
 
        ctx['svn_base'] = req.config['urls']['svn_addr']
 
92
        ctx['root_dir'] = ivle.conf.root_dir
 
93
        ctx['public_host'] = ivle.conf.public_host
147
94
        ctx['write_javascript_settings'] = req.write_javascript_settings
148
95
        if req.user:
149
96
            ctx['login'] = req.user.login
157
104
            ctx['help_path'] = self.help
158
105
 
159
106
        ctx['apps_in_tabs'] = []
160
 
        for plugin in req.config.plugin_index[ViewPlugin]:
 
107
        for plugin in req.plugin_index[ViewPlugin]:
161
108
            if not hasattr(plugin, 'tabs'):
162
109
                continue
163
110
 
164
111
            for tab in plugin.tabs:
165
 
                # tab is a tuple: name, title, desc, icon, path, weight, admin
166
 
                # (Admin is optional, defaults to false)
 
112
                # tab is a tuple: name, title, desc, icon, path
167
113
                new_app = {}
168
 
                new_app['this_app'] = hasattr(self, 'tab') \
169
 
                                      and tab[0] == self.tab
 
114
                new_app['this_app'] = hasattr(self, 'appname') \
 
115
                                      and tab[0] == self.appname
170
116
 
171
117
                # Icon name
172
118
                if tab[3] is not None:
177
123
                        ctx['favicon'] = icon_url
178
124
                else:
179
125
                    new_app['has_icon'] = False
180
 
                # The following check is here, so it is AFTER setting the
181
 
                # icon, but BEFORE actually installing the tab in the menu
182
 
                if len(tab) > 6 and tab[6]:
183
 
                    # Admin-only tab
184
 
                    if not (req.user and req.user.admin):
185
 
                        break
186
 
                new_app['path'] = req.make_path(tab[4])
 
126
                new_app['path'] = ivle.util.make_path(tab[4])
187
127
                new_app['desc'] = tab[2]
188
128
                new_app['name'] = tab[1]
189
129
                new_app['weight'] = tab[5]
198
138
        scripts_init.
199
139
        """
200
140
        overlays = []
201
 
        styles = []
202
 
        scripts = []
203
 
        scripts_init = []
204
141
        if not self.allow_overlays:
205
 
            return (overlays, styles, scripts, scripts_init)
 
142
            return overlays
206
143
 
207
 
        for plugin in req.config.plugin_index[OverlayPlugin]:
 
144
        for plugin in req.plugin_index[OverlayPlugin]:
208
145
            for overclass in plugin.overlays:
209
146
                if overclass in self.overlay_blacklist:
210
147
                    continue
212
149
                #TODO: Re-factor this to look nicer
213
150
                for mplugin in overlay.plugin_scripts:
214
151
                    for path in overlay.plugin_scripts[mplugin]:
215
 
                        scripts.append(media_url(req, mplugin, path))
 
152
                        req.scripts.append(media_url(req, mplugin, path))
216
153
 
217
154
                for mplugin in overlay.plugin_styles:
218
155
                    for path in overlay.plugin_styles[mplugin]:
219
 
                        styles.append(media_url(req, mplugin, path))
 
156
                        req.styles.append(media_url(req, mplugin, path))
220
157
 
221
 
                scripts_init += overlay.plugin_scripts_init
 
158
                req.scripts_init += overlay.plugin_scripts_init
222
159
 
223
160
                overlays.append(overlay.render(req))
224
 
        return (overlays, styles, scripts, scripts_init)
 
161
        return overlays
225
162
 
226
163
    @classmethod
227
164
    def get_error_view(cls, e):
234
171
class XHTMLErrorView(XHTMLView):
235
172
    template = 'xhtmlerror.html'
236
173
 
237
 
    def __init__(self, req, context, lastobj):
238
 
        super(XHTMLErrorView, self).__init__(req, context)
239
 
        self.lastobj = lastobj
240
 
 
241
 
    def get_context_ancestry(self, req):
242
 
        return req.publisher.get_ancestors(self.lastobj)
 
174
    def __init__(self, req, exception):
 
175
        self.context = exception
243
176
 
244
177
    def populate(self, req, ctx):
245
 
        ctx['req'] = req
246
178
        ctx['exception'] = self.context
247
179
 
248
180
class XHTMLUnauthorizedView(XHTMLErrorView):
249
181
    template = 'xhtmlunauthorized.html'
250
182
 
251
 
    def __init__(self, req, exception, lastobj):
252
 
        super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
 
183
    def __init__(self, req, exception):
 
184
        super(XHTMLUnauthorizedView, self).__init__(req, exception)
253
185
 
254
 
        if not req.publicmode and req.user is None:
 
186
        if req.user is None:
255
187
            # Not logged in. Redirect to login page.
256
 
            if req.uri == '/':
257
 
                query_string = ''
258
 
            else:
259
 
                query_string = '?url=' + urllib.quote(req.uri, safe="/~")
260
 
            req.throw_redirect('/+login' + query_string)
 
188
            req.throw_redirect('/+login?' + 
 
189
                               urllib.urlencode([('url', req.uri)]))
261
190
 
262
191
        req.status = 403
263
 
 
264
 
class ViewBreadcrumb(object):
265
 
    def __init__(self, req, context):
266
 
        self.req = req
267
 
        self.context = context
268
 
 
269
 
    @property
270
 
    def text(self):
271
 
        return self.context.breadcrumb_text