Example #1
0
def deploy_battery(deployment,battery,context,task_list,template,result,uncompleted_experiments=None,next_page=None):
    '''deploy_battery is a general function for returning the final view to deploy a battery, either local or MTurk
    :param deployment: the kind of deployment, either "docker-local","docker",or "docker-preview"
    :param battery: models.Battery object
    :param context: context, which should already include next_page,
    :param next_page: the next page to navigate to [optional] default is to reload the page to go to the next experiment
    :param task_list: list of models.Experiment instances
    :param template: html template to render
    :param result: the result object, turk.models.Result
    :param uncompleted_experiments: list of uncompleted experiments models.Experiment [optional for preview]
    '''
    if next_page == None:
        next_page = "javascript:window.location.reload();"

    instruction_forms = []

    # !Important: title for consent instructions must be "Consent" - see instructions_modal.html if you change
    if deployment == "docker-preview":
        if battery.advertisement != None: instruction_forms.append({"title":"Advertisement","html":battery.advertisement})
        if battery.consent != None: instruction_forms.append({"title":"Consent","html":battery.consent})

    # if the consent has been defined, add it to the context
    elif deployment in ["docker","docker-local"]:
        if battery.consent != None and len(uncompleted_experiments) == len(battery.experiments.all()):
            instruction_forms.append({"title":"Consent","html":battery.consent})

    # The instructions block is shown for both
    if battery.instructions != None: instruction_forms.append({"title":"Instructions","html":battery.instructions})

    if deployment == "docker-preview":
        context["instruction_forms"] = instruction_forms
    elif deployment in ["docker-local","docker"]:
        # Only add the instructions forms when no experiments are completed
        if len(uncompleted_experiments) == len(battery.experiments.all()):
            context["instruction_forms"] = instruction_forms

    # Get experiment folders
    experiment_folders = [os.path.join(media_dir,"experiments",x.template.exp_id) for x in task_list]
    context["experiment_load"] = get_load_static(experiment_folders,url_prefix="/")

    # Get code to run the experiment (not in external file)
    runcode = get_experiment_run(experiment_folders,deployment=deployment)[task_list[0].template.exp_id]
    if deployment in ["docker","docker-local"]:
        runcode = runcode.replace("{{result.id}}",str(result.id))
        runcode = runcode.replace("{{next_page}}",next_page)
    context["run"] = runcode

    response = render_to_response(template, context)

    # without this header, the iFrame will not render in Amazon
    response['x-frame-options'] = 'this_can_be_anything'
    return response
Example #2
0
def deploy_battery(deployment,battery,experiment_type,context,task_list,template,result,next_page=None,last_experiment=False):
    '''deploy_battery is a general function for returning the final view to deploy a battery, either local or MTurk
    :param deployment: either "docker-mturk" or "docker-local"
    :param battery: models.Battery object
    :param experiment_type: experiments,games,or surveys
    :param context: context, which should already include next_page,
    :param next_page: the next page to navigate to [optional] default is to reload the page to go to the next experiment
    :param task_list: list of models.Experiment instances
    :param template: html template to render
    :param result: the result object, turk.models.Result
    :param last_experiment: boolean if true will redirect the user to a page to submit the result (for surveys)
    '''
    if next_page == None:
        next_page = "javascript:window.location.reload();"
    context["next_page"] = next_page

    # Check the user blacklist status
    try:
        blacklist = Blacklist.objects.get(worker=result.worker,battery=battery)
        if blacklist.active == True:
            return render_to_response("experiments/blacklist.html")
    except:
        pass

    # Get experiment folders
    experiment_folders = [os.path.join(media_dir,experiment_type,x.template.exp_id) for x in task_list]
    context["experiment_load"] = get_load_static(experiment_folders,url_prefix="/")

    # Get code to run the experiment (not in external file)
    runcode = ""

    # Experiments templates
    if experiment_type in ["experiments"]:
        runcode = get_experiment_run(experiment_folders,deployment=deployment)[task_list[0].template.exp_id]
        if result != None:
            runcode = runcode.replace("{{result.id}}",str(result.id))
        runcode = runcode.replace("{{next_page}}",next_page)
    elif experiment_type in ["games"]:
        experiment = load_experiment(experiment_folders[0])
        runcode = experiment[0]["deployment_variables"]["run"]
    elif experiment_type in ["surveys"]:
        experiment = load_experiment(experiment_folders[0])
        resultid = ""
        if result != None:
            resultid = result.id
        runcode,validation = generate_survey(experiment,experiment_folders[0],
                                             form_action="/local/%s/" %resultid,
                                             csrf_token=True)

        # Field will be filled in by browser cookie, and hidden fields are added for data
        csrf_field = '<input type="hidden" name="csrfmiddlewaretoken" value="hello">'
        csrf_field = '%s\n<input type="hidden" name="djstatus" value="FINISHED">' %(csrf_field)
        csrf_field = '%s\n<input type="hidden" name="url" value="chickenfingers">' %(csrf_field)

        runcode = runcode.replace("{% csrf_token %}",csrf_field)
        context["validation"] = validation

        if last_experiment == True:
            context["last_experiment"] = last_experiment

    context["run"] = runcode
    response = render_to_response(template, context)

    # without this header, the iFrame will not render in Amazon
    response['x-frame-options'] = 'this_can_be_anything'
    return response
Example #3
0
def deploy_battery(deployment,
                   battery,
                   experiment_type,
                   context,
                   task_list,
                   template,
                   result,
                   next_page=None,
                   last_experiment=False):
    '''deploy_battery is a general function for returning the final view to deploy a battery, either local or MTurk
    :param deployment: either "docker-mturk" or "docker-local"
    :param battery: models.Battery object
    :param experiment_type: experiments,games,or surveys
    :param context: context, which should already include next_page,
    :param next_page: the next page to navigate to [optional] default is to reload the page to go to the next experiment
    :param task_list: list of models.Experiment instances
    :param template: html template to render
    :param result: the result object, turk.models.Result
    :param last_experiment: boolean if true will redirect the user to a page to submit the result (for surveys)
    '''
    if next_page == None:
        next_page = "javascript:window.location.reload();"
    context["next_page"] = next_page

    # Check the user blacklist status
    try:
        blacklist = Blacklist.objects.get(worker=result.worker,
                                          battery=battery)
        if blacklist.active == True:
            return render_to_response("experiments/blacklist.html")
    except:
        pass

    # Get experiment folders
    experiment_folders = [
        os.path.join(media_dir, experiment_type, x.template.exp_id)
        for x in task_list
    ]
    context["experiment_load"] = get_load_static(experiment_folders,
                                                 url_prefix="/")

    # Get code to run the experiment (not in external file)
    runcode = ""

    # Experiments templates
    if experiment_type in ["experiments"]:
        runcode = get_experiment_run(
            experiment_folders,
            deployment=deployment)[task_list[0].template.exp_id]
        if result != None:
            runcode = runcode.replace("{{result.id}}", str(result.id))
        runcode = runcode.replace("{{next_page}}", next_page)
    elif experiment_type in ["games"]:
        experiment = load_experiment(experiment_folders[0])
        runcode = experiment[0]["deployment_variables"]["run"]
    elif experiment_type in ["surveys"]:
        experiment = load_experiment(experiment_folders[0])
        resultid = ""
        if result != None:
            resultid = result.id
        runcode, validation = generate_survey(experiment,
                                              experiment_folders[0],
                                              form_action="/local/%s/" %
                                              resultid,
                                              csrf_token=True)

        # Field will be filled in by browser cookie, and hidden fields are added for data
        csrf_field = '<input type="hidden" name="csrfmiddlewaretoken" value="hello">'
        csrf_field = '%s\n<input type="hidden" name="djstatus" value="FINISHED">' % (
            csrf_field)
        csrf_field = '%s\n<input type="hidden" name="url" value="chickenfingers">' % (
            csrf_field)

        runcode = runcode.replace("{% csrf_token %}", csrf_field)
        context["validation"] = validation

        if last_experiment == True:
            context["last_experiment"] = last_experiment

    context["run"] = runcode
    response = render_to_response(template, context)

    # without this header, the iFrame will not render in Amazon
    response['x-frame-options'] = 'this_can_be_anything'
    return response