Example #1
0
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)
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)
Example #5
0
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()
Example #6
0
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()
Example #7
0
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)
Example #8
0
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)
Example #9
0
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)
Example #10
0
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()
Example #11
0
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)
Example #12
0
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()