~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-03-18 00:12:26 UTC
  • mfrom: (1164 trunk)
  • mto: This revision was merged to the branch mainline in revision 1290.
  • Revision ID: grantw@unimelb.edu.au-20090318001226-fm6rh01lfezetk3x
MergeĀ fromĀ trunk.

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
 
143
202
class Plugin(ViewPlugin, PublicViewPlugin):
144
203
    urls = [
 
204
        ('+media/+:version/+external/:ns/*path', ExternalVersionedMediaFileView),
 
205
        ('+media/+external/:ns/*path', ExternalMediaFileView),
145
206
        ('+media/+:version/:ns/*path', VersionedMediaFileView),
146
207
        ('+media/:ns/*path', MediaFileView),
147
208
    ]