~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-04-28 06:02:41 UTC
  • Revision ID: grantw@unimelb.edu.au-20090428060241-t4gnwl35maukfvfg
Move ivle.conf.mimetypes to ivle.mimetypes, and rename things in it.

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.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)
 
44
    overlay_blacklist = []
 
45
 
 
46
    def __init__(self, req, **kwargs):
 
47
        for key in kwargs:
 
48
            setattr(self, key, kwargs[key])
59
49
 
60
50
    def filter(self, stream, ctx):
61
51
        return stream
75
65
        tmpl = loader.load(app_template)
76
66
        app = self.filter(tmpl.generate(viewctx), viewctx)
77
67
 
78
 
        view_scripts = []
79
68
        for plugin in self.plugin_scripts:
80
69
            for path in self.plugin_scripts[plugin]:
81
 
                view_scripts.append(media_url(req, plugin, path))
 
70
                req.scripts.append(media_url(req, plugin, path))
82
71
 
83
 
        view_styles = []
84
72
        for plugin in self.plugin_styles:
85
73
            for path in self.plugin_styles[plugin]:
86
 
                view_styles.append(media_url(req, plugin, path))
 
74
                req.styles.append(media_url(req, plugin, path))
87
75
 
88
76
        # Global template
89
77
        ctx = genshi.template.Context()
90
 
 
91
 
        overlay_bits = self.render_overlays(req) if req.user else [[]]*4
92
 
        ctx['overlays'] = overlay_bits[0]
 
78
        # XXX: Leave this here!! (Before req.styles is read)
 
79
        ctx['overlays'] = self.render_overlays(req) if req.user else []
93
80
 
94
81
        ctx['styles'] = [media_url(req, CorePlugin, 'ivle.css')]
95
 
        ctx['styles'] += view_styles
96
 
        ctx['styles'] += overlay_bits[1]
 
82
        ctx['styles'] += req.styles
97
83
 
98
84
        ctx['scripts'] = [media_url(req, CorePlugin, path) for path in
99
85
                           ('util.js', 'json2.js', 'md5.js')]
100
86
        ctx['scripts'].append(media_url(req, '+external/jquery', 'jquery.js'))
101
 
        ctx['scripts'] += view_scripts
102
 
        ctx['scripts'] += overlay_bits[2]
 
87
        ctx['scripts'] += req.scripts
103
88
 
104
 
        ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
 
89
        ctx['scripts_init'] = req.scripts_init
105
90
        ctx['app_template'] = app
106
91
        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
 
 
 
92
                                     "images/chrome/title.png")
135
93
        self.populate_headings(req, ctx)
136
94
        tmpl = loader.load(os.path.join(os.path.dirname(__file__), 
137
95
                                                        'ivle-headings.html'))
163
121
                continue
164
122
 
165
123
            for tab in plugin.tabs:
166
 
                # tab is a tuple: name, title, desc, icon, path, weight, admin
167
 
                # (Admin is optional, defaults to false)
 
124
                # tab is a tuple: name, title, desc, icon, path
168
125
                new_app = {}
169
126
                new_app['this_app'] = hasattr(self, 'tab') \
170
127
                                      and tab[0] == self.tab
178
135
                        ctx['favicon'] = icon_url
179
136
                else:
180
137
                    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])
 
138
                new_app['path'] = ivle.util.make_path(tab[4])
188
139
                new_app['desc'] = tab[2]
189
140
                new_app['name'] = tab[1]
190
141
                new_app['weight'] = tab[5]
199
150
        scripts_init.
200
151
        """
201
152
        overlays = []
202
 
        styles = []
203
 
        scripts = []
204
 
        scripts_init = []
205
153
        if not self.allow_overlays:
206
 
            return (overlays, styles, scripts, scripts_init)
 
154
            return overlays
207
155
 
208
156
        for plugin in req.config.plugin_index[OverlayPlugin]:
209
157
            for overclass in plugin.overlays:
213
161
                #TODO: Re-factor this to look nicer
214
162
                for mplugin in overlay.plugin_scripts:
215
163
                    for path in overlay.plugin_scripts[mplugin]:
216
 
                        scripts.append(media_url(req, mplugin, path))
 
164
                        req.scripts.append(media_url(req, mplugin, path))
217
165
 
218
166
                for mplugin in overlay.plugin_styles:
219
167
                    for path in overlay.plugin_styles[mplugin]:
220
 
                        styles.append(media_url(req, mplugin, path))
 
168
                        req.styles.append(media_url(req, mplugin, path))
221
169
 
222
 
                scripts_init += overlay.plugin_scripts_init
 
170
                req.scripts_init += overlay.plugin_scripts_init
223
171
 
224
172
                overlays.append(overlay.render(req))
225
 
        return (overlays, styles, scripts, scripts_init)
 
173
        return overlays
226
174
 
227
175
    @classmethod
228
176
    def get_error_view(cls, e):
235
183
class XHTMLErrorView(XHTMLView):
236
184
    template = 'xhtmlerror.html'
237
185
 
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)
 
186
    def __init__(self, req, exception):
 
187
        self.context = exception
244
188
 
245
189
    def populate(self, req, ctx):
246
 
        ctx['req'] = req
247
190
        ctx['exception'] = self.context
248
191
 
249
192
class XHTMLUnauthorizedView(XHTMLErrorView):
250
193
    template = 'xhtmlunauthorized.html'
251
194
 
252
 
    def __init__(self, req, exception, lastobj):
253
 
        super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
 
195
    def __init__(self, req, exception):
 
196
        super(XHTMLUnauthorizedView, self).__init__(req, exception)
254
197
 
255
 
        if not req.publicmode and req.user is None:
 
198
        if req.user is None:
256
199
            # Not logged in. Redirect to login page.
257
200
            if req.uri == '/':
258
201
                query_string = ''
261
204
            req.throw_redirect('/+login' + query_string)
262
205
 
263
206
        req.status = 403
264
 
 
265
 
class ViewBreadcrumb(object):
266
 
    def __init__(self, req, context):
267
 
        self.req = req
268
 
        self.context = context
269
 
 
270
 
    @property
271
 
    def text(self):
272
 
        return self.context.breadcrumb_text