~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: 2010-02-17 12:00:09 UTC
  • Revision ID: grantw@unimelb.edu.au-20100217120009-o48s4r1junx8oq8n
Tags: 1.0beta2
Drop version number to 1.0beta2. We are going in for another one.

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