Mercurial > hg > uploader
annotate uploader/handlers.py @ 21:183224756ded
reverse order the log for display
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Mon, 01 Aug 2011 23:53:33 -0700 |
parents | f1142bcce77a |
children | a60cf57d6628 |
rev | line source |
---|---|
0 | 1 import os |
20
f1142bcce77a
add ability to log uploads
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
2 import sys |
0 | 3 from urlparse import urlparse |
4 from webob import Response, exc | |
5 | |
6 class Handler(object): | |
7 def __init__(self, app, request): | |
8 self.app = app | |
9 self.request = request | |
10 self.application_path = urlparse(request.application_url)[2] | |
11 | |
12 def link(self, path=(), permanant=False): | |
13 if isinstance(path, basestring): | |
14 path = [ path ] | |
15 path = [ i.strip('/') for i in path ] | |
16 if permanant: | |
17 application_url = [ self.request.application_url ] | |
18 else: | |
19 application_url = [ self.application_path ] | |
20 path = application_url + path | |
21 return '/'.join(path) | |
22 | |
23 def redirect(self, location): | |
13
b8c636b0b567
make work for non pastescript frameworks
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
24 return exc.HTTPSeeOther(location=location) |
0 | 25 |
26 class Get(Handler): | |
27 | |
13
b8c636b0b567
make work for non pastescript frameworks
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
28 form = """<form name="upload_form" method="post" enctype="multipart/form-data"> |
2 | 29 <input type="file" name="file"/><input type="submit" value="upload"/></form></body></html>""" |
30 | |
0 | 31 @classmethod |
2 | 32 def match(cls, app, request): |
7
a8c60480fce0
make query_string argument more universal
k0s <k0scist@gmail.com>
parents:
6
diff
changeset
|
33 if app.query_string and (app.query_string not in request.GET): |
a8c60480fce0
make query_string argument more universal
k0s <k0scist@gmail.com>
parents:
6
diff
changeset
|
34 return False |
0 | 35 return request.method == 'GET' |
36 | |
37 def __call__(self): | |
13
b8c636b0b567
make work for non pastescript frameworks
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
38 form = "<html><body>" |
b8c636b0b567
make work for non pastescript frameworks
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
39 if 'uploaded' in self.request.GET: |
b8c636b0b567
make work for non pastescript frameworks
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
40 form += '<div>%s uploaded successfully</div>' % self.request.GET['uploaded'] |
17
d15f85eb2ab9
optionally display upload directory contents
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
41 form += self.form |
d15f85eb2ab9
optionally display upload directory contents
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
42 if self.app.display_contents: |
d15f85eb2ab9
optionally display upload directory contents
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
43 contents = os.listdir(self.app.directory) |
d15f85eb2ab9
optionally display upload directory contents
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
44 if contents: |
d15f85eb2ab9
optionally display upload directory contents
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
45 contents.sort() |
d15f85eb2ab9
optionally display upload directory contents
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
46 form += '<div><i>Currently uploaded:<ul><li>' + '</li><li>'.join(contents) + '</li></ul></i></div>' |
d15f85eb2ab9
optionally display upload directory contents
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
47 else: |
d15f85eb2ab9
optionally display upload directory contents
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
48 form += '<div><i>No files in upload directory</i></div>' |
20
f1142bcce77a
add ability to log uploads
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
49 log_file = self.app.log_file |
f1142bcce77a
add ability to log uploads
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
50 if log_file and os.path.exists(log_file): |
21
183224756ded
reverse order the log for display
Jeff Hammel <jhammel@mozilla.com>
parents:
20
diff
changeset
|
51 log_contents = ''.join(reversed(file(log_file).readlines())) |
20
f1142bcce77a
add ability to log uploads
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
52 form += '<div>Upload log:<pre>%s</pre></div>' % log_contents |
17
d15f85eb2ab9
optionally display upload directory contents
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
53 form += '</body></html>' |
13
b8c636b0b567
make work for non pastescript frameworks
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
54 return Response(content_type='text/html', body=form) |
0 | 55 |
56 class Post(Handler): | |
57 | |
58 @classmethod | |
2 | 59 def match(cls, app, request): |
0 | 60 return request.method == 'POST' |
61 | |
2 | 62 def write(self, fin, path): |
63 fout = file(path, 'w') | |
64 fout.write(fin.file.read()) | |
65 fout.close() | |
66 | |
0 | 67 def __call__(self): |
18 | 68 |
69 # get the file | |
0 | 70 fin = self.request.POST['file'] |
15
1ee374416987
handle more gracefully when no file is uploaded
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
71 try: |
19 | 72 _path = fin.filename |
15
1ee374416987
handle more gracefully when no file is uploaded
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
73 except AttributeError: # no file uploaded |
1ee374416987
handle more gracefully when no file is uploaded
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
74 return self.redirect(self.link('/')) |
18 | 75 |
76 # don't allow bad filenames | |
77 illegal = ['..', '<', '&', '>'] | |
78 illegal.append(os.path.sep) | |
79 for i in illegal: | |
80 _path = _path.replace(i, '_') | |
81 | |
82 # write the file + redirect | |
14
916d45d4f921
dont just die on questionable filenames
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
83 _path = os.path.join(self.app.directory, _path) |
11 | 84 self.write(fin, _path) |
20
f1142bcce77a
add ability to log uploads
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
85 if self.app.log_file: |
f1142bcce77a
add ability to log uploads
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
86 try: |
f1142bcce77a
add ability to log uploads
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
87 f = file(self.app.log_file, 'a') |
f1142bcce77a
add ability to log uploads
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
88 print >> f, fin.filename |
f1142bcce77a
add ability to log uploads
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
89 f.close() |
f1142bcce77a
add ability to log uploads
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
90 except Exception, e: |
f1142bcce77a
add ability to log uploads
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
91 print >> sys.stderr, e |
13
b8c636b0b567
make work for non pastescript frameworks
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
92 return self.redirect(self.link('/?uploaded=' + fin.filename)) |
2 | 93 |
94 def path(directory, request): | |
95 if os.sep == '/': | |
96 return os.path.join(directory, request.path_info.strip('/')) | |
97 return os.path.join(directory, *request.path_info.strip('/').split('/')) | |
98 | |
99 class SubpathGet(Get): | |
100 | |
101 @classmethod | |
102 def match(cls, app, request): | |
9 | 103 if not Get.match(app, request): |
2 | 104 return False |
105 _path = path(app.directory, request) | |
106 if os.path.exists(_path) and os.path.isdir(_path): | |
107 return True | |
0 | 108 |
2 | 109 class SubpathPost(Post): |
110 | |
111 @classmethod | |
112 def match(cls, app, request): | |
113 if request.method != 'POST': | |
114 return False | |
115 _path = path(app.directory, request) | |
116 if os.path.exists(_path) and os.path.isdir(_path): | |
117 return True | |
118 | |
119 def __call__(self): | |
120 fin = self.request.POST['file'] | |
10 | 121 _path = path(self.app.directory, self.request) |
122 _path = os.path.join(_path, fin.filename) | |
123 self.write(fin, _path) | |
13
b8c636b0b567
make work for non pastescript frameworks
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
124 return self.redirect(self.link(self.request.path_info)) |
2 | 125 |