def get(self, request): assignment_id = self.request.GET['assignmentId'] worker_id = self.request.GET['workerId'] qualification_id = self.session.config['mturk_hit_settings'].get('grant_qualification_id') use_sandbox=self.session.mturk_use_sandbox if qualification_id and not use_sandbox: # if using sandbox, there is no point in granting quals. # https://groups.google.com/forum/#!topic/otree/aAmqTUF-b60 # don't pass request arg, because we don't want to show a message. # using the fully qualified name because that seems to make mock.patch work mturk_client = otree.views.mturk.get_mturk_client( use_sandbox=use_sandbox) # seems OK to assign this multiple times mturk_client.associate_qualification_with_worker( QualificationTypeId=qualification_id, WorkerId=worker_id, # Mturk complains if I omit IntegerValue IntegerValue=1 ) try: # just check if this worker already game, but # don't filter for assignment, because maybe they already started # and returned the previous assignment # in this case, we should assign back to the same participant # so that we don't get duplicates in the DB, and so people # can't snoop and try the HIT first, then re-try to get a bigger bonus participant = self.session.participant_set.get( mturk_worker_id=worker_id) except Participant.DoesNotExist: with get_redis_lock(name='start_links') or start_link_thread_lock: try: participant = self.session.participant_set.filter( visited=False ).order_by('id')[0] except IndexError: return HttpResponseNotFound(NO_PARTICIPANTS_LEFT_MSG) # 2014-10-17: needs to be here even if it's also set in # the next view to prevent race conditions # this needs to be inside the lock participant.visited = True participant.mturk_worker_id = worker_id # reassign assignment_id, even if they are returning, because maybe they accepted # and then returned, then re-accepted with a different assignment ID # if it's their second time participant.mturk_assignment_id = assignment_id participant.save() return HttpResponseRedirect(participant._start_url())
def get(self, *args, **kwargs): assignment_id = self.request.GET['assignmentId'] worker_id = self.request.GET['workerId'] qualification_id = self.session.config['mturk_hit_settings'].get('grant_qualification_id') if qualification_id: # don't pass request arg, because we don't want to show a message. # using the fully qualified name because that seems to make mock.patch work mturk_client = otree.views.mturk.get_mturk_client( use_sandbox=self.session.mturk_use_sandbox) # seems OK to assign this multiple times mturk_client.associate_qualification_with_worker( QualificationTypeId=qualification_id, WorkerId=worker_id, # Mturk complains if I omit IntegerValue IntegerValue=1 ) try: # just check if this worker already game, but # don't filter for assignment, because maybe they already started # and returned the previous assignment # in this case, we should assign back to the same participant # so that we don't get duplicates in the DB, and so people # can't snoop and try the HIT first, then re-try to get a bigger bonus participant = self.session.participant_set.get( mturk_worker_id=worker_id) except Participant.DoesNotExist: with get_redis_lock(name='start_links') or start_link_thread_lock: try: participant = self.session.participant_set.filter( visited=False ).order_by('id')[0] except IndexError: return HttpResponseNotFound(NO_PARTICIPANTS_LEFT_MSG) # 2014-10-17: needs to be here even if it's also set in # the next view to prevent race conditions # this needs to be inside the lock participant.visited = True participant.mturk_worker_id = worker_id # reassign assignment_id, even if they are returning, because maybe they accepted # and then returned, then re-accepted with a different assignment ID # if it's their second time participant.mturk_assignment_id = assignment_id participant.save() return HttpResponseRedirect(participant._start_url())
def participant_start_page_or_404(session, *, label, cookies=None): '''pass request.session as an arg if you want to get/set a cookie''' with get_redis_lock(name='start_links') or start_link_thread_lock: if cookies is None: participant = get_existing_or_new_participant(session, label) else: participant = get_participant_with_cookie_check(session, cookies) if not participant: return HttpResponseNotFound(NO_PARTICIPANTS_LEFT_MSG) # needs to be here even if it's also set in # the next view to prevent race conditions participant.visited = True if label: participant.label = label participant.save() return HttpResponseRedirect(participant._start_url())
def participant_start_page_or_404(session, *, label, cookies=None): '''pass request.session as an arg if you want to get/set a cookie''' with get_redis_lock(name='start_links') or start_link_thread_lock: if cookies is None: participant = get_existing_or_new_participant(session, label) else: participant = get_participant_with_cookie_check(session, cookies) if not participant: return HttpResponseNotFound(NO_PARTICIPANTS_LEFT_MSG) # needs to be here even if it's also set in # the next view to prevent race conditions participant.visited = True if label: participant.label = label participant.save() return HttpResponseRedirect(participant._start_url())
def dispatch(self, request): get_redis_conn() # why do we do this? session_info = BrowserBotsLauncherSessionCode.objects.first() if session_info: session = Session.objects.get(code=session_info.code) with get_redis_lock(name='start_links') or start_link_thread_lock: participant = session.participant_set.filter( visited=False).order_by('id').first() if not participant: return HttpResponseNotFound(NO_PARTICIPANTS_LEFT_MSG) # 2014-10-17: needs to be here even if it's also set in # the next view to prevent race conditions participant.visited = True participant.save() return HttpResponseRedirect(participant._start_url()) else: ctx = {'view': self, 'title_text': 'Please wait', 'body_text': 'Waiting for browser bots session to begin'} return render(request, "otree/WaitPage.html", ctx)
def dispatch(self, request, *args, **kwargs): get_redis_conn() session_info = BrowserBotsLauncherSessionCode.objects.first() if session_info: session = Session.objects.get(code=session_info.code) with get_redis_lock(name='start_links') or start_link_thread_lock: participant = session.participant_set.filter( visited=False).order_by('id').first() if not participant: return HttpResponseNotFound(NO_PARTICIPANTS_LEFT_MSG) # 2014-10-17: needs to be here even if it's also set in # the next view to prevent race conditions participant.visited = True participant.save() return HttpResponseRedirect(participant._start_url()) else: ctx = {'view': self, 'title_text': 'Please wait', 'body_text': 'Waiting for browser bots session to begin'} return render_to_response("otree/WaitPage.html", ctx)