~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-12-14 04:17:46 UTC
  • Revision ID: me@williamgrant.id.au-20091214041746-eurw04xssf4cvszc
Add ivle-dev-setup, a script to do most of the heavy lifting when setting up a new dev installation.

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
 
    overlay_blacklist = []
45
 
 
46
 
    def __init__(self, req, **kwargs):
47
 
        for key in kwargs:
48
 
            setattr(self, key, kwargs[key])
 
42
    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
49
62
 
50
63
    def render(self, req):
51
64
        req.content_type = 'text/html' # TODO: Detect application/xhtml+xml
58
71
        # view.
59
72
        app_template = os.path.join(os.path.dirname(
60
73
                        inspect.getmodule(self).__file__), self.template) 
61
 
        req.write_html_head_foot = False
62
74
        loader = genshi.template.TemplateLoader(".", auto_reload=True)
63
75
        tmpl = loader.load(app_template)
64
 
        app = tmpl.generate(viewctx)
 
76
        app = self.filter(tmpl.generate(viewctx), viewctx)
65
77
 
 
78
        view_scripts = []
66
79
        for plugin in self.plugin_scripts:
67
80
            for path in self.plugin_scripts[plugin]:
68
 
                req.scripts.append(media_url(req, plugin, path))
 
81
                view_scripts.append(media_url(req, plugin, path))
69
82
 
 
83
        view_styles = []
70
84
        for plugin in self.plugin_styles:
71
85
            for path in self.plugin_styles[plugin]:
72
 
                req.styles.append(media_url(req, plugin, path))
 
86
                view_styles.append(media_url(req, plugin, path))
73
87
 
74
88
        # Global template
75
89
        ctx = genshi.template.Context()
76
 
        # XXX: Leave this here!! (Before req.styles is read)
77
 
        ctx['overlays'] = self.render_overlays(req)
 
90
 
 
91
        overlay_bits = self.render_overlays(req) if req.user else [[]]*4
 
92
        ctx['overlays'] = overlay_bits[0]
78
93
 
79
94
        ctx['styles'] = [media_url(req, CorePlugin, 'ivle.css')]
80
 
        ctx['styles'] += req.styles
 
95
        ctx['styles'] += view_styles
 
96
        ctx['styles'] += overlay_bits[1]
81
97
 
82
98
        ctx['scripts'] = [media_url(req, CorePlugin, path) for path in
83
99
                           ('util.js', 'json2.js', 'md5.js')]
84
 
        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]
85
103
 
86
 
        ctx['scripts_init'] = req.scripts_init
 
104
        ctx['scripts_init'] = self.scripts_init + overlay_bits[3]
87
105
        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
88
123
        self.populate_headings(req, ctx)
89
124
        tmpl = loader.load(os.path.join(os.path.dirname(__file__), 
90
125
                                                        'ivle-headings.html'))
95
130
 
96
131
    def populate_headings(self, req, ctx):
97
132
        ctx['favicon'] = None
98
 
        ctx['root_dir'] = ivle.conf.root_dir
99
 
        ctx['public_host'] = ivle.conf.public_host
 
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']
100
136
        ctx['write_javascript_settings'] = req.write_javascript_settings
101
137
        if req.user:
102
138
            ctx['login'] = req.user.login
110
146
            ctx['help_path'] = self.help
111
147
 
112
148
        ctx['apps_in_tabs'] = []
113
 
        for plugin in req.plugin_index[ViewPlugin]:
 
149
        for plugin in req.config.plugin_index[ViewPlugin]:
114
150
            if not hasattr(plugin, 'tabs'):
115
151
                continue
116
152
 
117
153
            for tab in plugin.tabs:
118
154
                # tab is a tuple: name, title, desc, icon, path
119
155
                new_app = {}
120
 
                new_app['this_app'] = hasattr(self, 'appname') \
121
 
                                      and tab[0] == self.appname
 
156
                new_app['this_app'] = hasattr(self, 'tab') \
 
157
                                      and tab[0] == self.tab
122
158
 
123
159
                # Icon name
124
160
                if tab[3] is not None:
129
165
                        ctx['favicon'] = icon_url
130
166
                else:
131
167
                    new_app['has_icon'] = False
132
 
                new_app['path'] = ivle.util.make_path(tab[4])
 
168
                new_app['path'] = req.make_path(tab[4])
133
169
                new_app['desc'] = tab[2]
134
170
                new_app['name'] = tab[1]
135
171
                new_app['weight'] = tab[5]
144
180
        scripts_init.
145
181
        """
146
182
        overlays = []
147
 
        for plugin in req.plugin_index[OverlayPlugin]:
 
183
        styles = []
 
184
        scripts = []
 
185
        scripts_init = []
 
186
        if not self.allow_overlays:
 
187
            return (overlays, styles, scripts, scripts_init)
 
188
 
 
189
        for plugin in req.config.plugin_index[OverlayPlugin]:
148
190
            for overclass in plugin.overlays:
149
191
                if overclass in self.overlay_blacklist:
150
192
                    continue
152
194
                #TODO: Re-factor this to look nicer
153
195
                for mplugin in overlay.plugin_scripts:
154
196
                    for path in overlay.plugin_scripts[mplugin]:
155
 
                        req.scripts.append(media_url(req, mplugin, path))
 
197
                        scripts.append(media_url(req, mplugin, path))
156
198
 
157
199
                for mplugin in overlay.plugin_styles:
158
200
                    for path in overlay.plugin_styles[mplugin]:
159
 
                        req.styles.append(media_url(req, mplugin, path))
 
201
                        styles.append(media_url(req, mplugin, path))
160
202
 
161
 
                req.scripts_init += overlay.plugin_scripts_init
 
203
                scripts_init += overlay.plugin_scripts_init
162
204
 
163
205
                overlays.append(overlay.render(req))
164
 
        return overlays
 
206
        return (overlays, styles, scripts, scripts_init)
165
207
 
166
208
    @classmethod
167
209
    def get_error_view(cls, e):
174
216
class XHTMLErrorView(XHTMLView):
175
217
    template = 'xhtmlerror.html'
176
218
 
177
 
    def __init__(self, req, exception):
178
 
        self.context = exception
 
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)
179
225
 
180
226
    def populate(self, req, ctx):
 
227
        ctx['req'] = req
181
228
        ctx['exception'] = self.context
182
229
 
183
230
class XHTMLUnauthorizedView(XHTMLErrorView):
184
231
    template = 'xhtmlunauthorized.html'
185
232
 
186
 
    def __init__(self, req, exception):
187
 
        super(XHTMLUnauthorizedView, self).__init__(req, exception)
 
233
    def __init__(self, req, exception, lastobj):
 
234
        super(XHTMLUnauthorizedView, self).__init__(req, exception, lastobj)
188
235
 
189
 
        if req.user is None:
 
236
        if not req.publicmode and req.user is None:
190
237
            # Not logged in. Redirect to login page.
191
 
            req.throw_redirect('/+login?' + 
192
 
                               urllib.urlencode([('url', req.uri)]))
 
238
            if req.uri == '/':
 
239
                query_string = ''
 
240
            else:
 
241
                query_string = '?url=' + urllib.quote(req.uri, safe="/~")
 
242
            req.throw_redirect('/+login' + query_string)
193
243
 
194
244
        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