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

« back to all changes in this revision

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

  • Committer: Nick Chadwick
  • Date: 2009-02-24 03:32:59 UTC
  • mto: (1099.1.227 exercise-ui)
  • mto: This revision was merged to the branch mainline in revision 1162.
  • Revision ID: chadnickbok@gmail.com-20090224033259-m518nuqp6w9f23ax
Added a new page to display exercises. This will then be modified to
actually edit exercises.

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
 
            ctx['ancestry'] = self.get_context_ancestry(req)
110
 
        except NoPath:
111
 
            ctx['ancestry'] = []
112
 
 
113
 
        # If the view has specified text for a breadcrumb, add one.
114
 
        if self.breadcrumb_text:
115
 
            ctx['extra_breadcrumbs'] = [ViewBreadcrumb(req, self)]
116
 
        else:
117
 
            ctx['extra_breadcrumbs'] = []
118
 
 
119
 
        # Allow the view to add its own fake breadcrumbs.
120
 
        ctx['extra_breadcrumbs'] += self.extra_breadcrumbs
121
 
 
122
 
        ctx['crumb'] = Breadcrumber(req).crumb
123
88
        self.populate_headings(req, ctx)
124
89
        tmpl = loader.load(os.path.join(os.path.dirname(__file__), 
125
90
                                                        'ivle-headings.html'))
130
95
 
131
96
    def populate_headings(self, req, ctx):
132
97
        ctx['favicon'] = None
133
 
        ctx['root_dir'] = req.config['urls']['root']
134
 
        ctx['public_host'] = req.config['urls']['public_host']
135
 
        ctx['svn_base'] = req.config['urls']['svn_addr']
 
98
        ctx['root_dir'] = ivle.conf.root_dir
 
99
        ctx['public_host'] = ivle.conf.public_host
136
100
        ctx['write_javascript_settings'] = req.write_javascript_settings
137
101
        if req.user:
138
102
            ctx['login'] = req.user.login
153
117
            for tab in plugin.tabs:
154
118
                # tab is a tuple: name, title, desc, icon, path
155
119
                new_app = {}
156
 
                new_app['this_app'] = hasattr(self, 'tab') \
157
 
                                      and tab[0] == self.tab
 
120
                new_app['this_app'] = hasattr(self, 'appname') \
 
121
                                      and tab[0] == self.appname
158
122
 
159
123
                # Icon name
160
124
                if tab[3] is not None:
165
129
                        ctx['favicon'] = icon_url
166
130
                else:
167
131
                    new_app['has_icon'] = False
168
 
                new_app['path'] = req.make_path(tab[4])
 
132
                new_app['path'] = ivle.util.make_path(tab[4])
169
133
                new_app['desc'] = tab[2]
170
134
                new_app['name'] = tab[1]
171
135
                new_app['weight'] = tab[5]
180
144
        scripts_init.
181
145
        """
182
146
        overlays = []
183
 
        styles = []
184
 
        scripts = []
185
 
        scripts_init = []
186
147
        if not self.allow_overlays:
187
 
            return (overlays, styles, scripts, scripts_init)
 
148
            return overlays
188
149
 
189
150
        for plugin in req.config.plugin_index[OverlayPlugin]:
190
151
            for overclass in plugin.overlays:
194
155
                #TODO: Re-factor this to look nicer
195
156
                for mplugin in overlay.plugin_scripts:
196
157
                    for path in overlay.plugin_scripts[mplugin]:
197
 
                        scripts.append(media_url(req, mplugin, path))
 
158
                        req.scripts.append(media_url(req, mplugin, path))
198
159
 
199
160
                for mplugin in overlay.plugin_styles:
200
161
                    for path in overlay.plugin_styles[mplugin]:
201
 
                        styles.append(media_url(req, mplugin, path))
 
162
                        req.styles.append(media_url(req, mplugin, path))
202
163
 
203
 
                scripts_init += overlay.plugin_scripts_init
 
164
                req.scripts_init += overlay.plugin_scripts_init
204
165
 
205
166
                overlays.append(overlay.render(req))
206
 
        return (overlays, styles, scripts, scripts_init)
 
167
        return overlays
207
168
 
208
169
    @classmethod
209
170
    def get_error_view(cls, e):
216
177
class XHTMLErrorView(XHTMLView):
217
178
    template = 'xhtmlerror.html'
218
179
 
219
 
    def __init__(self, req, context, lastobj):
220
 
        super(XHTMLErrorView, self).__init__(req, context)
221
 
        self.lastobj = lastobj
222
 
 
223
 
    def get_context_ancestry(self, req):
224
 
        return req.publisher.get_ancestors(self.lastobj)
 
180
    def __init__(self, req, exception):
 
181
        self.context = exception
225
182
 
226
183
    def populate(self, req, ctx):
227
 
        ctx['req'] = req
228
184
        ctx['exception'] = self.context
229
185
 
230
186
class XHTMLUnauthorizedView(XHTMLErrorView):
231
187
    template = 'xhtmlunauthorized.html'
232
188
 
233
 
    def __init__(self, req, exception, lastobj):
234
 
        super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
 
189
    def __init__(self, req, exception):
 
190
        super(XHTMLUnauthorizedView, self).__init__(req, exception)
235
191
 
236
192
        if req.user is None:
237
193
            # Not logged in. Redirect to login page.
242
198
            req.throw_redirect('/+login' + query_string)
243
199
 
244
200
        req.status = 403
245
 
 
246
 
class ViewBreadcrumb(object):
247
 
    def __init__(self, req, context):
248
 
        self.req = req
249
 
        self.context = context
250
 
 
251
 
    @property
252
 
    def text(self):
253
 
        return self.context.breadcrumb_text