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

« back to all changes in this revision

Viewing changes to ivle/webapp/media.py

  • Committer: William Grant
  • Date: 2009-02-26 02:08:28 UTC
  • Revision ID: grantw@unimelb.edu.au-20090226020828-0qrhe3llq9r5olmr
ivle-showenrolment: Swap year and semester, and show the role.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
import mimetypes
26
26
import email.utils
27
27
 
 
28
import ivle.conf
 
29
from ivle.config import Config
28
30
from ivle.webapp.base.views import BaseView
29
31
from ivle.webapp.base.plugins import PublicViewPlugin, ViewPlugin, MediaPlugin
30
32
from ivle.webapp.errors import NotFound, Forbidden
41
43
    if not isinstance(plugin, basestring):
42
44
        plugin = req.config.reverse_plugins[plugin]
43
45
 
44
 
    media_path = os.path.join('+media', '+' + req.config['media']['version']) \
45
 
                    if req.config['media']['version'] else '+media'
46
 
 
47
 
    return req.make_path(os.path.join(media_path, plugin, path))
 
46
    config = Config()
 
47
 
 
48
    media_path = os.path.join('+media', '+' + config['media']['version']) if \
 
49
                              config['media']['version'] else '+media'
 
50
 
 
51
    return os.path.join(ivle.conf.root_dir, media_path, plugin, path)
48
52
 
49
53
class BaseMediaFileView(BaseView):
50
54
    '''A view for media files.
126
130
        self.version = version
127
131
 
128
132
    def _make_filename(self, req):
129
 
        if self.version != req.config['media']['version']:
 
133
        if self.version != Config()['media']['version']:
130
134
            raise NotFound()
131
135
 
132
136
        # Don't expire for a year.
136
140
                                    usegmt=True)
137
141
        return super(VersionedMediaFileView, self)._make_filename(req)
138
142
 
139
 
 
140
 
# This maps a media namespace to an external dependency directory (in this
141
 
# case specified by the configuration option media/externals/jquery) and a
142
 
# list of permitted subpaths.
143
 
EXTERNAL_MEDIA_MAP = {'jquery': ('jquery', ['jquery.js'])}
144
 
 
145
 
class ExternalMediaFileView(BaseMediaFileView):
146
 
    '''A view for media files from external dependencies.
147
 
 
148
 
    This serves specific static files from external dependencies as defined in
149
 
    the IVLE configuration.
150
 
    '''
151
 
    permission = None
152
 
 
153
 
    def _make_filename(self, req):
154
 
        try:
155
 
            extern = EXTERNAL_MEDIA_MAP[self.ns]
156
 
        except KeyError:
157
 
            raise NotFound()
158
 
 
159
 
        # Unless it's a whitelisted path, we don't want to hear about it.
160
 
        if self.path not in extern[1]:
161
 
            raise NotFound()
162
 
 
163
 
        # Grab the admin-configured path for this particular external dep.
164
 
        externdir = req.config['media']['externals'][extern[0]]
165
 
 
166
 
        assert isinstance(externdir, basestring)
167
 
 
168
 
        return os.path.join(externdir, self.path)
169
 
 
170
 
    def get_permissions(self, user):
171
 
        return set()
172
 
 
173
 
class ExternalVersionedMediaFileView(ExternalMediaFileView):
174
 
    '''A view for versioned media files from external dependencies, with
175
 
    aggressive caching.
176
 
 
177
 
    This serves specific static media files from external dependencies with a
178
 
    version string, and requests that browsers cache them for a long time.
179
 
    '''
180
 
 
181
 
    def __init__(self, req, ns, path, version):
182
 
        super(ExternalVersionedMediaFileView, self).__init__(req, ns, path)
183
 
        self.version = version
184
 
 
185
 
    def _make_filename(self, req):
186
 
        if self.version != req.config['media']['version']:
187
 
            raise NotFound()
188
 
 
189
 
        # Don't expire for a year.
190
 
        req.headers_out['Expires'] = email.utils.formatdate(
191
 
                                    timeval=time.time() + (60*60*24*365),
192
 
                                    localtime=False,
193
 
                                    usegmt=True)
194
 
        return super(ExternalVersionedMediaFileView, self)._make_filename(req)
195
 
 
196
 
 
197
143
class Plugin(ViewPlugin, PublicViewPlugin):
198
144
    urls = [
199
 
        ('+media/+:version/+external/:ns/*path', ExternalVersionedMediaFileView),
200
 
        ('+media/+external/:ns/*path', ExternalMediaFileView),
201
145
        ('+media/+:version/:ns/*path', VersionedMediaFileView),
202
146
        ('+media/:ns/*path', MediaFileView),
203
147
    ]