def form_valid(self, form): pre_create_id = uuid.uuid4().hex kwargs = { 'session_config_name': form.cleaned_data['session_config'], '_pre_create_id': pre_create_id, 'for_mturk': self.for_mturk } if self.for_mturk: kwargs['num_participants'] = ( form.cleaned_data['num_participants'] * settings.MTURK_NUM_PARTICIPANTS_MULT ) else: kwargs['num_participants'] = form.cleaned_data['num_participants'] # TODO: # Refactor when we upgrade to push if hasattr(self, "room"): kwargs['room'] = self.room channels_group_name = channels_create_session_group_name( pre_create_id) channels.Channel('otree.create_session').send({ 'kwargs': kwargs, 'channels_group_name': channels_group_name }) wait_for_session_url = reverse( 'wait_for_session', args=(pre_create_id,) ) return HttpResponseRedirect(wait_for_session_url)
def dispatch(self, request, *args, **kwargs): session_config_name = kwargs['session_config'] try: session_config = SESSION_CONFIGS_DICT[session_config_name] except KeyError: msg = ("Session config '{}' not found").format(session_config_name) raise Http404(msg) # check that it divides evenly # need to check here so that the user knows upfront session_lcm = otree.session.get_lcm(session_config) num_participants = session_config['num_demo_participants'] if num_participants % session_lcm: msg = ('Session Config {}: Number of participants ({}) does not ' 'divide evenly into group size ({})').format( session_config_name, num_participants, session_lcm) raise Http404(msg) pre_create_id = uuid.uuid4().hex kwargs = { 'special_category': constants.session_special_category_demo, 'session_config_name': session_config_name, '_pre_create_id': pre_create_id, } channels_group_name = channels_create_session_group_name(pre_create_id) channels.Channel('otree.create_session').send({ 'kwargs': kwargs, 'channels_group_name': channels_group_name }) wait_for_session_url = reverse('wait_for_session', args=(pre_create_id, )) return HttpResponseRedirect(wait_for_session_url)
def form_valid(self, form): pre_create_id = uuid.uuid4().hex kwargs = { 'session_config_name': form.cleaned_data['session_config'], '_pre_create_id': pre_create_id, 'for_mturk': self.for_mturk } if self.for_mturk: kwargs['num_participants'] = ( form.cleaned_data['num_participants'] * settings.MTURK_NUM_PARTICIPANTS_MULT) else: kwargs['num_participants'] = form.cleaned_data['num_participants'] # TODO: # Refactor when we upgrade to push if hasattr(self, "room"): kwargs['room'] = self.room channels_group_name = channels_create_session_group_name(pre_create_id) channels.Channel('otree.create_session').send({ 'kwargs': kwargs, 'channels_group_name': channels_group_name }) wait_for_session_url = reverse('wait_for_session', args=(pre_create_id, )) return HttpResponseRedirect(wait_for_session_url)
def connect_wait_for_session(message, pre_create_id): group = Group(channels_create_session_group_name(pre_create_id)) group.add(message.reply_channel) # in case message was sent before this web socket connects if Session.objects.filter(_pre_create_id=pre_create_id): group.send({'text': json.dumps({'status': 'ready'})}) elif FailedSessionCreation.objects.filter( pre_create_id=pre_create_id).exists(): group.send({ 'text': json.dumps( {'error': 'Failed to create session. Check the server logs.'}) })
def connect_wait_for_session(message, pre_create_id): group = Group(channels_create_session_group_name(pre_create_id)) group.add(message.reply_channel) # in case message was sent before this web socket connects if Session.objects.filter(_pre_create_id=pre_create_id): group.send( {'text': json.dumps( {'status': 'ready'})} ) elif FailedSessionCreation.objects.filter( pre_create_id=pre_create_id ).exists(): group.send( {'text': json.dumps( {'error': 'Failed to create session. Check the server logs.'})} )
def dispatch(self, request, *args, **kwargs): session_config_name = kwargs['session_config'] try: session_config = SESSION_CONFIGS_DICT[session_config_name] except KeyError: msg = ( "Session config '{}' not found" ).format(session_config_name) raise Http404(msg) # check that it divides evenly # need to check here so that the user knows upfront session_lcm = otree.session.get_lcm(session_config) num_participants = session_config['num_demo_participants'] if num_participants % session_lcm: msg = ( 'Session Config {}: Number of participants ({}) does not ' 'divide evenly into group size ({})' ).format( session_config_name, num_participants, session_lcm ) raise Http404(msg) pre_create_id = uuid.uuid4().hex kwargs = { 'special_category': constants.session_special_category_demo, 'session_config_name': session_config_name, '_pre_create_id': pre_create_id, } channels_group_name = channels_create_session_group_name( pre_create_id) channels.Channel('otree.create_session').send({ 'kwargs': kwargs, 'channels_group_name': channels_group_name }) wait_for_session_url = reverse( 'wait_for_session', args=(pre_create_id,) ) return HttpResponseRedirect(wait_for_session_url)
def connect_wait_for_session(message, pre_create_id): group = Group(channels_create_session_group_name(pre_create_id)) group.add(message.reply_channel) # in case message was sent before this web socket connects if Session.objects.filter(_pre_create_id=pre_create_id, ready=True): group.send( {'text': json.dumps( {'status': 'ready'})} ) else: failures = FailedSessionCreation.objects.filter( pre_create_id=pre_create_id ) if failures: failure = failures[0] group.send( {'text': json.dumps( {'error': failure.message})} )
def connect_wait_for_session(message, pre_create_id): group = Group(channels_create_session_group_name(pre_create_id)) group.add(message.reply_channel) # in case message was sent before this web socket connects if Session.objects.filter(_pre_create_id=pre_create_id, ready=True): group.send( {'text': json.dumps( {'status': 'ready'})} ) else: failure = FailedSessionCreation.objects.filter( pre_create_id=pre_create_id ).first() if failure: group.send( {'text': json.dumps( {'error': failure.message, 'traceback': failure.traceback})} )
def group_name(self, pre_create_id): return channels_create_session_group_name(pre_create_id)
def disconnect_wait_for_session(message, pre_create_id): group = Group( channels_create_session_group_name(pre_create_id) ) group.discard(message.reply_channel)