def serve_battery(request,bid,userid=None): battery = get_battery(bid,request) next_page = None uncompleted_experiments=None result=None # No robots allowed! if request.user_agent.is_bot: return render_to_response("robot_sorry.html") # Is userid not defined, this is a preview if userid == None: template = "serve_battery_preview.html" task_list = [battery.experiments.all()[0]] context = dict() deployment = "docker-preview" # admin a battery for a new user else: template = "serve_battery.html" worker = get_worker(userid) # 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 for the hit? uncompleted_experiments = get_worker_experiments(worker,battery) if len(uncompleted_experiments) == 0: # Thank you for your participation - no more experiments! return render_to_response("worker_sorry.html") task_list = select_random_n(uncompleted_experiments,1) experimentTemplate = ExperimentTemplate.objects.filter(exp_id=task_list[0])[0] 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" return deploy_battery(deployment=deployment, battery=battery, context=context, task_list=task_list, template=template, uncompleted_experiments=uncompleted_experiments, next_page=next_page, result=result)
def serve_hit(request,hid): next_page=None uncompleted_experiments = None result = None # No robots allowed! if request.user_agent.is_bot: return render_to_response("robot_sorry.html") if request.user_agent.is_pc: hit = get_hit(hid,request) battery = hit.battery # This is the submit URL, either external or sandbox host = get_host() # An assignmentID means that the worker has accepted the task assignment_id = request.GET.get("assignmentId","") # worker has not accepted the task if assignment_id in ["ASSIGNMENT_ID_NOT_AVAILABLE",""]: template = "mturk_battery_preview.html" task_list = [battery.experiments.all()[0]] context = dict() deployment = "docker-preview" # worker has accepted the task else: template = "mturk_battery.html" worker_id = request.GET.get("workerId","") hit_id = request.GET.get("hitId","") turk_submit_to = request.GET.get("turkSubmitTo","") if "" in [worker_id,hit_id]: return render_to_response("error_sorry.html") # Get Experiment Factory objects for each worker = get_worker(worker_id) # 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" # Initialize Assignment object, obtained from Amazon, and Result assignment,already_created = Assignment.objects.get_or_create(mturk_id=assignment_id,hit=hit,worker=worker) # 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 == False: assign_experiment_credit.apply_async(countdown=hit.assignment_duration_in_seconds) assignment.save() # Does the worker have experiments remaining for the hit? uncompleted_experiments = get_worker_experiments(worker,hit.battery) if len(uncompleted_experiments) == 0: # Thank you for your participation - no more experiments! return render_to_response("worker_sorry.html") task_list = select_random_n(uncompleted_experiments,1) experimentTemplate = ExperimentTemplate.objects.filter(exp_id=task_list[0])[0] 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, assignment=assignment, # assignment has record of HIT battery=hit.battery, defaults={"browser":browser,"platform":platform}) result.save() context = { "worker_id": worker_id, "assignment_id": assignment_id, "amazon_host": host, "hit_id": hit_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" return deploy_battery(deployment=deployment, battery=battery, context=context, task_list=task_list, template=template, uncompleted_experiments=uncompleted_experiments, next_page=next_page, result=result) else: return render_to_response("pc_sorry.html")