annotate pyweek-upload.py @ 740:9f48ebadb9a7 pyntnclick

Drop bundled Albow
author Stefano Rivera <stefano@rivera.za.net>
date Wed, 16 Jan 2013 10:23:52 +0200
parents d1b86d5849a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
1 '''
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
2 Upload script specifically engineered for the PyWeek challenge.
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
3
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
4 Handles authentication and gives upload progress feedback.
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
5 '''
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
6 import cStringIO
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
7 import getopt
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
8 import httplib
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
9 import os
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
10 import socket
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
11 import sys
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
12 import time
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
13
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
14
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
15 class Upload:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
16 def __init__(self, filename):
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
17 self.filename = filename
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
18
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
19 boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
20 sep_boundary = '\n--' + boundary
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
21 end_boundary = sep_boundary + '--'
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
22
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
23
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
24 def mimeEncode(data, sep_boundary=sep_boundary, end_boundary=end_boundary):
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
25 '''Take the mapping of data and construct the body of a
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
26 multipart/form-data message with it using the indicated boundaries.
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
27 '''
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
28 ret = cStringIO.StringIO()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
29 for key, value in data.items():
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
30 # handle multiple entries for the same name
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
31 if type(value) != type([]):
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
32 value = [value]
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
33 for value in value:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
34 ret.write(sep_boundary)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
35 if isinstance(value, Upload):
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
36 ret.write('\nContent-Disposition: form-data; name="%s"' % key)
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
37 filename = os.path.basename(value.filename)
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
38 ret.write('; filename="%s"\n\n' % filename)
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
39 value = open(os.path.join(value.filename), "rb").read()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
40 else:
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
41 ret.write('\nContent-Disposition: form-data; name="%s"' % key)
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
42 ret.write("\n\n")
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
43 value = str(value)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
44 ret.write(str(value))
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
45 if value and value[-1] == '\r':
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
46 ret.write('\n') # write an extra newline
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
47 ret.write(end_boundary)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
48 return ret.getvalue()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
49
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
50
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
51 class Progress:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
52 def __init__(self, info, data):
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
53 self.info = info
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
54 self.tosend = len(data)
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
55 self.total = self.tosend / 1024
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
56 self.data = cStringIO.StringIO(data)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
57 self.start = self.now = time.time()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
58 self.sent = 0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
59 self.num = 0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
60 self.stepsize = self.total / 100 or 1
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
61 self.steptimes = []
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
62 self.display()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
63
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
64 def __iter__(self):
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
65 return self
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
66
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
67 def next(self):
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
68 self.num += 1
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
69 if self.sent >= self.tosend:
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
70 print self.info, 'done', ' ' * (75 - len(self.info) - 6)
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
71 sys.stdout.flush()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
72 raise StopIteration
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
73
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
74 chunk = self.data.read(1024)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
75 self.sent += len(chunk)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
76 #print (self.num, self.stepsize, self.total, self.sent, self.tosend)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
77
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
78 if self.num % self.stepsize:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
79 return chunk
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
80 self.display()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
81 return chunk
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
82
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
83 def display(self):
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
84 # figure how long we've spent - guess how long to go
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
85 now = time.time()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
86 steptime = now - self.now
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
87 self.steptimes.insert(0, steptime)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
88 if len(self.steptimes) > 5:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
89 self.steptimes.pop()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
90 steptime = sum(self.steptimes) / len(self.steptimes)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
91 self.now = now
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
92 eta = steptime * ((self.total - self.num) / self.stepsize)
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
93
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
94 # tell it like it is (or might be)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
95 if now - self.start > 3:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
96 M = eta / 60
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
97 H = M / 60
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
98 M = M % 60
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
99 S = eta % 60
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
100 if self.total:
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
101 s = '%s %2d%% (ETA %02d:%02d:%02d)' % (self.info,
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
102 self.num * 100. / self.total, H, M, S)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
103 else:
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
104 s = '%s 0%% (ETA %02d:%02d:%02d)' % (self.info, H, M, S)
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
105 elif self.total:
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
106 s = '%s %2d%%' % (self.info, self.num * 100. / self.total)
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
107 else:
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
108 s = '%s %d done' % (self.info, self.num)
538
d1b86d5849a0 More pep8 cleanups
Neil Muller <neil@dip.sun.ac.za>
parents: 531
diff changeset
109 sys.stdout.write(s + ' ' * (75 - len(s)) + '\r')
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
110 sys.stdout.flush()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
111
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
112
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
113 class progressHTTPConnection(httplib.HTTPConnection):
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
114 def progress_send(self, str):
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
115 """Send `str' to the server."""
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
116 if self.sock is None:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
117 self.connect()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
118
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
119 p = Progress('Uploading', str)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
120 for chunk in p:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
121 sent = 0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
122 while sent != len(chunk):
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
123 try:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
124 sent += self.sock.send(chunk)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
125 except socket.error, v:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
126 if v[0] == 32: # Broken pipe
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
127 self.close()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
128 raise
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
129 p.display()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
130
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
131
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
132 class progressHTTP(httplib.HTTP):
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
133 _connection_class = progressHTTPConnection
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
134
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
135 def _setup(self, conn):
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
136 httplib.HTTP._setup(self, conn)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
137 self.progress_send = self._conn.progress_send
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
138
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
139
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
140 def http_request(data, server, port, url):
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
141 h = progressHTTP(server, port)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
142
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
143 data = mimeEncode(data)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
144 h.putrequest('POST', url)
538
d1b86d5849a0 More pep8 cleanups
Neil Muller <neil@dip.sun.ac.za>
parents: 531
diff changeset
145 h.putheader('Content-type', 'multipart/form-data; boundary=%s' % boundary)
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
146 h.putheader('Content-length', str(len(data)))
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
147 h.putheader('Host', server)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
148 h.endheaders()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
149
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
150 h.progress_send(data)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
151
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
152 errcode, errmsg, headers = h.getreply()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
153
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
154 f = h.getfile()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
155 response = f.read().strip()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
156 f.close()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
157
538
d1b86d5849a0 More pep8 cleanups
Neil Muller <neil@dip.sun.ac.za>
parents: 531
diff changeset
158 print '%s %s' % (errcode, errmsg)
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
159 if response:
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
160 print response
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
161
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
162
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
163 def usage():
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
164 print '''This program is to be used to upload files to the PyWeek system.
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
165 You may use it to upload screenshots or code submissions.
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
166
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
167 REQUIRED ARGUMENTS:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
168 -u username
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
169 -p password
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
170 -d description of file
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
171 -c file to upload
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
172 -e entry short name
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
173
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
174 OPTIONAL ARGUMENTS:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
175 -s file is a screenshot
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
176 -f file is FINAL submission
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
177 -h override default host name (www.pyweek.org)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
178 -P override default host port (80)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
179
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
180 In order to qualify for judging at the end of the challenge, you MUST
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
181 upload your source and check the "Final Submission" checkbox.
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
182 '''
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
183
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
184
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
185 if __name__ == '__main__':
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
186 try:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
187 optlist, args = getopt.getopt(sys.argv[1:], 'e:u:p:sfd:h:P:c:')
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
188 except getopt.GetoptError, message:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
189 print message
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
190 usage()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
191 sys.exit(1)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
192 host = 'www.pyweek.org'
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
193 port = 80
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
194 data = dict(version=2)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
195 optional = {}
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
196 url = None
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
197 for opt, arg in optlist:
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
198 if opt == '-u':
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
199 data['user'] = arg
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
200 elif opt == '-p':
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
201 data['password'] = arg
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
202 elif opt == '-s':
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
203 optional['is_screenshot'] = 'yes'
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
204 elif opt == '-f':
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
205 optional['is_final'] = 'yes'
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
206 elif opt == '-d':
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
207 data['description'] = arg
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
208 elif opt == '-c':
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
209 data['content_file'] = Upload(arg)
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
210 elif opt == '-e':
538
d1b86d5849a0 More pep8 cleanups
Neil Muller <neil@dip.sun.ac.za>
parents: 531
diff changeset
211 url = '/e/%s/oup/' % arg
531
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
212 elif opt == '-h':
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
213 host = arg
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
214 elif opt == '-P':
60c345d19daf PEP-8 cleanup of skellington bits in root
Stefano Rivera <stefano@rivera.za.net>
parents: 0
diff changeset
215 port = int(arg)
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
216
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
217 if len(data) < 4 or url is None:
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
218 print 'Required argument missing'
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
219 usage()
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
220 sys.exit(1)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
221
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
222 data.update(optional)
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
223 http_request(data, host, port, url)