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)
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)
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)
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")
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)
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())