~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-25 00:08:47 UTC
  • Revision ID: grantw@unimelb.edu.au-20090225000847-gx39z28kucstntoi
Worksheet.worksheet_exercises now only contains active ones.

Use Worksheet.all_worksheet_exercises to get inactive too.

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
from ivle.webapp.base.views import BaseView
29
29
from ivle.webapp.base.plugins import ViewPlugin, OverlayPlugin
30
30
from ivle.webapp.errors import HTTPError, Unauthorized
31
 
from ivle.webapp.publisher import NoPath
32
 
from ivle.webapp.breadcrumbs import Breadcrumber
 
31
import ivle.conf
 
32
import ivle.util
33
33
 
34
34
class XHTMLView(BaseView):
35
35
    """
39
39
    """
40
40
 
41
41
    template = 'template.html'
 
42
    plugin_scripts = {}
 
43
    plugin_styles = {}
42
44
    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
 
45
    overlay_blacklist = []
 
46
 
 
47
    def __init__(self, req, **kwargs):
 
48
        for key in kwargs:
 
49
            setattr(self, key, kwargs[key])
62
50
 
63
51
    def render(self, req):
64
52
        req.content_type = 'text/html' # TODO: Detect application/xhtml+xml
73
61
                        inspect.getmodule(self).__file__), self.template) 
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]
 
76
        # XXX: Leave this here!! (Before req.styles is read)
 
77
        ctx['overlays'] = self.render_overlays(req) if req.user else []
93
78
 
94
79
        ctx['styles'] = [media_url(req, CorePlugin, 'ivle.css')]
95
 
        ctx['styles'] += view_styles
96
 
        ctx['styles'] += overlay_bits[1]
 
80
        ctx['styles'] += req.styles
97
81
 
98
82
        ctx['scripts'] = [media_url(req, CorePlugin, path) for path in
99
83
                           ('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]
 
84
        ctx['scripts'] += req.scripts
103
85
 
104
 
        ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
 
86
        ctx['scripts_init'] = req.scripts_init
105
87
        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
 
        if not req.publicmode:
117
 
            for ancestor in ancestry:
118
 
                crumb = crumber.crumb(ancestor)
119
 
                if crumb is None:
120
 
                    continue
121
 
 
122
 
                if hasattr(crumb, 'extra_breadcrumbs_before'):
123
 
                    ctx['breadcrumbs'].extend(crumb.extra_breadcrumbs_before)
124
 
                ctx['breadcrumbs'].append(crumb)
125
 
                if hasattr(crumb, 'extra_breadcrumbs_after'):
126
 
                    ctx['breadcrumbs'].extend(crumb.extra_breadcrumbs_after)
127
 
 
128
 
            # If the view has specified text for a breadcrumb, add one.
129
 
            if self.breadcrumb_text:
130
 
                ctx['breadcrumbs'].append(ViewBreadcrumb(req, self))
131
 
 
132
 
            # Allow the view to add its own fake breadcrumbs.
133
 
            ctx['breadcrumbs'].extend(self.extra_breadcrumbs)
134
 
 
135
88
        self.populate_headings(req, ctx)
136
89
        tmpl = loader.load(os.path.join(os.path.dirname(__file__), 
137
90
                                                        'ivle-headings.html'))
142
95
 
143
96
    def populate_headings(self, req, ctx):
144
97
        ctx['favicon'] = None
145
 
        ctx['root_dir'] = req.config['urls']['root']
146
 
        ctx['public_host'] = req.config['urls']['public_host']
147
 
        ctx['svn_base'] = req.config['urls']['svn_addr']
 
98
        ctx['root_dir'] = ivle.conf.root_dir
 
99
        ctx['public_host'] = ivle.conf.public_host
148
100
        ctx['write_javascript_settings'] = req.write_javascript_settings
149
101
        if req.user:
150
102
            ctx['login'] = req.user.login
163
115
                continue
164
116
 
165
117
            for tab in plugin.tabs:
166
 
                # tab is a tuple: name, title, desc, icon, path, weight, admin
167
 
                # (Admin is optional, defaults to false)
 
118
                # tab is a tuple: name, title, desc, icon, path
168
119
                new_app = {}
169
 
                new_app['this_app'] = hasattr(self, 'tab') \
170
 
                                      and tab[0] == self.tab
 
120
                new_app['this_app'] = hasattr(self, 'appname') \
 
121
                                      and tab[0] == self.appname
171
122
 
172
123
                # Icon name
173
124
                if tab[3] is not None:
178
129
                        ctx['favicon'] = icon_url
179
130
                else:
180
131
                    new_app['has_icon'] = False
181
 
                # The following check is here, so it is AFTER setting the
182
 
                # icon, but BEFORE actually installing the tab in the menu
183
 
                if len(tab) > 6 and tab[6]:
184
 
                    # Admin-only tab
185
 
                    if not (req.user and req.user.admin):
186
 
                        break
187
 
                new_app['path'] = req.make_path(tab[4])
 
132
                new_app['path'] = ivle.util.make_path(tab[4])
188
133
                new_app['desc'] = tab[2]
189
134
                new_app['name'] = tab[1]
190
135
                new_app['weight'] = tab[5]
199
144
        scripts_init.
200
145
        """
201
146
        overlays = []
202
 
        styles = []
203
 
        scripts = []
204
 
        scripts_init = []
205
147
        if not self.allow_overlays:
206
 
            return (overlays, styles, scripts, scripts_init)
 
148
            return overlays
207
149
 
208
150
        for plugin in req.config.plugin_index[OverlayPlugin]:
209
151
            for overclass in plugin.overlays:
213
155
                #TODO: Re-factor this to look nicer
214
156
                for mplugin in overlay.plugin_scripts:
215
157
                    for path in overlay.plugin_scripts[mplugin]:
216
 
                        scripts.append(media_url(req, mplugin, path))
 
158
                        req.scripts.append(media_url(req, mplugin, path))
217
159
 
218
160
                for mplugin in overlay.plugin_styles:
219
161
                    for path in overlay.plugin_styles[mplugin]:
220
 
                        styles.append(media_url(req, mplugin, path))
 
162
                        req.styles.append(media_url(req, mplugin, path))
221
163
 
222
 
                scripts_init += overlay.plugin_scripts_init
 
164
                req.scripts_init += overlay.plugin_scripts_init
223
165
 
224
166
                overlays.append(overlay.render(req))
225
 
        return (overlays, styles, scripts, scripts_init)
 
167
        return overlays
226
168
 
227
169
    @classmethod
228
170
    def get_error_view(cls, e):
235
177
class XHTMLErrorView(XHTMLView):
236
178
    template = 'xhtmlerror.html'
237
179
 
238
 
    def __init__(self, req, context, lastobj):
239
 
        super(XHTMLErrorView, self).__init__(req, context)
240
 
        self.lastobj = lastobj
241
 
 
242
 
    def get_context_ancestry(self, req):
243
 
        return req.publisher.get_ancestors(self.lastobj)
 
180
    def __init__(self, req, exception):
 
181
        self.context = exception
244
182
 
245
183
    def populate(self, req, ctx):
246
 
        ctx['req'] = req
247
184
        ctx['exception'] = self.context
248
 
        req.headers_out['X-IVLE-Error'] = self.context.message
249
185
 
250
186
class XHTMLUnauthorizedView(XHTMLErrorView):
251
187
    template = 'xhtmlunauthorized.html'
252
188
 
253
 
    def __init__(self, req, exception, lastobj):
254
 
        super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
 
189
    def __init__(self, req, exception):
 
190
        super(XHTMLUnauthorizedView, self).__init__(req, exception)
255
191
 
256
 
        if not req.publicmode and req.user is None:
 
192
        if req.user is None:
257
193
            # Not logged in. Redirect to login page.
258
194
            if req.uri == '/':
259
195
                query_string = ''
262
198
            req.throw_redirect('/+login' + query_string)
263
199
 
264
200
        req.status = 403
265
 
 
266
 
class ViewBreadcrumb(object):
267
 
    def __init__(self, req, context):
268
 
        self.req = req
269
 
        self.context = context
270
 
 
271
 
    @property
272
 
    def text(self):
273
 
        return self.context.breadcrumb_text