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

« back to all changes in this revision

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

  • Committer: Matt Giuca
  • Date: 2010-02-04 03:08:35 UTC
  • Revision ID: matt.giuca@gmail.com-20100204030835-epwx6qs5ippwopl5
Tags: 1.0beta1
Added subversion dumps as part of sample data. ivle-loadsampledata loads these dumps, so the sample data now comes with sample files (requiring a checkout).

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
 
import ivle.conf
32
 
import ivle.util
 
31
from ivle.webapp.publisher import NoPath
 
32
from ivle.webapp.breadcrumbs import Breadcrumber
33
33
 
34
34
class XHTMLView(BaseView):
35
35
    """
39
39
    """
40
40
 
41
41
    template = 'template.html'
42
 
    plugin_scripts = {}
43
 
    plugin_styles = {}
44
42
    allow_overlays = True
45
 
    overlay_blacklist = []
46
 
 
47
 
    def __init__(self, req, **kwargs):
48
 
        for key in kwargs:
49
 
            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)
50
59
 
51
60
    def filter(self, stream, ctx):
52
61
        return stream
66
75
        tmpl = loader.load(app_template)
67
76
        app = self.filter(tmpl.generate(viewctx), viewctx)
68
77
 
 
78
        view_scripts = []
69
79
        for plugin in self.plugin_scripts:
70
80
            for path in self.plugin_scripts[plugin]:
71
 
                req.scripts.append(media_url(req, plugin, path))
 
81
                view_scripts.append(media_url(req, plugin, path))
72
82
 
 
83
        view_styles = []
73
84
        for plugin in self.plugin_styles:
74
85
            for path in self.plugin_styles[plugin]:
75
 
                req.styles.append(media_url(req, plugin, path))
 
86
                view_styles.append(media_url(req, plugin, path))
76
87
 
77
88
        # Global template
78
89
        ctx = genshi.template.Context()
79
 
        # XXX: Leave this here!! (Before req.styles is read)
80
 
        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]
81
93
 
82
94
        ctx['styles'] = [media_url(req, CorePlugin, 'ivle.css')]
83
 
        ctx['styles'] += req.styles
 
95
        ctx['styles'] += view_styles
 
96
        ctx['styles'] += overlay_bits[1]
84
97
 
85
98
        ctx['scripts'] = [media_url(req, CorePlugin, path) for path in
86
99
                           ('util.js', 'json2.js', 'md5.js')]
87
 
        ctx['scripts'] += req.scripts
 
100
        ctx['scripts'].append(media_url(req, '+external/jquery', 'jquery.js'))
 
101
        ctx['scripts'] += view_scripts
 
102
        ctx['scripts'] += overlay_bits[2]
88
103
 
89
 
        ctx['scripts_init'] = req.scripts_init
 
104
        ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
90
105
        ctx['app_template'] = app
91
106
        ctx['title_img'] = media_url(req, CorePlugin,
92
 
                                     "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
        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
 
93
134
        self.populate_headings(req, ctx)
94
135
        tmpl = loader.load(os.path.join(os.path.dirname(__file__), 
95
136
                                                        'ivle-headings.html'))
100
141
 
101
142
    def populate_headings(self, req, ctx):
102
143
        ctx['favicon'] = None
103
 
        ctx['root_dir'] = ivle.conf.root_dir
104
 
        ctx['public_host'] = ivle.conf.public_host
 
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']
105
147
        ctx['write_javascript_settings'] = req.write_javascript_settings
106
148
        if req.user:
107
149
            ctx['login'] = req.user.login
134
176
                        ctx['favicon'] = icon_url
135
177
                else:
136
178
                    new_app['has_icon'] = False
137
 
                new_app['path'] = ivle.util.make_path(tab[4])
 
179
                new_app['path'] = req.make_path(tab[4])
138
180
                new_app['desc'] = tab[2]
139
181
                new_app['name'] = tab[1]
140
182
                new_app['weight'] = tab[5]
149
191
        scripts_init.
150
192
        """
151
193
        overlays = []
 
194
        styles = []
 
195
        scripts = []
 
196
        scripts_init = []
152
197
        if not self.allow_overlays:
153
 
            return overlays
 
198
            return (overlays, styles, scripts, scripts_init)
154
199
 
155
200
        for plugin in req.config.plugin_index[OverlayPlugin]:
156
201
            for overclass in plugin.overlays:
160
205
                #TODO: Re-factor this to look nicer
161
206
                for mplugin in overlay.plugin_scripts:
162
207
                    for path in overlay.plugin_scripts[mplugin]:
163
 
                        req.scripts.append(media_url(req, mplugin, path))
 
208
                        scripts.append(media_url(req, mplugin, path))
164
209
 
165
210
                for mplugin in overlay.plugin_styles:
166
211
                    for path in overlay.plugin_styles[mplugin]:
167
 
                        req.styles.append(media_url(req, mplugin, path))
 
212
                        styles.append(media_url(req, mplugin, path))
168
213
 
169
 
                req.scripts_init += overlay.plugin_scripts_init
 
214
                scripts_init += overlay.plugin_scripts_init
170
215
 
171
216
                overlays.append(overlay.render(req))
172
 
        return overlays
 
217
        return (overlays, styles, scripts, scripts_init)
173
218
 
174
219
    @classmethod
175
220
    def get_error_view(cls, e):
182
227
class XHTMLErrorView(XHTMLView):
183
228
    template = 'xhtmlerror.html'
184
229
 
185
 
    def __init__(self, req, exception):
186
 
        self.context = exception
 
230
    def __init__(self, req, context, lastobj):
 
231
        super(XHTMLErrorView, self).__init__(req, context)
 
232
        self.lastobj = lastobj
 
233
 
 
234
    def get_context_ancestry(self, req):
 
235
        return req.publisher.get_ancestors(self.lastobj)
187
236
 
188
237
    def populate(self, req, ctx):
 
238
        ctx['req'] = req
189
239
        ctx['exception'] = self.context
190
240
 
191
241
class XHTMLUnauthorizedView(XHTMLErrorView):
192
242
    template = 'xhtmlunauthorized.html'
193
243
 
194
 
    def __init__(self, req, exception):
195
 
        super(XHTMLUnauthorizedView, self).__init__(req, exception)
 
244
    def __init__(self, req, exception, lastobj):
 
245
        super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
196
246
 
197
 
        if req.user is None:
 
247
        if not req.publicmode and req.user is None:
198
248
            # Not logged in. Redirect to login page.
199
249
            if req.uri == '/':
200
250
                query_string = ''
203
253
            req.throw_redirect('/+login' + query_string)
204
254
 
205
255
        req.status = 403
 
256
 
 
257
class ViewBreadcrumb(object):
 
258
    def __init__(self, req, context):
 
259
        self.req = req
 
260
        self.context = context
 
261
 
 
262
    @property
 
263
    def text(self):
 
264
        return self.context.breadcrumb_text