from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants #from scipy.stats import hypergeom from math import factorial import random ''' this part defines functions that I will use in the main code ''' def round_nearest(x, a=0.05): return round(x / a) * a def hypergeo(N, K, n, k): prob_upd=0 for j in range(k, n+1): prob_upd=prob_upd+(factorial(K)*factorial(N-K)*factorial(n)*factorial(N-n))/(factorial(j)*factorial(K-j)*factorial(n-j)*factorial(N-K-n+j)*factorial(N)) return prob_upd ''' the main code goes here ''' class welcome_page(Page): def is_displayed(self): return [ self.round_number ==1 ][0] class first_page(Page): def is_displayed(self): return [(self.round_number >=1 and self.round_number<=Constants.start_scenario_1) \ or (self.round_number>=Constants.start_second_part and self.round_number<=Constants.start_scenario_2)][0] form_model="player" form_fields=["bet"] def vars_for_template(self): self.player.initial_prob=hypergeo(Constants.var_length, Constants.suns_hidden, \ (Constants.open_first_stage+Constants.open_second_stage), \ self.player.smile_needed) lists=[list(range(1,7)), list(range(7,14)), list(range(14,21)), list(range(21,28)), list(range(28,Constants.var_length+1))] return { 'initial_prob': round_nearest(self.player.initial_prob*100), "lists" : lists, } def before_next_page(self): self.player.possible_win=self.player.bet/self.player.initial_prob self.player.ticket_string=str(self.participant.vars['ticket'][0]) if self.player.bet==0: self.player.player_status=True self.player.offer=0 else: self.player.player_status=False if self.round_number==Constants.start_scenario_1 or self.round_number==Constants.start_scenario_2: if self.player.bet==0: self.participant.vars['scenario_status']=True else: self.participant.vars['scenario_status']=False class MyPage(Page): def is_displayed(self): return [((self.round_number >=1 and self.round_number<=Constants.start_scenario_1) \ or (self.round_number>=Constants.start_second_part and self.round_number<=Constants.start_scenario_2)) \ and self.player.player_status==False][0] form_model="player" def get_form_fields(self): return ['num_{}'.format(i) for i in range(1, Constants.var_length+1)] def error_message(self, values): print('values is', values) if sum(values.values()) != Constants.open_first_stage: return 'you must unlock exactly '+str(Constants.open_first_stage)+ ' calendar days' def vars_for_template(self): cell_id=['cell_{}'.format(i) for i in range(1, Constants.var_length+1)] val_id=['val_{}'.format(i) for i in range(1, Constants.var_length+1)] var_name_id=['num_{}'.format(i) for i in range(1, Constants.var_length+1)] num_name=[] for i in range(1, Constants.var_length+1): num_name.append(eval('self.player.num_'+str(i))) cell_1=[cell_id[i] for i in range(6)] var_1=[val_id[i] for i in range(6)] var_name_1=[var_name_id[i] for i in range(6)] num_name_1=[num_name[i] for i in range(6)] cell_2=[cell_id[i] for i in range(6, 13)] var_2=[val_id[i] for i in range(6, 13)] var_name_2=[var_name_id[i] for i in range(6, 13)] num_name_2=[num_name[i] for i in range(6, 13)] cell_3=[cell_id[i] for i in range(13, 20)] var_3=[val_id[i] for i in range(13, 20)] var_name_3=[var_name_id[i] for i in range(13, 20)] num_name_3=[num_name[i] for i in range(13, 20)] cell_4=[cell_id[i] for i in range(20, 27)] var_4=[val_id[i] for i in range(20, 27)] var_name_4=[var_name_id[i] for i in range(20, 27)] num_name_4=[num_name[i] for i in range(20, 27)] cell_5=[cell_id[i] for i in range(27, Constants.var_length)] var_5=[val_id[i] for i in range(27, Constants.var_length)] var_name_5=[var_name_id[i] for i in range(27, Constants.var_length)] num_name_5=[num_name[i] for i in range(27, Constants.var_length)] L_1=zip(cell_1, var_1, var_name_1, num_name_1, list(range(1,7))) L_2=zip(cell_2, var_2, var_name_2, num_name_2, list(range(7,14))) L_3=zip(cell_3, var_3, var_name_3, num_name_3, list(range(14,21))) L_4=zip(cell_4, var_4, var_name_4, num_name_4, list(range(21,28))) L_5=zip(cell_5, var_5, var_name_5, num_name_5, list(range(28,Constants.var_length+1))) lists=[L_1, L_2, L_3, L_4, L_5] return { 'initial_prob': round_nearest(self.player.initial_prob*100), "lists" : lists, "possible_win" : round_nearest(self.player.possible_win), "number_of_trils": Constants.open_first_stage+Constants.open_second_stage } def before_next_page(self): if (self.round_number=Constants.start_second_part and self.round_number0): self.player.updated_prob_1=hypergeo(Constants.var_length-Constants.open_first_stage, \ Constants.suns_hidden-self.player.correct_guess_after_1, \ Constants.open_second_stage, \ self.player.smile_needed-self.player.correct_guess_after_1) self.player.offer=self.player.bet*self.player.updated_prob_1/self.player.initial_prob elif self.player.smile_needed-self.player.correct_guess_after_1<=0: self.player.updated_prob_1=1 self.player.offer=self.player.bet/self.player.initial_prob else: self.player.updated_prob_1=0 self.player.offer=0 self.player.check_status() else: self.player.check_chosen() class wait_page_for_scenarios(Page): def is_displayed(self): return [((self.round_number >=Constants.start_scenario_1 and self.round_number<=Constants.start_second_part-2) or (self.round_number>=Constants.start_scenario_2 and self.round_number<=Constants.start_lottery-2)) \ and self.participant.vars['scenario_status']==False][0] def vars_for_template(self): if self.round_number<=Constants.start_second_part-2: scenario_num=self.round_number -Constants.start_scenario_1+1 elif (self.round_number>=Constants.start_scenario_2 and self.round_number<=Constants.start_lottery-2): scenario_num=self.round_number -Constants.start_scenario_2+1 return{ "scenario_num" : scenario_num } def before_next_page(self): if (self.round_number ==Constants.start_scenario_1 \ or self.round_number==Constants.start_scenario_2): self.player.check_correct() self.participant.vars['correct_for_real_round']=0 for i in range(1, Constants.var_length+1): self.participant.vars['correct_for_real_round'] += self.participant.vars['correct'][i-1] self.participant.vars['real_correct_list']=self.participant.vars['correct'][:] if self.player.smile_needed==5: scenarios=list(range(1, 6)) elif self.player.smile_needed==6: scenarios=list(range(0, 5)) random.shuffle(scenarios) self.participant.vars['scenarios']=scenarios[:] else: self.player.bet=self.player.in_round(self.round_number - 1).bet self.player.initial_prob=self.player.in_round(self.round_number - 1).initial_prob self.player.possible_win=self.player.in_round(self.round_number - 1).possible_win self.participant.vars['scenarios'].remove(self.participant.vars['scenarios'][0]) self.player.scenario=self.participant.vars['scenarios'][0] if 5-self.player.scenario==self.participant.vars['correct_for_real_round']: self.participant.vars['correct']=self.participant.vars['real_correct_list'] else: list_for_correct=self.participant.vars['is_chosen'][:] L_1=[] for index, item in enumerate(list_for_correct): if item==1: L_1.append(index) change_those=random.sample(L_1, self.player.scenario) for to_change in change_those: list_for_correct[to_change]=0 self.participant.vars['correct']=list_for_correct[:] self.player.correct_string_1=str(self.participant.vars['correct']) self.player.chosen_string_1=str(self.participant.vars['is_chosen']) self.player.correct_guess_after_1=0 for i in range(1, Constants.var_length+1): self.player.correct_guess_after_1 += self.participant.vars['correct'][i-1] if (self.player.smile_needed-self.player.correct_guess_after_1<=Constants.open_second_stage \ and self.player.smile_needed-self.player.correct_guess_after_1>0): self.player.updated_prob_1=hypergeo(Constants.var_length-Constants.open_first_stage, \ Constants.suns_hidden-self.player.correct_guess_after_1, \ Constants.open_second_stage, \ self.player.smile_needed-self.player.correct_guess_after_1) self.player.offer=self.player.bet*self.player.updated_prob_1/self.player.initial_prob elif self.player.smile_needed-self.player.correct_guess_after_1<=0: self.player.updated_prob_1=1 self.player.offer=self.player.bet/self.player.initial_prob else: self.player.updated_prob_1=0 self.player.offer=0 class Scenarios(Page): def is_displayed(self): return [((self.round_number >=Constants.start_scenario_1 and self.round_number<=Constants.start_second_part-2) or (self.round_number>=Constants.start_scenario_2 and self.round_number<=Constants.start_lottery-2)) \ and self.participant.vars['scenario_status']==False][0] form_model='player' form_fields=['offer_accapted',] def vars_for_template(self): chosen_name=[] for i in range(1, Constants.var_length+1): chosen_name.append(self.participant.vars['is_chosen'][i-1]) correct_name=[] for i in range(1, Constants.var_length+1): correct_name.append(self.participant.vars['correct'][i-1]) chosen_name_1=[chosen_name[i] for i in range(6)] correct_name_1=[correct_name[i] for i in range(6)] chosen_name_2=[chosen_name[i] for i in range(6, 13)] correct_name_2=[correct_name[i] for i in range(6, 13)] chosen_name_3=[chosen_name[i] for i in range(13, 20)] correct_name_3=[correct_name[i] for i in range(13, 20)] chosen_name_4=[chosen_name[i] for i in range(20, 27)] correct_name_4=[correct_name[i] for i in range(20, 27)] chosen_name_5=[chosen_name[i] for i in range(27, Constants.var_length)] correct_name_5=[correct_name[i] for i in range(27, Constants.var_length)] L_1=zip(chosen_name_1, correct_name_1, list(range(1,7))) L_2=zip(chosen_name_2, correct_name_2, list(range(7,14))) L_3=zip(chosen_name_3, correct_name_3, list(range(14,21))) L_4=zip(chosen_name_4, correct_name_4, list(range(21,28))) L_5=zip(chosen_name_5, correct_name_5, list(range(28,Constants.var_length+1))) lists=[L_1, L_2, L_3, L_4, L_5] if self.round_number<=Constants.start_second_part-2: scenario_num=self.round_number -Constants.start_scenario_1+1 elif (self.round_number>=Constants.start_scenario_2 and self.round_number<=Constants.start_lottery-2): scenario_num=self.round_number -Constants.start_scenario_2+1 return { 'offer': round_nearest(self.player.offer), "possible_win" : round_nearest(self.player.possible_win), 'updated_prob_1': round_nearest(self.player.updated_prob_1*100), 'smile_left': self.player.smile_needed-self.player.correct_guess_after_1, 'smile_left_total': Constants.suns_hidden-self.player.correct_guess_after_1, 'cloud_left_total':Constants.clouds_hidden-(Constants.open_first_stage-self.player.correct_guess_after_1), "lists" : lists, 'scenario': 5-self.player.scenario, "scenario_num" : scenario_num } def before_next_page(self): if self.player.bet>0: a=[] a.append(round(self.player.initial_prob, 4)) a.append(round(self.player.updated_prob_1, 4)) a.append(self.player.bet) a.append(self.player.smile_needed) if a not in self.participant.vars['iniProb_updProb_bet']: self.participant.vars['iniProb_updProb_bet'].append(a) if ((self.player.smile_needed==5 and self.participant.vars['correct_for_real_round']==5) \ or (self.player.smile_needed==6 and self.participant.vars['correct_for_real_round']==0)): self.participant.vars['accapt_decission']=100 else: if 5-self.player.scenario==self.participant.vars['correct_for_real_round']: self.participant.vars['accapt_decission']=self.player.offer_accapted class page_before_real_round(Page): def is_displayed(self): return [(self.round_number==Constants.start_second_part-1 or self.round_number==Constants.start_lottery-1) and self.participant.vars['scenario_status']==False][0] def vars_for_template(self): for i in range(1,Constants.var_length+1): exec("self.player.num_%s = self.participant.vars['is_chosen'][%s] " % (i, i-1)) del i self.player.bet=self.player.in_round(self.round_number - 1).bet self.player.initial_prob=self.player.in_round(self.round_number - 1).initial_prob self.player.possible_win=self.player.in_round(self.round_number - 1).possible_win return{ 'accapted' : self.participant.vars['accapt_decission'], 'real_round_correct' : self.participant.vars['correct_for_real_round'] } def before_next_page(self): if ((self.player.smile_needed==5 and self.participant.vars['correct_for_real_round']==5) \ or (self.player.smile_needed==6 and self.participant.vars['correct_for_real_round']==0)): self.player.offer_accapted=100 else: self.player.offer_accapted=self.participant.vars['accapt_decission'] self.participant.vars['correct']=self.participant.vars['real_correct_list'][:] self.player.correct_guess_after_1=0 for i in range(1, Constants.var_length+1): self.player.correct_guess_after_1 += self.participant.vars['correct'][i-1] if (self.player.smile_needed-self.player.correct_guess_after_1<=Constants.open_second_stage \ and self.player.smile_needed-self.player.correct_guess_after_1>0): self.player.updated_prob_1=hypergeo(Constants.var_length-Constants.open_first_stage, \ Constants.suns_hidden-self.player.correct_guess_after_1, \ Constants.open_second_stage, \ self.player.smile_needed-self.player.correct_guess_after_1) self.player.offer=self.player.bet*self.player.updated_prob_1/self.player.initial_prob elif self.player.smile_needed-self.player.correct_guess_after_1<=0: self.player.updated_prob_1=1 self.player.offer=self.player.bet/self.player.initial_prob else: self.player.updated_prob_1=0 self.player.offer=0 self.player.check_status() class Results(Page): def is_displayed(self): return [((self.round_number >=1 and self.round_number<=Constants.start_scenario_1-1) \ or (self.round_number>=Constants.start_second_part and self.round_number<=Constants.start_scenario_2-1)) \ and self.player.player_status==False][0] form_model='player' form_fields=['offer_accapted',] def vars_for_template(self): chosen_name=[] for i in range(1, Constants.var_length+1): chosen_name.append(self.participant.vars['is_chosen'][i-1]) correct_name=[] for i in range(1, Constants.var_length+1): correct_name.append(self.participant.vars['correct'][i-1]) chosen_name_1=[chosen_name[i] for i in range(6)] correct_name_1=[correct_name[i] for i in range(6)] chosen_name_2=[chosen_name[i] for i in range(6, 13)] correct_name_2=[correct_name[i] for i in range(6, 13)] chosen_name_3=[chosen_name[i] for i in range(13, 20)] correct_name_3=[correct_name[i] for i in range(13, 20)] chosen_name_4=[chosen_name[i] for i in range(20, 27)] correct_name_4=[correct_name[i] for i in range(20, 27)] chosen_name_5=[chosen_name[i] for i in range(27, Constants.var_length)] correct_name_5=[correct_name[i] for i in range(27, Constants.var_length)] L_1=zip(chosen_name_1, correct_name_1, list(range(1,7))) L_2=zip(chosen_name_2, correct_name_2, list(range(7,14))) L_3=zip(chosen_name_3, correct_name_3, list(range(14,21))) L_4=zip(chosen_name_4, correct_name_4, list(range(21,28))) L_5=zip(chosen_name_5, correct_name_5, list(range(28,Constants.var_length+1))) lists=[L_1, L_2, L_3, L_4, L_5] return { 'offer': round_nearest(self.player.offer), "possible_win" : round_nearest(self.player.possible_win), 'updated_prob_1': round_nearest(self.player.updated_prob_1*100), 'smile_left': self.player.smile_needed-self.player.correct_guess_after_1, 'smile_left_total': Constants.suns_hidden-self.player.correct_guess_after_1, 'cloud_left_total':Constants.clouds_hidden-(Constants.open_first_stage-self.player.correct_guess_after_1), "lists" : lists } def before_next_page(self): self.player.check_status() class MyPage1(Page): def is_displayed(self): return [((self.round_number >=1 and self.round_number<=Constants.start_scenario_1-1) \ or (self.round_number==Constants.start_second_part-1) \ or (self.round_number>=Constants.start_second_part and self.round_number<=Constants.start_scenario_2-1) \ or (self.round_number==Constants.start_lottery-1)) \ and self.player.player_status==False][0] form_model="player" def get_form_fields(self): li=[] for i in range(1, Constants.var_length+1): if self.participant.vars['is_chosen'][i-1]==0: li.append("num_{}".format(i)) return li def error_message(self, values): print('values is', values) if sum(values.values()) != Constants.open_second_stage: return 'you must open exactly ' +str(Constants.open_second_stage)+ ' boxes' def vars_for_template(self): cell_id=['cell_{}'.format(i) for i in range(1, Constants.var_length+1)] val_id=['val_{}'.format(i) for i in range(1, Constants.var_length+1)] var_name_id=['num_{}'.format(i) for i in range(1, Constants.var_length+1)] num_name=[] for i in range(1, Constants.var_length+1): num_name.append(eval('self.player.num_'+str(i))) chosen_name=[] for i in range(1, Constants.var_length+1): chosen_name.append(self.participant.vars['is_chosen'][i-1]) correct_name=[] for i in range(1, Constants.var_length+1): correct_name.append(self.participant.vars['correct'][i-1]) cell_1=[cell_id[i] for i in range(6)] var_1=[val_id[i] for i in range(6)] var_name_1=[var_name_id[i] for i in range(6)] num_name_1=[num_name[i] for i in range(6)] chosen_name_1=[chosen_name[i] for i in range(6)] correct_name_1=[correct_name[i] for i in range(6)] cell_2=[cell_id[i] for i in range(6, 13)] var_2=[val_id[i] for i in range(6, 13)] var_name_2=[var_name_id[i] for i in range(6, 13)] num_name_2=[num_name[i] for i in range(6, 13)] chosen_name_2=[chosen_name[i] for i in range(6, 13)] correct_name_2=[correct_name[i] for i in range(6, 13)] cell_3=[cell_id[i] for i in range(13, 20)] var_3=[val_id[i] for i in range(13, 20)] var_name_3=[var_name_id[i] for i in range(13, 20)] num_name_3=[num_name[i] for i in range(13, 20)] chosen_name_3=[chosen_name[i] for i in range(13, 20)] correct_name_3=[correct_name[i] for i in range(13, 20)] cell_4=[cell_id[i] for i in range(20, 27)] var_4=[val_id[i] for i in range(20, 27)] var_name_4=[var_name_id[i] for i in range(20, 27)] num_name_4=[num_name[i] for i in range(20, 27)] chosen_name_4=[chosen_name[i] for i in range(20, 27)] correct_name_4=[correct_name[i] for i in range(20, 27)] cell_5=[cell_id[i] for i in range(27, Constants.var_length)] var_5=[val_id[i] for i in range(27, Constants.var_length)] var_name_5=[var_name_id[i] for i in range(27, Constants.var_length)] num_name_5=[num_name[i] for i in range(27, Constants.var_length)] chosen_name_5=[chosen_name[i] for i in range(27, Constants.var_length)] correct_name_5=[correct_name[i] for i in range(27, Constants.var_length)] L_1=zip(cell_1, var_1, var_name_1, num_name_1, chosen_name_1, correct_name_1, list(range(1,7))) L_2=zip(cell_2, var_2, var_name_2, num_name_2, chosen_name_2, correct_name_2, list(range(7,14))) L_3=zip(cell_3, var_3, var_name_3, num_name_3, chosen_name_3, correct_name_3, list(range(14,21))) L_4=zip(cell_4, var_4, var_name_4, num_name_4, chosen_name_4, correct_name_4, list(range(21,28))) L_5=zip(cell_5, var_5, var_name_5, num_name_5, chosen_name_5, correct_name_5, list(range(28,Constants.var_length+1))) lists=[L_1, L_2, L_3, L_4, L_5] return { "lists" : lists, "possible_win" : round_nearest(self.player.possible_win), 'updated_prob_1': round_nearest(self.player.updated_prob_1*100), 'smile_left': self.player.smile_needed-self.player.correct_guess_after_1, 'smile_left_total': Constants.suns_hidden-self.player.correct_guess_after_1, 'cloud_left_total':Constants.clouds_hidden-(Constants.open_first_stage-self.player.correct_guess_after_1), } def before_next_page(self): self.player.check_correct() self.player.check_chosen() self.player.correct_string_2=str(self.participant.vars['correct']) self.player.chosen_string_2=str(self.participant.vars['is_chosen']) for i in range(1, Constants.var_length+1): self.player.correct_guess_after_2 += self.participant.vars['correct'][i-1] if self.player.correct_guess_after_2>=self.player.smile_needed: self.player.offer=self.player.bet/self.player.initial_prob else: self.player.offer=0 self.player.check_status() class final_page(Page): def is_displayed(self): return [((self.round_number >=1 and self.round_number<=Constants.start_scenario_1-1) \ or (self.round_number==Constants.start_second_part-1) \ or (self.round_number>=Constants.start_second_part and self.round_number<=Constants.start_scenario_2-1) \ or (self.round_number==Constants.start_lottery-1)) \ and self.player.player_status==True][0] def vars_for_template(self): chosen_name=[] for i in range(1, Constants.var_length+1): chosen_name.append(self.participant.vars['is_chosen'][i-1]) correct_name=[] for i in range(1, Constants.var_length+1): correct_name.append(self.participant.vars['correct'][i-1]) chosen_name_1=[chosen_name[i] for i in range(6)] correct_name_1=[correct_name[i] for i in range(6)] chosen_name_2=[chosen_name[i] for i in range(6, 13)] correct_name_2=[correct_name[i] for i in range(6, 13)] chosen_name_3=[chosen_name[i] for i in range(13, 20)] correct_name_3=[correct_name[i] for i in range(13, 20)] chosen_name_4=[chosen_name[i] for i in range(20, 27)] correct_name_4=[correct_name[i] for i in range(20, 27)] chosen_name_5=[chosen_name[i] for i in range(27, Constants.var_length)] correct_name_5=[correct_name[i] for i in range(27, Constants.var_length)] L_1=zip(chosen_name_1, correct_name_1, list(range(1,7))) L_2=zip(chosen_name_2, correct_name_2, list(range(7,14))) L_3=zip(chosen_name_3, correct_name_3, list(range(14,21))) L_4=zip(chosen_name_4, correct_name_4, list(range(21,28))) L_5=zip(chosen_name_5, correct_name_5, list(range(28,Constants.var_length+1))) lists=[L_1, L_2, L_3, L_4, L_5] endowment_left=self.player.endowment-self.player.bet if self.player.bet==0: self.player.offer=0 self.player.round_return=self.player.offer+endowment_left if self.round_number<=Constants.start_scenario_1-1: round_num=self.round_number elif self.round_number==Constants.start_second_part-1: round_num=100 elif self.round_number<=Constants.start_scenario_2-1: round_num=self.round_number-Constants.start_second_part+1 elif self.round_number==Constants.start_lottery-1: round_num=1000 else: round_num=1 return { 'offer': round_nearest(self.player.offer), "lists" : lists, "endowment_left": endowment_left, "total_return": round_nearest(self.player.round_return), "round_num": round_num } class wait_page(Page): def is_displayed(self): return [((self.round_number >=1 and self.round_number<=Constants.start_scenario_1-1) \ or (self.round_number==Constants.start_second_part-1) \ or (self.round_number>=Constants.start_second_part and self.round_number<=Constants.start_scenario_2-1) \ or (self.round_number==Constants.start_lottery-1)) \ and self.player.player_status==True][0] def vars_for_template(self): scenarios_1_start=Constants.start_scenario_1-1 part_2_start=Constants.start_second_part-1 scenarios_2_start=Constants.start_scenario_2-1 start_lottery=Constants.start_lottery-1 if self.round_number<=Constants.start_scenario_1-1: next_round=self.round_number elif self.round_number<=Constants.start_scenario_2-1: next_round=self.round_number-Constants.start_second_part+1 else: next_round=1 return{ 'scenarios_1_start' : scenarios_1_start, 'start_part_2' : part_2_start, 'next_round' : next_round, 'scenarios_2_start' : scenarios_2_start, "start_lottery": start_lottery } def before_next_page(self): self.participant.vars['ticket'].remove(self.participant.vars['ticket'][0]) if self.round_number==Constants.start_second_part-1: if self.participant.vars['payoff_part']==1: self.participant.vars['payment']=self.player.round_return elif self.round_number==Constants.start_lottery-1: if self.participant.vars['payoff_part']==2: self.participant.vars['payment']=self.player.round_return if self.round_number==Constants.start_lottery-1: if len(self.participant.vars['iniProb_updProb_bet'])==5: if self.participant.vars['iniProb_updProb_bet'][0][3]==5: del self.participant.vars['triples'][8:13] else: del self.participant.vars['triples'][13:18] while len(self.participant.vars['iniProb_updProb_bet'])=Constants.start_lottery and self.round_number<=Constants.start_questionnaire-1][0] form_model="player" def get_form_fields(self): return ['fixed_amount'] def fixed_amount_choices(self): triple=self.participant.vars['iniProb_updProb_bet'][0] prob_0=triple[0] prob_1=triple[1] bet=triple[2] offer=bet*prob_1/prob_0 self.participant.vars['guaranteed']= offer choices=[ [0, "100% chance of winning $"+'{:0,.2f}'.format(round_nearest(offer)) ], [1, '{:0,.2f}'.format(round_nearest(prob_1*100))+"% chance of winning $"+'{:0,.2f}'.format(round_nearest(bet/prob_0))+" "+'{:0,.2f}'.format(round_nearest(100-prob_1*100))+"% chance of winning $0"], ] random.shuffle(choices) return choices def vars_for_template(self): round_num=Constants.num_lottery_questions+1-len(self.participant.vars['iniProb_updProb_bet']) return{ "round_num" :round_num } def before_next_page(self): self.player.lottery_guaranteed=self.participant.vars['guaranteed'] self.player.lottery_prob=self.participant.vars['iniProb_updProb_bet'][0][1] self.participant.vars['iniProb_updProb_bet'].remove(self.participant.vars['iniProb_updProb_bet'][0]) if self.participant.vars['payoff_part']==3: if self.participant.vars['payoff_round']==self.round_number-Constants.start_lottery+1: if self.player.fixed_amount==0: self.participant.vars['payment']=self.player.lottery_guaranteed elif self.player.fixed_amount==1: prob=random.uniform(0, 1) if prob<=self.player.lottery_prob: self.participant.vars['payment']=self.player.lottery_guaranteed/self.player.lottery_prob else: self.participant.vars['payment']=0 if self.round_number==Constants.start_questionnaire-1: self.participant.payoff=round_nearest(self.participant.vars['payment']) class wait_page_after_lottery(Page): def is_displayed(self): return [self.round_number ==Constants.start_questionnaire][0] class questions(Page): def is_displayed(self): return [self.round_number>=Constants.start_questionnaire and self.round_number<=Constants.start_questionnaire+1][0] form_model="player" def get_form_fields(self): if self.round_number==Constants.start_questionnaire: return ['q_1_school', 'q_2_status', 'q_3_GPA', 'q_4_terms', 'q_age', 'q_gender'] elif self.round_number==Constants.start_questionnaire+1: return ['q_6_confusing', 'q_7_feedback' ] def q_1_school_choices(self): choices=[ [1, 'Engineering'], [2, 'Business'], [3, 'Science'], [4, 'Agriculture'], [5, 'Arts'], [6, 'Social science'], [7, 'Other'], ] return choices def q_2_status_choices(self): choices=[ [1, 'Undergraduate student'], [2, 'Graduate student'], [3, 'Other'], ] return choices def q_4_terms_choices(self): choices=[ [1, "Freshman"], [2, "Sophomore"], [3, "Junior"], [4, "Senior"], [5, "I am not an undergraduate student"], ] return choices def q_gender_choices(self): choices=[ [1, "Male"], [2, "Female"], [3, "Other"], ] return choices def vars_for_template(self): if self.round_number==Constants.start_questionnaire: i=1 elif self.round_number==Constants.start_questionnaire+1: i=2 return{ "round_num" : i } page_sequence = [ welcome_page, first_page, MyPage, wait_page_for_scenarios, Scenarios, page_before_real_round, Results, MyPage1, final_page, wait_page, raven, wait_page_after_raven, lottery, wait_page_after_lottery, questions, ]