Esempio n. 1
0
def dummy_battery(request,bid):
    '''dummy_battery lets the user run a faux battery (preview)'''

    battery = get_battery(bid,request)
    deployment = "docker-local"

    # Does the worker have experiments remaining?
    task_list = select_experiments(battery,uncompleted_experiments=battery.experiments.all())
    experimentTemplate = ExperimentTemplate.objects.filter(exp_id=task_list[0].template.exp_id)[0]
    experiment_type = get_experiment_type(experimentTemplate)
    task_list = battery.experiments.filter(template=experimentTemplate)
    result = None
    context = {"worker_id": "Dummy Worker"}
    if experiment_type in ["games","surveys"]:
        template = "%s/serve_battery_preview.html" %(experiment_type)
    else:
        template = "%s/serve_battery.html" %(experiment_type)

    return deploy_battery(deployment="docker-preview",
                          battery=battery,
                          experiment_type=experiment_type,
                          context=context,
                          task_list=task_list,
                          template=template,
                          result=result)
Esempio n. 2
0
def dummy_battery(request, bid):
    '''dummy_battery lets the user run a faux battery (preview)'''

    battery = get_battery(bid, request)
    deployment = "docker-local"

    # Does the worker have experiments remaining?
    task_list = select_experiments(
        battery, uncompleted_experiments=battery.experiments.all())
    experimentTemplate = ExperimentTemplate.objects.filter(
        exp_id=task_list[0].template.exp_id)[0]
    experiment_type = get_experiment_type(experimentTemplate)
    task_list = battery.experiments.filter(template=experimentTemplate)
    result = None
    context = {"worker_id": "Dummy Worker"}
    if experiment_type in ["games", "surveys"]:
        template = "%s/serve_battery_preview.html" % (experiment_type)
    else:
        template = "%s/serve_battery.html" % (experiment_type)

    return deploy_battery(deployment="docker-preview",
                          battery=battery,
                          experiment_type=experiment_type,
                          context=context,
                          task_list=task_list,
                          template=template,
                          result=result)
Esempio n. 3
0
def serve_battery(request,bid,userid=None):
    '''prepare for local serve of battery'''

    next_page = None
    battery = get_battery(bid,request)

    # No robots allowed!
    if request.user_agent.is_bot:
        return render_to_response("turk/robot_sorry.html")

    # Is userid not defined, redirect them to preview
    if userid == None:
        return preview_battery(request,bid)

    worker = get_worker(userid,create=False)
    if isinstance(worker,list): # no id means returning []
        return render_to_response("turk/invalid_id_sorry.html")

    # Try to get some info about browser, language, etc.
    browser = "%s,%s" %(request.user_agent.browser.family,request.user_agent.browser.version_string)
    platform = "%s,%s" %(request.user_agent.os.family,request.user_agent.os.version_string)
    deployment = "docker-local"

    # Does the worker have experiments remaining?
    uncompleted_experiments = get_worker_experiments(worker,battery)
    if len(uncompleted_experiments) == 0:
        # Thank you for your participation - no more experiments!
        return render_to_response("turk/worker_sorry.html")

    task_list = select_experiments(battery,uncompleted_experiments)
    experimentTemplate = ExperimentTemplate.objects.filter(exp_id=task_list[0].template.exp_id)[0]
    experiment_type = get_experiment_type(experimentTemplate)
    task_list = battery.experiments.filter(template=experimentTemplate)

    # Generate a new results object for the worker, assignment, experiment
    result,_ = Result.objects.update_or_create(worker=worker,
                                               experiment=experimentTemplate,
                                               battery=battery,
                                               defaults={"browser":browser,"platform":platform})
    result.save()

    context = {"worker_id": worker.id,
               "uniqueId":result.id}

    # If this is the last experiment, the finish button will link to a thank you page.
    if len(uncompleted_experiments) == 1:
        next_page = "/finished"

    # Determine template name based on template_type
    template = "%s/serve_battery.html" %(experiment_type)

    return deploy_battery(deployment="docker-local",
                          battery=battery,
                          experiment_type=experiment_type,
                          context=context,
                          task_list=task_list,
                          template=template,
                          next_page=next_page,
                          result=result)
Esempio n. 4
0
def serve_hit(request,hid):
    '''serve_hit runs the experiment after accepting a hit
    :param hid: the hit id
    :param wid: the worker id
    :param aid: the assignment id
    '''

    # No robots allowed!
    if request.user_agent.is_bot:
        return render_to_response("turk/robot_sorry.html")

    # Not allowed on tablet or phone
    if request.user_agent.is_pc:

        hit =  get_hit(hid,request)

        # Update the hit, only allow to continue if HIT is valid
        hit.update()
        if hit.status in ["D"]:
            return render_to_response("turk/hit_expired.html")

        battery = hit.battery
        aws = get_amazon_variables(request)

        if "" in [aws["worker_id"],aws["hit_id"]]:
            return render_to_response("turk/error_sorry.html")

        # Get Experiment Factory objects for each
        worker = get_worker(aws["worker_id"])

        check_battery_response = check_battery_view(battery, aws["worker_id"])
        if (check_battery_response):
            return check_battery_response

        # This is the submit URL, either external or sandbox
        host = get_host(hit)

        # Only supporting chrome
        if request.user_agent.browser.family != "Chrome":
            return render_to_response("turk/browser_sorry.html")

        # Try to get some info about browser, language, etc.
        browser = "%s,%s" %(request.user_agent.browser.family,request.user_agent.browser.version_string)
        platform = "%s,%s" %(request.user_agent.os.family,request.user_agent.os.version_string)

        # Initialize Assignment object, obtained from Amazon, and Result
        assignment,already_created = Assignment.objects.get_or_create(mturk_id=aws["assignment_id"],
                                                                      worker=worker,
                                                                      hit=hit)

        # if the assignment is new, we need to set up a task to run when the worker time runs out to allocate credit
        if already_created == True:
            assignment.accept_time = datetime.now()
            if hit.assignment_duration_in_hours != None:
                assign_experiment_credit.apply_async([worker.id],countdown=360*(hit.assignment_duration_in_hours))
            assignment.save()

        # Does the worker have experiments remaining for the hit?
        uncompleted_experiments = get_worker_experiments(worker,hit.battery)
        experiments_left = len(uncompleted_experiments)  
        if experiments_left == 0:
            # Thank you for your participation - no more experiments!
            return render_to_response("turk/worker_sorry.html")

        # if it's the last experiment, we will submit the result to amazon (only for surveys)
        last_experiment = False
        if experiments_left == 1:
            last_experiment = True

        task_list = select_experiments(battery,uncompleted_experiments)
        experimentTemplate = ExperimentTemplate.objects.filter(exp_id=task_list[0].template.exp_id)[0]
        experiment_type = get_experiment_type(experimentTemplate)
        task_list = battery.experiments.filter(template=experimentTemplate)
        template = "%s/mturk_battery.html" %(experiment_type)

        # Generate a new results object for the worker, assignment, experiment
        result,_ = Result.objects.update_or_create(worker=worker,
                                                   experiment=experimentTemplate,
                                                   assignment=assignment, # assignment has record of HIT
                                                   battery=hit.battery,
                                                   defaults={"browser":browser,"platform":platform})
        result.save()

        # Add variables to the context
        aws["amazon_host"] = host
        aws["uniqueId"] = result.id

        # If this is the last experiment, the finish button will link to a thank you page.
        if experiments_left == 1:
            next_page = "/finished"

        return deploy_battery(
            deployment="docker-mturk",
            battery=battery,
            experiment_type=experiment_type,
            context=aws,
            task_list=task_list,
            template=template,
            next_page=None,
            result=result,
            last_experiment=last_experiment,
            experiments_left=experiments_left-1
        )

    else:
        return render_to_response("turk/error_sorry.html")
Esempio n. 5
0
def serve_battery(request, bid, userid=None):
    '''prepare for local serve of battery'''

    next_page = None
    battery = get_battery(bid, request)

    # No robots allowed!
    if request.user_agent.is_bot:
        return render_to_response("turk/robot_sorry.html")

    # Is userid not defined, redirect them to preview
    if userid == None:
        return preview_battery(request, bid)

    worker = get_worker(userid, create=False)
    if isinstance(worker, list):  # no id means returning []
        return render_to_response("turk/invalid_id_sorry.html")

    # Try to get some info about browser, language, etc.
    browser = "%s,%s" % (request.user_agent.browser.family,
                         request.user_agent.browser.version_string)
    platform = "%s,%s" % (request.user_agent.os.family,
                          request.user_agent.os.version_string)
    deployment = "docker-local"

    # Does the worker have experiments remaining?
    uncompleted_experiments = get_worker_experiments(worker, battery)
    if len(uncompleted_experiments) == 0:
        # Thank you for your participation - no more experiments!
        return render_to_response("turk/worker_sorry.html")

    task_list = select_experiments(battery, uncompleted_experiments)
    experimentTemplate = ExperimentTemplate.objects.filter(
        exp_id=task_list[0].template.exp_id)[0]
    experiment_type = get_experiment_type(experimentTemplate)
    task_list = battery.experiments.filter(template=experimentTemplate)

    # Generate a new results object for the worker, assignment, experiment
    result, _ = Result.objects.update_or_create(worker=worker,
                                                experiment=experimentTemplate,
                                                battery=battery,
                                                defaults={
                                                    "browser": browser,
                                                    "platform": platform
                                                })
    result.save()

    context = {"worker_id": worker.id, "uniqueId": result.id}

    # If this is the last experiment, the finish button will link to a thank you page.
    if len(uncompleted_experiments) == 1:
        next_page = "/finished"

    # Determine template name based on template_type
    template = "%s/serve_battery.html" % (experiment_type)

    return deploy_battery(deployment="docker-local",
                          battery=battery,
                          experiment_type=experiment_type,
                          context=context,
                          task_list=task_list,
                          template=template,
                          next_page=next_page,
                          result=result)
Esempio n. 6
0
def battery_router(request, bid, eid=None, userid=None, no_send=False):
    '''battery_router will direct the user (determined from the session variable) to an uncompleted experiment. If an
    experiment id is provided, the redirect is being sent from a completed experiment, and we log the experiment as completed
    first. 
    :param bid: the battery id
    :param eid: the experiment id, if provided, means we are submitting a result
    :param userid: the userid, will be "DUMMY" if doing a battery preview
    :param no_send: don't send result to email, default is False
    '''
    # No robots allowed!
    if request.user_agent.is_bot:
        return render_to_response("messages/robot_sorry.html")

    # Is this a valid user?
    preview = False
    if userid != "DUMMY":  # not a preview battery
        userid = request.session.get('worker_id', None)
        if userid == None:
            return render_to_response("messages/invalid_id_sorry.html")
    else:
        # If no_send is defined, then don't send
        preview = True
        no_send = request.session.get('no_send', False)

    worker = get_worker(userid)

    # Retrieve the battery based on the bid
    battery = get_battery(bid, request)

    # If there is a post, we are finishing an experiment and sending data
    if request.method == "POST" and eid != None:

        experiment = get_experiment(eid, request)

        # If it's a survey, format the results before sending
        data = request.POST

        if experiment.template == "survey":
            data = complete_survey_result(experiment, data)

        else:
            data = dict(data)

        # Mark the experiment as completed
        if experiment not in worker.experiments_completed.all():

            # Only send data if the user hasn't completed it yet
            if no_send != True:
                send_result.apply_async([experiment.id, worker.id, data])
            worker.experiments_completed.add(experiment)
            worker.save()

    # Deploy the next experiment
    missing_batteries, blocking_batteries = check_battery_dependencies(
        battery, worker)
    if missing_batteries or blocking_batteries:
        return render_to_response("messages/battery_requirements_not_met.html",
                                  context={
                                      'missing_batteries': missing_batteries,
                                      'blocking_batteries': blocking_batteries
                                  })

    # Is the battery still active?
    if battery.active == False:
        context = {"contact_email": battery.email}
        return render(request, "messages/battery_inactive.html", context)

    # Does the worker have experiments remaining?
    uncompleted_experiments = get_worker_experiments(worker, battery)
    experiments_left = len(uncompleted_experiments)
    if experiments_left == 0:
        # If it's a preview, reset it before showing the final page
        if preview == True:
            reset_preview(request, bid, redirect=False)
        # Thank you for your participation - no more experiments!
        return render_to_response("messages/worker_sorry.html")

    next_experiment = select_experiments(battery, uncompleted_experiments)[0]

    # Redirect the user to the experiment!
    return HttpResponseRedirect(next_experiment.serve_url())