Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(259)

Side by Side Diff: third_party/boto/bin/mturk

Issue 698893003: Update checked in version of gsutil to version 4.6 (Closed) Base URL: http://dart.googlecode.com/svn/third_party/gsutil/
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « third_party/boto/bin/lss3 ('k') | third_party/boto/bin/route53 » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2012 Kodi Arfer 2 # Copyright 2012, 2014 Kodi Arfer
3 # 3 #
4 # Permission is hereby granted, free of charge, to any person obtaining a 4 # Permission is hereby granted, free of charge, to any person obtaining a
5 # copy of this software and associated documentation files (the 5 # copy of this software and associated documentation files (the
6 # "Software"), to deal in the Software without restriction, including 6 # "Software"), to deal in the Software without restriction, including
7 # without limitation the rights to use, copy, modify, merge, publish, dis- 7 # without limitation the rights to use, copy, modify, merge, publish, dis-
8 # tribute, sublicense, and/or sell copies of the Software, and to permit 8 # tribute, sublicense, and/or sell copies of the Software, and to permit
9 # persons to whom the Software is furnished to do so, subject to the fol- 9 # persons to whom the Software is furnished to do so, subject to the fol-
10 # lowing conditions: 10 # lowing conditions:
11 # 11 #
12 # The above copyright notice and this permission notice shall be included 12 # The above copyright notice and this permission notice shall be included
(...skipping 20 matching lines...) Expand all
33 # ------------------------------------------------- 33 # -------------------------------------------------
34 34
35 interactive = False 35 interactive = False
36 con = None 36 con = None
37 mturk_website = None 37 mturk_website = None
38 38
39 default_nicknames_path = os.path.expanduser('~/.boto_mturkcli_hit_nicknames') 39 default_nicknames_path = os.path.expanduser('~/.boto_mturkcli_hit_nicknames')
40 nicknames = {} 40 nicknames = {}
41 nickname_pool = set(string.ascii_lowercase) 41 nickname_pool = set(string.ascii_lowercase)
42 42
43 get_assignments_page_size = 100
44
43 time_units = dict( 45 time_units = dict(
44 s = 1, 46 s = 1,
45 min = 60, 47 min = 60,
46 h = 60 * 60, 48 h = 60 * 60,
47 d = 24 * 60 * 60) 49 d = 24 * 60 * 60)
48 50
49 qual_requirements = dict( 51 qual_requirements = dict(
50 Adult = '00000000000000000060', 52 Adult = '00000000000000000060',
51 Locale = '00000000000000000071', 53 Locale = '00000000000000000071',
52 NumberHITsApproved = '00000000000000000040', 54 NumberHITsApproved = '00000000000000000040',
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 Unreviewed assignments get automatically approved. Unsubmitted 276 Unreviewed assignments get automatically approved. Unsubmitted
275 assignments get automatically approved upon submission. 277 assignments get automatically approved upon submission.
276 278
277 The API docs say DisableHIT doesn't work with Reviewable HITs, 279 The API docs say DisableHIT doesn't work with Reviewable HITs,
278 but apparently, it does.''' 280 but apparently, it does.'''
279 con.disable_hit(hit) 281 con.disable_hit(hit)
280 global nicknames 282 global nicknames
281 nicknames = {k: v for k, v in nicknames.items() if v != hit} 283 nicknames = {k: v for k, v in nicknames.items() if v != hit}
282 284
283 def list_assignments(hit, only_reviewable = False): 285 def list_assignments(hit, only_reviewable = False):
284 assignments = map(digest_assignment, con.get_assignments( 286 # Accumulate all relevant assignments, one page of results at
285 hit_id = hit, 287 # a time.
286 page_size = 100, 288 assignments = []
287 status = 'Submitted' if only_reviewable else None)) 289 page = 1
290 while True:
291 rs = con.get_assignments(
292 hit_id = hit,
293 page_size = get_assignments_page_size,
294 page_number = page,
295 status = 'Submitted' if only_reviewable else None)
296 assignments += map(digest_assignment, rs)
297 if len(assignments) >= int(rs.TotalNumResults):
298 break
299 page += 1
288 if interactive: 300 if interactive:
289 print json.dumps(assignments, sort_keys = True, indent = 4) 301 print json.dumps(assignments, sort_keys = True, indent = 4)
290 print ' '.join([a['AssignmentId'] for a in assignments]) 302 print ' '.join([a['AssignmentId'] for a in assignments])
291 print ' '.join([a['WorkerId'] + ',' + a['AssignmentId'] for a in assignm ents]) 303 print ' '.join([a['WorkerId'] + ',' + a['AssignmentId'] for a in assignm ents])
292 else: 304 else:
293 return assignments 305 return assignments
294 306
295 def grant_bonus(message, amount, pairs): 307 def grant_bonus(message, amount, pairs):
296 for worker, assignment in pairs: 308 for worker, assignment in pairs:
297 con.grant_bonus(worker, assignment, con.get_price_as_price(amount), mess age) 309 con.grant_bonus(worker, assignment, con.get_price_as_price(amount), mess age)
(...skipping 10 matching lines...) Expand all
308 if interactive: print 'Rejected', a 320 if interactive: print 'Rejected', a
309 321
310 def unreject_assignments(message, assignments): 322 def unreject_assignments(message, assignments):
311 for a in assignments: 323 for a in assignments:
312 con.approve_rejected_assignment(a, message) 324 con.approve_rejected_assignment(a, message)
313 if interactive: print 'Unrejected', a 325 if interactive: print 'Unrejected', a
314 326
315 def notify_workers(subject, text, workers): 327 def notify_workers(subject, text, workers):
316 con.notify_workers(workers, subject, text) 328 con.notify_workers(workers, subject, text)
317 329
330 def give_qualification(qualification, workers, value = 1, notify = True):
331 for w in workers:
332 con.assign_qualification(qualification, w, value, notify)
333 if interactive: print 'Gave to', w
334
335 def revoke_qualification(qualification, workers, message = None):
336 for w in workers:
337 con.revoke_qualification(w, qualification, message)
338 if interactive: print 'Revoked from', w
339
318 # -------------------------------------------------- 340 # --------------------------------------------------
319 # Mainline code 341 # Mainline code
320 # -------------------------------------------------- 342 # --------------------------------------------------
321 343
322 if __name__ == '__main__': 344 if __name__ == '__main__':
323 interactive = True 345 interactive = True
324 346
325 parser = argparse.ArgumentParser() 347 parser = argparse.ArgumentParser()
326 add_argparse_arguments(parser) 348 add_argparse_arguments(parser)
327 subs = parser.add_subparsers() 349 subs = parser.add_subparsers()
328 350
329 sub = subs.add_parser('bal', 351 sub = subs.add_parser('bal',
330 help = 'display your prepaid balance') 352 help = 'display your prepaid balance')
331 sub.set_defaults(f = get_balance, a = lambda: []) 353 sub.set_defaults(f = get_balance, a = lambda: [])
332 354
333 sub = subs.add_parser('hit', 355 sub = subs.add_parser('hit',
334 help = 'get information about a HIT') 356 help = 'get information about a HIT')
335 sub.add_argument('hit', 357 sub.add_argument('HIT',
336 help = 'nickname or ID of the HIT to show') 358 help = 'nickname or ID of the HIT to show')
337 sub.set_defaults(f = show_hit, a = lambda: 359 sub.set_defaults(f = show_hit, a = lambda:
338 [get_hitid(args.hit)]) 360 [get_hitid(args.HIT)])
339 361
340 sub = subs.add_parser('hits', 362 sub = subs.add_parser('hits',
341 help = 'list all your HITs') 363 help = 'list all your HITs')
342 sub.set_defaults(f = list_hits, a = lambda: []) 364 sub.set_defaults(f = list_hits, a = lambda: [])
343 365
344 sub = subs.add_parser('new', 366 sub = subs.add_parser('new',
345 help = 'create a new HIT (external questions only)', 367 help = 'create a new HIT (external questions only)',
346 epilog = example_config_file, 368 epilog = example_config_file,
347 formatter_class = argparse.RawDescriptionHelpFormatter) 369 formatter_class = argparse.RawDescriptionHelpFormatter)
348 sub.add_argument('json_path', 370 sub.add_argument('JSON_PATH',
349 help = 'path to JSON configuration file for the HIT') 371 help = 'path to JSON configuration file for the HIT')
350 sub.add_argument('-u', '--question-url', dest = 'question_url', 372 sub.add_argument('-u', '--question-url', dest = 'question_url',
351 metavar = 'URL', 373 metavar = 'URL',
352 help = 'URL for the external question') 374 help = 'URL for the external question')
353 sub.add_argument('-a', '--assignments', dest = 'assignments', 375 sub.add_argument('-a', '--assignments', dest = 'assignments',
354 type = int, metavar = 'N', 376 type = int, metavar = 'N',
355 help = 'number of assignments') 377 help = 'number of assignments')
356 sub.add_argument('-r', '--reward', dest = 'reward', 378 sub.add_argument('-r', '--reward', dest = 'reward',
357 type = float, metavar = 'PRICE', 379 type = float, metavar = 'PRICE',
358 help = 'reward amount, in USD') 380 help = 'reward amount, in USD')
359 sub.set_defaults(f = make_hit, a = lambda: dict( 381 sub.set_defaults(f = make_hit, a = lambda: dict(
360 unjson(args.json_path).items() + [(k, getattr(args, k)) 382 unjson(args.JSON_PATH).items() + [(k, getattr(args, k))
361 for k in ('question_url', 'assignments', 'reward') 383 for k in ('question_url', 'assignments', 'reward')
362 if getattr(args, k) is not None])) 384 if getattr(args, k) is not None]))
363 385
364 sub = subs.add_parser('extend', 386 sub = subs.add_parser('extend',
365 help = 'add assignments or time to a HIT') 387 help = 'add assignments or time to a HIT')
366 sub.add_argument('hit', 388 sub.add_argument('HIT',
367 help = 'nickname or ID of the HIT to extend') 389 help = 'nickname or ID of the HIT to extend')
368 sub.add_argument('-a', '--assignments', dest = 'assignments', 390 sub.add_argument('-a', '--assignments', dest = 'assignments',
369 metavar = 'N', type = int, 391 metavar = 'N', type = int,
370 help = 'number of assignments to add') 392 help = 'number of assignments to add')
371 sub.add_argument('-t', '--time', dest = 'time', 393 sub.add_argument('-t', '--time', dest = 'time',
372 metavar = 'T', 394 metavar = 'T',
373 help = 'amount of time to add to the expiration date') 395 help = 'amount of time to add to the expiration date')
374 sub.set_defaults(f = extend_hit, a = lambda: 396 sub.set_defaults(f = extend_hit, a = lambda:
375 [get_hitid(args.hit), args.assignments, 397 [get_hitid(args.HIT), args.assignments,
376 args.time and parse_duration(args.time)]) 398 args.time and parse_duration(args.time)])
377 399
378 sub = subs.add_parser('expire', 400 sub = subs.add_parser('expire',
379 help = 'force a HIT to expire without deleting it') 401 help = 'force a HIT to expire without deleting it')
380 sub.add_argument('hit', 402 sub.add_argument('HIT',
381 help = 'nickname or ID of the HIT to expire') 403 help = 'nickname or ID of the HIT to expire')
382 sub.set_defaults(f = expire_hit, a = lambda: 404 sub.set_defaults(f = expire_hit, a = lambda:
383 [get_hitid(args.hit)]) 405 [get_hitid(args.HIT)])
384 406
385 sub = subs.add_parser('rm', 407 sub = subs.add_parser('rm',
386 help = 'delete a HIT') 408 help = 'delete a HIT')
387 sub.add_argument('hit', 409 sub.add_argument('HIT',
388 help = 'nickname or ID of the HIT to delete') 410 help = 'nickname or ID of the HIT to delete')
389 sub.set_defaults(f = delete_hit, a = lambda: 411 sub.set_defaults(f = delete_hit, a = lambda:
390 [get_hitid(args.hit)]) 412 [get_hitid(args.HIT)])
391 413
392 sub = subs.add_parser('as', 414 sub = subs.add_parser('as',
393 help = "list a HIT's submitted assignments") 415 help = "list a HIT's submitted assignments")
394 sub.add_argument('hit', 416 sub.add_argument('HIT',
395 help = 'nickname or ID of the HIT to get assignments for') 417 help = 'nickname or ID of the HIT to get assignments for')
396 sub.add_argument('-r', '--reviewable', dest = 'only_reviewable', 418 sub.add_argument('-r', '--reviewable', dest = 'only_reviewable',
397 action = 'store_true', 419 action = 'store_true',
398 help = 'show only unreviewed assignments') 420 help = 'show only unreviewed assignments')
399 sub.set_defaults(f = list_assignments, a = lambda: 421 sub.set_defaults(f = list_assignments, a = lambda:
400 [get_hitid(args.hit), args.only_reviewable]) 422 [get_hitid(args.HIT), args.only_reviewable])
401 423
402 for command, fun, helpmsg in [ 424 for command, fun, helpmsg in [
403 ('approve', approve_assignments, 'approve assignments'), 425 ('approve', approve_assignments, 'approve assignments'),
404 ('reject', reject_assignments, 'reject assignments'), 426 ('reject', reject_assignments, 'reject assignments'),
405 ('unreject', unreject_assignments, 'approve previously rejected assi gnments')]: 427 ('unreject', unreject_assignments, 'approve previously rejected assi gnments')]:
406 sub = subs.add_parser(command, help = helpmsg) 428 sub = subs.add_parser(command, help = helpmsg)
407 sub.add_argument('assignment', nargs = '+', 429 sub.add_argument('ASSIGNMENT', nargs = '+',
408 help = 'ID of an assignment') 430 help = 'ID of an assignment')
409 sub.add_argument('-m', '--message', dest = 'message', 431 sub.add_argument('-m', '--message', dest = 'message',
410 metavar = 'TEXT', 432 metavar = 'TEXT',
411 help = 'feedback message shown to workers') 433 help = 'feedback message shown to workers')
412 sub.set_defaults(f = fun, a = lambda: 434 sub.set_defaults(f = fun, a = lambda:
413 [args.message, args.assignment]) 435 [args.message, args.ASSIGNMENT])
414 436
415 sub = subs.add_parser('bonus', 437 sub = subs.add_parser('bonus',
416 help = 'give some workers a bonus') 438 help = 'give some workers a bonus')
417 sub.add_argument('amount', type = float, 439 sub.add_argument('AMOUNT', type = float,
418 help = 'bonus amount, in USD') 440 help = 'bonus amount, in USD')
419 sub.add_argument('message', 441 sub.add_argument('MESSAGE',
420 help = 'the reason for the bonus (shown to workers in an email sent by M Turk)') 442 help = 'the reason for the bonus (shown to workers in an email sent by M Turk)')
421 sub.add_argument('widaid', nargs = '+', 443 sub.add_argument('WIDAID', nargs = '+',
422 help = 'a WORKER_ID,ASSIGNMENT_ID pair') 444 help = 'a WORKER_ID,ASSIGNMENT_ID pair')
423 sub.set_defaults(f = grant_bonus, a = lambda: 445 sub.set_defaults(f = grant_bonus, a = lambda:
424 [args.message, args.amount, 446 [args.MESSAGE, args.AMOUNT,
425 [p.split(',') for p in args.widaid]]) 447 [p.split(',') for p in args.WIDAID]])
426 448
427 sub = subs.add_parser('notify', 449 sub = subs.add_parser('notify',
428 help = 'send a message to some workers') 450 help = 'send a message to some workers')
429 sub.add_argument('subject', 451 sub.add_argument('SUBJECT',
430 help = 'subject of the message') 452 help = 'subject of the message')
431 sub.add_argument('message', 453 sub.add_argument('MESSAGE',
432 help = 'text of the message') 454 help = 'text of the message')
433 sub.add_argument('worker', nargs = '+', 455 sub.add_argument('WORKER', nargs = '+',
434 help = 'ID of a worker') 456 help = 'ID of a worker')
435 sub.set_defaults(f = notify_workers, a = lambda: 457 sub.set_defaults(f = notify_workers, a = lambda:
436 [args.subject, args.message, args.worker]) 458 [args.SUBJECT, args.MESSAGE, args.WORKER])
459
460 sub = subs.add_parser('give-qual',
461 help = 'give a qualification to some workers')
462 sub.add_argument('QUAL',
463 help = 'ID of the qualification')
464 sub.add_argument('WORKER', nargs = '+',
465 help = 'ID of a worker')
466 sub.add_argument('-v', '--value', dest = 'value',
467 metavar = 'N', type = int, default = 1,
468 help = 'value of the qualification')
469 sub.add_argument('--dontnotify', dest = 'notify',
470 action = 'store_false', default = True,
471 help = "don't notify workers")
472 sub.set_defaults(f = give_qualification, a = lambda:
473 [args.QUAL, args.WORKER, args.value, args.notify])
474
475 sub = subs.add_parser('revoke-qual',
476 help = 'revoke a qualification from some workers')
477 sub.add_argument('QUAL',
478 help = 'ID of the qualification')
479 sub.add_argument('WORKER', nargs = '+',
480 help = 'ID of a worker')
481 sub.add_argument('-m', '--message', dest = 'message',
482 metavar = 'TEXT',
483 help = 'the reason the qualification was revoked (shown to workers in an email sent by MTurk)')
484 sub.set_defaults(f = revoke_qualification, a = lambda:
485 [args.QUAL, args.WORKER, args.message])
437 486
438 args = parser.parse_args() 487 args = parser.parse_args()
439 488
440 init_by_args(args) 489 init_by_args(args)
441 490
442 f = args.f 491 f = args.f
443 a = args.a() 492 a = args.a()
444 if isinstance(a, dict): 493 if isinstance(a, dict):
445 # We do some introspective gymnastics so we can produce a 494 # We do some introspective gymnastics so we can produce a
446 # less incomprehensible error message if some arguments 495 # less incomprehensible error message if some arguments
447 # are missing. 496 # are missing.
448 spec = inspect.getargspec(f) 497 spec = inspect.getargspec(f)
449 missing = set(spec.args[: len(spec.args) - len(spec.defaults)]) - set(a. keys()) 498 missing = set(spec.args[: len(spec.args) - len(spec.defaults)]) - set(a. keys())
450 if missing: 499 if missing:
451 raise ValueError('Missing arguments: ' + ', '.join(missing)) 500 raise ValueError('Missing arguments: ' + ', '.join(missing))
452 doit = lambda: f(**a) 501 doit = lambda: f(**a)
453 else: 502 else:
454 doit = lambda: f(*a) 503 doit = lambda: f(*a)
455 504
456 try: 505 try:
457 x = doit() 506 x = doit()
458 except boto.mturk.connection.MTurkRequestError as e: 507 except boto.mturk.connection.MTurkRequestError as e:
459 print 'MTurk error:', e.error_message 508 print 'MTurk error:', e.error_message
460 sys.exit(1) 509 sys.exit(1)
461 510
462 if x is not None: 511 if x is not None:
463 print x 512 print x
464 513
465 save_nicknames() 514 save_nicknames()
OLDNEW
« no previous file with comments | « third_party/boto/bin/lss3 ('k') | third_party/boto/bin/route53 » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698