Skip to content

Commit 197edd9

Browse files
committed
Brush up error handling, and make radQuestion_111 default to Green Pack if no answer is given
1 parent c9cbea4 commit 197edd9

File tree

3 files changed

+34
-6
lines changed

3 files changed

+34
-6
lines changed

ef/nettask.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,9 @@ def post(self, url, *args, **kwargs):
129129
parse_only = kwargs.pop('parse_only', None)
130130
return self._net_op(lambda url, *args, **kwargs: HTMLOp(qt_form_post(url, *args, **kwargs), timeout=timeout, parse_only=parse_only), url, *args, **kwargs)
131131

132-
def submit_form(self, form, user_fields={}, file=None, timeout=30, parse_only=None):
132+
def submit_form(self, form, user_fields={}, file=None, timeout=30, parse_only=None, default_fields={}):
133133
fields = {}
134+
fields_seen = set()
134135
action = form['action']
135136

136137
for input in form.find_all('input'):
@@ -140,6 +141,7 @@ def submit_form(self, form, user_fields={}, file=None, timeout=30, parse_only=No
140141
if input.has_key('disabled'):
141142
print "Skipping disabled select", name
142143
continue
144+
fields_seen.add(name)
143145
type = input['type'].lower()
144146
if type == 'image':
145147
fields['%s.x' % name] = '1'
@@ -165,10 +167,18 @@ def submit_form(self, form, user_fields={}, file=None, timeout=30, parse_only=No
165167
if select.has_key('disabled'):
166168
print "Skipping disabled select", name
167169
continue
170+
fields_seen.add(name)
168171
selected = filter(lambda o: o.has_key('selected'), select.find_all('option'))
169172
if len(selected):
170173
fields[name] = selected[0]['value']
171174

175+
fields_missed = fields_seen - set(fields.keys())
176+
177+
for rexp in default_fields:
178+
for name in fields_missed:
179+
if rexp.match(name):
180+
fields[name] = default_fields[rexp]
181+
172182
# Hideous eventsforce hack: they do this field-disabling mess in javascript
173183
for script in form.find_all('script'):
174184
m = re.search(r"depends = depends \+ '(.*)'", script.text)

ef/upload.py

+11-5
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ def __init__(self, person, minimum_change, batch):
3232
self.batch = batch
3333
self.person = person
3434
self.photo = Photo.get(id=self.person.current_photo_id)
35-
self.reply = None
3635
self.minimum_change = minimum_change
3736
self.skipped = False
3837
self.aborted = False
@@ -148,6 +147,7 @@ def task(self, image):
148147
while limit > 0 and not soup.find_all(['h1', 'h2', 'h3', 'h4'], text=re.compile(r'\s*Photo Upload\s*')):
149148
if not soup.form:
150149
self.error.emit("Could not find form on registration pages (while looking for photo upload)")
150+
return
151151
soup = yield self.submit_form(soup.form)
152152
error = soup.find('script', text=re.compile(r".*alert\('Error", re.S|re.I))
153153
if error:
@@ -156,15 +156,18 @@ def task(self, image):
156156
msg = m.group(1)
157157
msg = msg.replace(r'\r', '\r').replace(r'\n', '\n')
158158
self.error.emit("Error from eventsforce: %s" % msg)
159+
return
159160
else:
160161
self.error.emit("Eventsforce generated an error, but it couldn't be recognised. Please try the web interface to see what's going on.")
162+
return
161163
limit = limit - 1
162164

163165
if limit == 0:
164166
#f = open('tmp.html', 'w')
165167
#f.write(str(soup))
166168
#f.close()
167169
self.error.emit("Failed to find photo upload on registration pages")
170+
return
168171

169172
self.progress.emit(4)
170173

@@ -196,16 +199,16 @@ def task(self, image):
196199

197200
soup = yield self.submit_form(soup.form, {'uploadFile': '1', 'uploadTempPersonID': temp_person_id, 'uploadGuestNumber': guest_number, 'uploadDataID': data_id})
198201
self.progress.emit(6)
199-
soup = yield self.submit_form(soup.form, {}, self.prepare_file_upload('FileStream', image))
202+
soup = yield self.submit_form(soup.form, {}, file=self.prepare_file_upload('FileStream', image))
200203
self.progress.emit(7)
201204

202205
for script in soup.find_all('script'):
203206
m = re.match(r'^\s*window\.location=\'(.*)\';', script.text)
204207
if m:
205208
break
206209
if not m:
207-
#print soup
208210
self.error.emit("Could not process photo upload (failed to find javascript refresh)")
211+
return
209212
link = m.group(1)
210213

211214
if re.search(r'File could not be saved', link):
@@ -242,17 +245,20 @@ def task(self, image):
242245
while limit > 0 and not re.search(r'Booking details', soup.find_all('h1')[1].text.strip(), re.I):
243246
if not soup.form:
244247
self.error.emit("Could not find form on registration pages (while looking for final booking details page)")
245-
soup = yield self.submit_form(soup.form)
248+
erturn
249+
soup = yield self.submit_form(soup.form, default_fields={re.compile('^radQuestion_111_'): 'Green Pack'})
246250
limit = limit - 1
247251

248252
if limit == 0:
249253
self.error.emit("Failed to reach end of registration pages after uploading photo")
254+
return
250255

251256
self.progress.emit(11)
252257

253258
final_proceed_button = soup.find('input', type='button', onclick=re.compile(r'gotoReceipt'))
254259
if not final_proceed_button:
255260
self.error.emit("Could not find final SAVE button")
261+
return
256262
link = self.extract_link_from_silly_button(final_proceed_button)
257263
soup = yield self.get(link)
258264

@@ -266,6 +272,7 @@ def task(self, image):
266272

267273
if not re.search(r'Booking confirmation', soup.find_all('h1')[1].text, re.I):
268274
self.error.emit('Final page after upload did not look right, did something bad happen?')
275+
return
269276

270277
new_opinion = None
271278
if self.photo.opinion == 'ok':
@@ -311,7 +318,6 @@ def __init__(self):
311318
super(QtCore.QObject, self).__init__()
312319

313320
self.tasks = None
314-
self.reply = None
315321

316322
@QtCore.pyqtSlot(dict, str, str)
317323
@catcherror

todo

+12
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ We need to detect when a person is cancelled. This requires us to know
88
what event we're working on. Make this a program-global state, rather
99
than just a filter. Lots of things make more sense that way around.
1010

11+
Improve fetcher reliability - detect photos which aren't found, for
12+
whatever reason
13+
14+
1115
High priority features
1216
----------------------
1317
use pyinstaller instead of py2exe
@@ -29,3 +33,11 @@ Fix abuses of super() by getting rid of them. super() is insane
2933
Purge habitual getters/setters
3034

3135
Multiple simultaneous uploads, for speed? Downloads? Priority of those?
36+
37+
Better workflow: main window a timeline of previous/current/next,
38+
buttons to move back/forward more prominent, search as a thing you can
39+
open.
40+
41+
Batch upload, report at the end on errors, don't stop after one error
42+
43+
Button to abort current fetch/upload process

0 commit comments

Comments
 (0)