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

« back to all changes in this revision

Viewing changes to www/apps/fileservice/action.py

  • Committer: mattgiuca
  • Date: 2008-02-03 12:55:46 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:390
Added automatic unzipping on file upload.
browser/listing.js: Added a checkbox to the upload panel for unzipping.
Fileservice: If this box is checked, and a zip file is found (ending in
".zip"; there is a comment here to change that to looking at the file's magic
number), it will attempt to unzip it into the current directory.
zip.py: Added unzip method. Also changed "make_zip" to not take a req argument
    (not needed).
download: Do not pass req to zip.make_zip.

Show diffs side-by-side

added added

removed removed

Lines of Context:
134
134
 
135
135
import pysvn
136
136
 
137
 
from common import (util, studpath)
 
137
from common import (util, studpath, zip)
138
138
 
139
139
# Make a Subversion client object
140
140
svnclient = pysvn.Client()
179
179
        raise ActionError("Unknown action")
180
180
    action(req, fields)
181
181
 
 
182
def actionpath_to_urlpath(req, path):
 
183
    """Determines the URL path (relative to the student home) upon which the
 
184
    action is intended to act. See actionpath_to_local.
 
185
    """
 
186
    if path is None:
 
187
        return req.path
 
188
    elif len(path) > 0 and path[0] == os.sep:
 
189
        # Relative to student home
 
190
        return path[1:]
 
191
    else:
 
192
        # Relative to req.path
 
193
        return os.path.join(req.path, path)
 
194
 
182
195
def actionpath_to_local(req, path):
183
196
    """Determines the local path upon which an action is intended to act.
184
197
    Note that fileservice actions accept two paths: the request path,
195
208
 
196
209
    Does not mutate req.
197
210
    """
198
 
    if path is None:
199
 
        path = req.path
200
 
    elif len(path) > 0 and path[0] == os.sep:
201
 
        # Relative to student home
202
 
        path = path[1:]
203
 
    else:
204
 
        # Relative to req.path
205
 
        path = os.path.join(req.path, path)
206
 
 
207
 
    _, r = studpath.url_to_local(path)
 
211
    _, r = studpath.url_to_local(actionpath_to_urlpath(req, path))
208
212
    if r is None:
209
213
        raise ActionError("Invalid path")
210
214
    return r
310
314
    """Writes data to one or more files in a directory, overwriting them if
311
315
    it they exist.
312
316
 
313
 
    Reads fields: 'path', 'data' (file upload)
 
317
    Reads fields: 'path', 'data' (file upload, multiple), 'unpack'
314
318
    """
315
 
    # TODO: Read field "unpack".
316
319
    # Important: Data is "None" if the file submitted is empty.
317
320
    path = fields.getfirst('path')
318
321
    data = fields.getlist('data')
 
322
    unpack = fields.getfirst('unpack')
 
323
    if unpack is None:
 
324
        unpack = False
 
325
    else:
 
326
        unpack = True
319
327
    if path is None:
320
328
        raise ActionError("Required field missing")
321
 
    path = actionpath_to_local(req, path)
 
329
    path = actionpath_to_urlpath(req, path)
322
330
    goterror = False
323
331
 
324
332
    for datum in data:
326
334
        filepath = os.path.join(path, datum.filename)
327
335
        filedata = datum.file
328
336
 
329
 
        # Copy the contents of file object 'data' to the path 'path'
330
 
        try:
331
 
            dest = open(filepath, 'wb')
332
 
            if data is not None:
333
 
                shutil.copyfileobj(filedata, dest)
334
 
        except OSError:
335
 
            goterror = True
 
337
        if unpack and datum.filename.lower().endswith(".zip"):
 
338
            # A zip file - unpack it instead of just copying
 
339
            # TODO: Use the magic number instead of file extension
 
340
            # Note: Just unzip into the current directory (ignore the
 
341
            # filename)
 
342
            try:
 
343
                zip.unzip(path, filedata)
 
344
            except (OSError, IOError):
 
345
                goterror = True
 
346
        else:
 
347
            # Not a zip file
 
348
            _, filepath_local = studpath.url_to_local(filepath)
 
349
            if filepath_local is None:
 
350
                raise ActionError("Invalid path")
 
351
 
 
352
            # Copy the contents of file object 'data' to the path 'path'
 
353
            try:
 
354
                dest = open(filepath_local, 'wb')
 
355
                if data is not None:
 
356
                    shutil.copyfileobj(filedata, dest)
 
357
            except OSError:
 
358
                goterror = True
336
359
 
337
360
    if goterror:
338
361
        if len(data) == 1: