~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-25 23:04:11 UTC
  • Revision ID: grantw@unimelb.edu.au-20090225230411-lbdyl32ir0m3d59b
Make all of the services executable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
140
140
                                    usegmt=True)
141
141
        return super(VersionedMediaFileView, self)._make_filename(req)
142
142
 
143
 
 
144
 
# This maps a media namespace to an external dependency directory (in this
145
 
# case specified by the configuration option media/externals/jquery) and a
146
 
# list of permitted subpaths.
147
 
EXTERNAL_MEDIA_MAP = {'jquery': ('jquery', ['jquery.js'])}
148
 
 
149
 
class ExternalMediaFileView(BaseMediaFileView):
150
 
    '''A view for media files from external dependencies.
151
 
 
152
 
    This serves specific static files from external dependencies as defined in
153
 
    the IVLE configuration.
154
 
    '''
155
 
    permission = None
156
 
 
157
 
    def _make_filename(self, req):
158
 
        try:
159
 
            extern = EXTERNAL_MEDIA_MAP[self.ns]
160
 
        except KeyError:
161
 
            raise NotFound()
162
 
 
163
 
        # Unless it's a whitelisted path, we don't want to hear about it.
164
 
        if self.path not in extern[1]:
165
 
            raise NotFound()
166
 
 
167
 
        # Grab the admin-configured path for this particular external dep.
168
 
        config = Config()
169
 
        externdir = config['media']['externals'][extern[0]]
170
 
 
171
 
        assert isinstance(externdir, basestring)
172
 
 
173
 
        return os.path.join(externdir, self.path)
174
 
 
175
 
    def get_permissions(self, user):
176
 
        return set()
177
 
 
178
 
class ExternalVersionedMediaFileView(ExternalMediaFileView):
179
 
    '''A view for versioned media files from external dependencies, with
180
 
    aggressive caching.
181
 
 
182
 
    This serves specific static media files from external dependencies with a
183
 
    version string, and requests that browsers cache them for a long time.
184
 
    '''
185
 
 
186
 
    def __init__(self, req, ns, path, version):
187
 
        super(ExternalVersionedMediaFileView, self).__init__(req, ns, path)
188
 
        self.version = version
189
 
 
190
 
    def _make_filename(self, req):
191
 
        if self.version != Config()['media']['version']:
192
 
            raise NotFound()
193
 
 
194
 
        # Don't expire for a year.
195
 
        req.headers_out['Expires'] = email.utils.formatdate(
196
 
                                    timeval=time.time() + (60*60*24*365),
197
 
                                    localtime=False,
198
 
                                    usegmt=True)
199
 
        return super(ExternalVersionedMediaFileView, self)._make_filename(req)
200
 
 
201
 
 
202
143
class Plugin(ViewPlugin, PublicViewPlugin):
203
144
    urls = [
204
 
        ('+media/+:version/+external/:ns/*path', ExternalVersionedMediaFileView),
205
 
        ('+media/+external/:ns/*path', ExternalMediaFileView),
206
145
        ('+media/+:version/:ns/*path', VersionedMediaFileView),
207
146
        ('+media/:ns/*path', MediaFileView),
208
147
    ]