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

« back to all changes in this revision

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

  • Committer: David Coles
  • Date: 2010-02-24 08:19:50 UTC
  • Revision ID: coles.david@gmail.com-20100224081950-5g3w565es0dyv8aj
docs: Worksheets and Exercise developer documentation

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
 
 
41
 
    plugin_scripts = {}
42
 
    plugin_styles = {}
43
 
    scripts_init = []
44
 
 
45
42
    allow_overlays = True
46
 
    overlay_blacklist = []
47
 
 
48
 
    def __init__(self, req, **kwargs):
49
 
        for key in kwargs:
50
 
            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)
51
59
 
52
60
    def filter(self, stream, ctx):
53
61
        return stream
96
104
        ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
97
105
        ctx['app_template'] = app
98
106
        ctx['title_img'] = media_url(req, CorePlugin,
99
 
                                     "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
 
100
135
        self.populate_headings(req, ctx)
101
136
        tmpl = loader.load(os.path.join(os.path.dirname(__file__), 
102
137
                                                        'ivle-headings.html'))
128
163
                continue
129
164
 
130
165
            for tab in plugin.tabs:
131
 
                # 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)
132
168
                new_app = {}
133
169
                new_app['this_app'] = hasattr(self, 'tab') \
134
170
                                      and tab[0] == self.tab
142
178
                        ctx['favicon'] = icon_url
143
179
                else:
144
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
145
187
                new_app['path'] = req.make_path(tab[4])
146
188
                new_app['desc'] = tab[2]
147
189
                new_app['name'] = tab[1]
193
235
class XHTMLErrorView(XHTMLView):
194
236
    template = 'xhtmlerror.html'
195
237
 
196
 
    def __init__(self, req, exception):
197
 
        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)
198
244
 
199
245
    def populate(self, req, ctx):
 
246
        ctx['req'] = req
200
247
        ctx['exception'] = self.context
 
248
        req.headers_out['X-IVLE-Error'] = self.context.message
201
249
 
202
250
class XHTMLUnauthorizedView(XHTMLErrorView):
203
251
    template = 'xhtmlunauthorized.html'
204
252
 
205
 
    def __init__(self, req, exception):
206
 
        super(XHTMLUnauthorizedView, self).__init__(req, exception)
 
253
    def __init__(self, req, exception, lastobj):
 
254
        super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
207
255
 
208
 
        if req.user is None:
 
256
        if not req.publicmode and req.user is None:
209
257
            # Not logged in. Redirect to login page.
210
258
            if req.uri == '/':
211
259
                query_string = ''
214
262
            req.throw_redirect('/+login' + query_string)
215
263
 
216
264
        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