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
def get_experiment_html(experiment, experiment_folder, url_prefix="", deployment="local"): '''get_experiment_html return the html template to test a single experiment :param experiment: the loaded config.json for an experiment (json) :param experiment_folder: the experiment folder, needed for reading in a survey :param url_prefix: prefix to put before paths, in case of custom deployment :param deployment: deployment environment, one of docker, docker-preview, or local [default] ''' css, js = get_stylejs(experiment, url_prefix) validation = "" # JsPsych experiment if experiment[0]["template"] in ["jspsych"]: html = "" runcode = get_experiment_run( experiment, deployment=deployment)[experiment[0]["exp_id"]] template_base = "experiment" # HTML survey elif experiment[0]["template"] in ["survey"]: html, validation = generate_survey(experiment, experiment_folder) runcode = "" template_base = "survey" # Phaser game elif experiment[0]["template"] in ["phaser"]: html = "" runcode = experiment[0]["deployment_variables"]["run"] template_base = "phaser" exp_template = "%s/templates/%s.html" % (get_installdir(), template_base) # Make substitutions exp_template = "".join(open(exp_template, "r").readlines()) exp_template = sub_template(exp_template, "{{js}}", js) exp_template = sub_template(exp_template, "{{css}}", css) exp_template = sub_template(exp_template, "{{run}}", runcode) exp_template = sub_template(exp_template, "{{html}}", html) exp_template = sub_template(exp_template, "{{validation}}", validation) exp_template = sub_template(exp_template, "{{exp_id}}", experiment[0]["exp_id"]) return exp_template
def get_experiment_html(experiment,experiment_folder,url_prefix="",deployment="local"): '''get_experiment_html return the html template to test a single experiment :param experiment: the loaded config.json for an experiment (json) :param experiment_folder: the experiment folder, needed for reading in a survey :param url_prefix: prefix to put before paths, in case of custom deployment :param deployment: deployment environment, one of docker, docker-preview, or local [default] ''' css,js = get_stylejs(experiment,url_prefix) validation = "" # JsPsych experiment if experiment[0]["template"] in ["jspsych"]: html = "" runcode = get_experiment_run(experiment,deployment=deployment)[experiment[0]["exp_id"]] template_base = "experiment" # HTML survey elif experiment[0]["template"] in ["survey"]: html,validation = generate_survey(experiment,experiment_folder) runcode = "" template_base = "survey" # Phaser game elif experiment[0]["template"] in ["phaser"]: html = "" runcode = experiment[0]["deployment_variables"]["run"] template_base = "phaser" exp_template = "%s/templates/%s.html" %(get_installdir(),template_base) # Make substitutions exp_template = "".join(open(exp_template,"r").readlines()) exp_template = sub_template(exp_template,"{{js}}",js) exp_template = sub_template(exp_template,"{{css}}",css) exp_template = sub_template(exp_template,"{{run}}",runcode) exp_template = sub_template(exp_template,"{{html}}",html) exp_template = sub_template(exp_template,"{{validation}}",validation) exp_template = sub_template(exp_template,"{{exp_id}}",experiment[0]["exp_id"]) return exp_template
def test_experiment_run(self): experiment_run = get_experiment_run([self.experiment]) self.assertTrue("test_task" in experiment_run) self.assertTrue( re.search("expfactory_finished", experiment_run["test_task"]) != None)
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
def test_experiment_run(self): experiment_run = get_experiment_run([self.experiment]) self.assertTrue("test_task" in experiment_run) self.assertTrue(re.search("expfactory_finished",experiment_run["test_task"])!=None)
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