def expire_hittype(session, hittype_id): """Expire all HITs for HIT type.""" hittype = session.query(database.HITType) \ .filter_by(id=hittype_id) \ .one() connection = get_mturk_connection(hittype.sandbox) raise NotImplementedError() return jsonify(status='ok', id=hittype_id)
def reject(session, assignment_id): """Reject an assignment.""" assignment = session.query(database.Assignment) \ .filter_by(id=assignment_id) \ .one() connection = get_mturk_connection(assignment.HIT.HITType.sandbox) connection.reject_assignment(assignment.assignmentid) assignment.status = 'Rejected' assignment.abandoned = False session.flush() session.commit() return jsonify(status='ok', id=assignment_id)
def gc_pending(session, sandbox): """Goes though our DB and purges any non-existant pending assignments.""" connection = get_mturk_connection(sandbox) # pylint: disable-msg=E1101 labeler_assignments = session.query(database.Assignment) \ .join(database.HIT) \ .join(database.HITType) \ .filter(database.Assignment.status == 'Pending') \ .filter(database.HITType.sandbox == sandbox) # pylint: enable-msg=E1101 for labeler_assignment in labeler_assignments: try: connection.get_assignment(labeler_assignment.assignmentid) except: labeler_assignment.abandoned = True session.flush() session.commit()
def approve_hittype(session, hittype_id): """Approve all HITs for HIT type.""" hittype = session.query(database.HITType) \ .filter_by(id=hittype_id) \ .one() connection = get_mturk_connection(hittype.sandbox) for hit in hittype.hits: for assignment in hit.assignments: if assignment.status != 'Approved': try: connection.approve_assignment(assignment.assignmentid) assignment.status = 'Approved' assignment.abandoned = False except MTurkRequestError: pass session.flush() session.commit() return jsonify(status='ok', id=hittype_id)
def order(session): """Order new MTurk HITs.""" parser = reqparse.RequestParser() parser.add_argument('title', type=str, required=True) parser.add_argument('description', type=str, required=True) parser.add_argument('task', type=str, required=True) parser.add_argument('keywords', type=str, required=True) parser.add_argument('reward', type=float, required=True) parser.add_argument('duration', type=int, required=True) parser.add_argument('quota', type=int, required=True) parser.add_argument('limit', type=int, required=True) parser.add_argument('batch', type=int, required=True) #parser.add_argument('pin', None, type=int) #parser.add_argument('approval_delay', type=str) parser.add_argument('sandbox', type=str, required=True) args = parser.parse_args() if not args.sandbox: if args.pin is None: return 'pin required', 400 if not authenticate(APP.config['TWO_FACTOR_SECRET'], args.pin): return 'authentication failed', 400 connection = get_mturk_connection(args.sandbox) duration = datetime.timedelta(minutes=args.duration) hittype = session.query(database.HITType) \ .filter_by( title=args.title, description=args.description, keywords=args.keywords, reward=args.reward, duration=duration, approval_delay=None, sandbox=args.sandbox ).first() if hittype is None: if args.sandbox: qual_req = None else: num_approved = NumberHitsApprovedRequirement( 'GreaterThanOrEqualTo', 1000) percent_approved = PercentAssignmentsApprovedRequirement( 'GreaterThanOrEqualTo', 97) qual_req = Qualifications([ num_approved, percent_approved, ]) hit_type = connection.register_hit_type( title=args.title, description=args.description, reward=args.reward, duration=60 * args.duration, keywords=args.keywords, approval_delay=None, qual_req=qual_req, ) hittype = database.HITType( hittypeid=hit_type[0].HITTypeId, title=args.title, description=args.description, keywords=args.keywords, reward=args.reward, duration=duration, approval_delay=None, sandbox=args.sandbox, ignore=False, ) session.add(hittype) hittype.ignore = False db_type = { 'clicker': database.ClickSession, 'bbox': database.BoundingBoxSession, 'approve_pairs': database.ApprovePairSession, 'labeler': database.Annotation, 'occlusion': database.OcclusionRanking, 'daynight': database.DayNight, }[args.task] hit_factory = { 'clicker': create_photo_hit, 'bbox': create_vehicle_hit_num(1), 'approve_pairs': create_approve_pair_hit, 'labeler': create_photo_hit, 'occlusion': create_vehicle_hit_num(24), 'daynight': create_photo_hit, }[args.task] hit_factory( session, connection, hittype, db_type, args.quota, args.batch, args.limit, args.task, ) session.flush() # pylint: disable-msg=E1101,E1103 hittype_id = hittype.id # pylint: enable-msg=E1101,E1103 session.commit() return jsonify(status='ok', id=hittype_id)
def sync_mturk(session, sandbox): """Imports the current state of mturk to make sure we are in sync.""" connection = get_mturk_connection(sandbox) mturk_hits = connection.get_all_hits() for mturk_hit in mturk_hits: labeler_hittype = session.query(database.HITType) \ .filter_by(hittypeid=mturk_hit.HITTypeId) \ .first() if labeler_hittype is None: print('Creating HITType ' + mturk_hit.HITTypeId) labeler_hittype = database.HITType( hittypeid=mturk_hit.HITTypeId, title=mturk_hit.Title, description=mturk_hit.Description, reward=float(mturk_hit.Amount), duration=datetime.timedelta( seconds=int(mturk_hit.AssignmentDurationInSeconds)), keywords=mturk_hit.Keywords, approval_delay=datetime.timedelta( seconds=int(mturk_hit.AutoApprovalDelayInSeconds)), sandbox=sandbox, ) session.add(labeler_hittype) labeler_hit = session.query(database.HIT) \ .filter_by(hitid=mturk_hit.HITId) \ .first() if labeler_hit is None: print('Creating HIT ' + mturk_hit.HITId) creation = dateutil.parser.parse(mturk_hit.CreationTime) expiration = dateutil.parser.parse(mturk_hit.Expiration) labeler_hit = database.HIT( hitid=mturk_hit.HITId, creation=creation, lifetime=expiration - creation, max_assignments=mturk_hit.MaxAssignments, HITType=labeler_hittype, ) session.add(labeler_hit) mturk_assignments = connection.get_assignments(mturk_hit.HITId) for mturk_assigment in mturk_assignments: labeler_assignment = session.query(database.Assignment) \ .filter_by(assignmentid=mturk_assigment.AssignmentId) \ .first() if labeler_assignment is None: labeler_user = session.query(database.User) \ .filter_by(username=mturk_assigment.WorkerId) \ .first() if labeler_user is None: print('Creating user ' + mturk_assigment.WorkerId) labeler_user = database.User( username=mturk_assigment.WorkerId, lastactivity=datetime.datetime.now(), ) session.add(labeler_user) print('Creating Assignment ' + mturk_assigment.AssignmentId) labeler_assignment = database.Assignment( user=labeler_user, assignmentid=mturk_assigment.AssignmentId, HIT=labeler_hit, status=mturk_assigment.AssignmentStatus, ) session.add(labeler_assignment) if labeler_assignment.status != mturk_assigment.AssignmentStatus: print('Recorded Status: %s, Actual Status: %s' % (labeler_assignment.status, mturk_assigment.AssignmentStatus)) labeler_assignment.status = mturk_assigment.AssignmentStatus session.flush() session.commit()
def order(session): """Order new MTurk HITs.""" parser = reqparse.RequestParser() parser.add_argument('title', type=str, required=True) parser.add_argument('description', type=str, required=True) parser.add_argument('task', type=str, required=True) parser.add_argument('keywords', type=str, required=True) parser.add_argument('reward', type=float, required=True) parser.add_argument('duration', type=int, required=True) parser.add_argument('quota', type=int, required=True) parser.add_argument('limit', type=int, required=True) parser.add_argument('batch', type=int, required=True) #parser.add_argument('pin', None, type=int) #parser.add_argument('approval_delay', type=str) parser.add_argument('sandbox', type=str, required=True) args = parser.parse_args() if not args.sandbox: if args.pin is None: return 'pin required', 400 if not authenticate(APP.config['TWO_FACTOR_SECRET'], args.pin): return 'authentication failed', 400 connection = get_mturk_connection(args.sandbox) duration = datetime.timedelta(minutes=args.duration) hittype = session.query(database.HITType) \ .filter_by( title=args.title, description=args.description, keywords=args.keywords, reward=args.reward, duration=duration, approval_delay=None, sandbox=args.sandbox ).first() if hittype is None: if args.sandbox: qual_req = None else: num_approved = NumberHitsApprovedRequirement( 'GreaterThanOrEqualTo', 1000 ) percent_approved = PercentAssignmentsApprovedRequirement( 'GreaterThanOrEqualTo', 97 ) qual_req = Qualifications([ num_approved, percent_approved, ]) hit_type = connection.register_hit_type( title=args.title, description=args.description, reward=args.reward, duration=60 * args.duration, keywords=args.keywords, approval_delay=None, qual_req=qual_req, ) hittype = database.HITType( hittypeid=hit_type[0].HITTypeId, title=args.title, description=args.description, keywords=args.keywords, reward=args.reward, duration=duration, approval_delay=None, sandbox=args.sandbox, ignore=False, ) session.add(hittype) hittype.ignore = False db_type = { 'clicker': database.ClickSession, 'bbox': database.BoundingBoxSession, 'approve_pairs': database.ApprovePairSession, 'labeler': database.Annotation, 'occlusion': database.OcclusionRanking, 'daynight': database.DayNight, }[args.task] hit_factory = { 'clicker': create_photo_hit, 'bbox': create_vehicle_hit_num(1), 'approve_pairs': create_approve_pair_hit, 'labeler': create_photo_hit, 'occlusion': create_vehicle_hit_num(24), 'daynight': create_photo_hit, }[args.task] hit_factory( session, connection, hittype, db_type, args.quota, args.batch, args.limit, args.task, ) session.flush() # pylint: disable-msg=E1101,E1103 hittype_id = hittype.id # pylint: enable-msg=E1101,E1103 session.commit() return jsonify(status='ok', id=hittype_id)
def sync_mturk(session, sandbox): """Imports the current state of mturk to make sure we are in sync.""" connection = get_mturk_connection(sandbox) mturk_hits = connection.get_all_hits() for mturk_hit in mturk_hits: labeler_hittype = session.query(database.HITType) \ .filter_by(hittypeid=mturk_hit.HITTypeId) \ .first() if labeler_hittype is None: print('Creating HITType ' + mturk_hit.HITTypeId) labeler_hittype = database.HITType( hittypeid=mturk_hit.HITTypeId, title=mturk_hit.Title, description=mturk_hit.Description, reward=float(mturk_hit.Amount), duration=datetime.timedelta( seconds=int(mturk_hit.AssignmentDurationInSeconds) ), keywords=mturk_hit.Keywords, approval_delay=datetime.timedelta( seconds=int(mturk_hit.AutoApprovalDelayInSeconds) ), sandbox=sandbox, ) session.add(labeler_hittype) labeler_hit = session.query(database.HIT) \ .filter_by(hitid=mturk_hit.HITId) \ .first() if labeler_hit is None: print('Creating HIT ' + mturk_hit.HITId) creation = dateutil.parser.parse(mturk_hit.CreationTime) expiration = dateutil.parser.parse(mturk_hit.Expiration) labeler_hit = database.HIT( hitid=mturk_hit.HITId, creation=creation, lifetime=expiration - creation, max_assignments=mturk_hit.MaxAssignments, HITType=labeler_hittype, ) session.add(labeler_hit) mturk_assignments = connection.get_assignments(mturk_hit.HITId) for mturk_assigment in mturk_assignments: labeler_assignment = session.query(database.Assignment) \ .filter_by(assignmentid=mturk_assigment.AssignmentId) \ .first() if labeler_assignment is None: labeler_user = session.query(database.User) \ .filter_by(username=mturk_assigment.WorkerId) \ .first() if labeler_user is None: print('Creating user ' + mturk_assigment.WorkerId) labeler_user = database.User( username=mturk_assigment.WorkerId, lastactivity=datetime.datetime.now(), ) session.add(labeler_user) print('Creating Assignment ' + mturk_assigment.AssignmentId) labeler_assignment = database.Assignment( user=labeler_user, assignmentid=mturk_assigment.AssignmentId, HIT=labeler_hit, status=mturk_assigment.AssignmentStatus, ) session.add(labeler_assignment) if labeler_assignment.status != mturk_assigment.AssignmentStatus: print('Recorded Status: %s, Actual Status: %s' % ( labeler_assignment.status, mturk_assigment.AssignmentStatus )) labeler_assignment.status = mturk_assigment.AssignmentStatus session.flush() session.commit()