from otree.api import * import random import time doc = """ Survey """ class C(BaseConstants): NAME_IN_URL = 'Survey' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 SHOWUP = 3.0 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): age = models.IntegerField(label='What is your age?', min=0,max=99) risk_preference = models.IntegerField() gender = models.StringField( label='What is your gender?', choices=['Male', 'Female', 'Other', 'I prefer not to tell'], widget=widgets.RadioSelect, ) education_level = models.StringField( label='What is the highest level of school you have completed or the highest degree you have received', choices=['Fachabitur', 'Abitur or equivalent', 'Bachelor degree', 'Master degree'], widget=widgets.RadioSelect, ) major = models.StringField(label= 'Please tell us your study area:',blank=True) payoff1 = models.IntegerField() payoff2 = models.IntegerField() payoff3 = models.IntegerField() value1 = models.FloatField() value2 = models.FloatField() value3 = models.FloatField() payoff_chosen = models.IntegerField() value_chosen = models.FloatField() exp_chosen = models.IntegerField() # payoff = models.FloatField() random_number = models.IntegerField() include_random = models.BooleanField() payoff_pound = models.FloatField() payoff_pounds = models.FloatField() payoff_pounds2 = models.FloatField() payoff_calc=models.FloatField() payoff_shown = models.FloatField() time_end = models.FloatField() number1_1 = models.IntegerField() number1_2 = models.IntegerField() number2_1 = models.IntegerField() number2_2 = models.IntegerField() number3_1 = models.IntegerField() number3_2 = models.IntegerField() value3_1 = models.FloatField() comment_remark = models.LongStringField(label='If you have any comments or questions regarding this study, you can leave them here. (optional)',blank=True) def load_payoffs(player): player.payoff1 = player.in_round(1).participant.vars.get('mypayoff1', None) player.payoff2 = player.in_round(1).participant.vars.get('mypayoff2', None) player.payoff3 = player.in_round(1).participant.vars.get('mypayoff3', None) player.value1 = player.in_round(1).participant.vars.get('payoff_value1', None)/100*3 player.value2 = player.in_round(1).participant.vars.get('payoff_value2', None)/100*3 player.value3 = player.in_round(1).participant.vars.get('payoff_value3', None)/100*3 player.random_number = player.in_round(1).participant.vars.get('ran_num', None) player.include_random = player.in_round(1).participant.vars.get('include_random', None) player.number1_1 = player.in_round(1).participant.vars.get('number1.1', None) player.number1_2 = player.in_round(1).participant.vars.get('number1.2', None) player.number2_1 = player.in_round(1).participant.vars.get('number2.1', None) player.number2_2 = player.in_round(1).participant.vars.get('number2.2', None) player.number3_1 = player.in_round(1).participant.vars.get('number3.1', None) player.number3_2 = player.in_round(1).participant.vars.get('number3.2', None) return {'payoff1': player.payoff1,'payoff2': player.payoff2,'payoff3':player.payoff3, 'ran_num': player.random_number , 'include_random': player.include_random, 'value1': player.value1,'value2':player.value2,'value3':player.value3, 'number1.1':player.number1_1,'number1.2':player.number1_2, 'number2.1':player.number2_1,'number2.2':player.number2_2,'number3.1':player.number3_1,'number3.2':player.number3_2} def choose_payoff(player): payoff_exp1 = [1] payoff_exp2 = [2] payoff_exp3 = [3] payoff_list = [payoff_exp1, payoff_exp2, payoff_exp3] payoff_exp1.append(player.value1) payoff_exp2.append(player.value2) payoff_exp3.append(player.value3) payoff_exp1.append(player.payoff1) payoff_exp2.append(player.payoff2) payoff_exp3.append(player.payoff3) set_chosen = random.choice(payoff_list) player.value_chosen = set_chosen[1] player.exp_chosen = set_chosen[0] player.payoff_chosen = set_chosen[2] player.payoff_pounds= round(player.value_chosen,2) player.payoff_pounds2 = round((player.value_chosen+player.random_number/100*3),2) if player.include_random == 1: player.value3_1 = player.value3+(player.random_number/100*3) else: player.value3_1 = player.value3 return { 'chosen_payoff': player.payoff_chosen, 'chosen_exp': player.exp_chosen, 'chosen_value': player.value_chosen } def calc_payoff(player): if player.exp_chosen == 3: if player.include_random== True: player.payoff_calc = player.payoff_pounds2 player.payoff = round(player.payoff_calc,2) player.payoff_shown = round(player.payoff_pounds2 + C.SHOWUP,2) player.payoff_pound =player.payoff_pounds2 player.payoff_chosen = player.payoff_chosen+player.random_number else: player.payoff_calc = player.payoff_pounds player.payoff = round(player.payoff_calc, 2) player.payoff_shown = round(player.payoff_pounds + C.SHOWUP, 2) player.payoff_chosen = player.payoff_chosen player.payoff_pound = player.payoff_pounds else: player.payoff_calc = player.payoff_pounds player.payoff = round(player.payoff_calc,2) player.payoff_shown = round(player.payoff_pounds + C.SHOWUP,2) player.payoff_chosen = player.payoff_chosen player.payoff_pound =player.payoff_pounds return { 'total_payoff': player.payoff, 'shown_payoff':player.payoff_shown, 'ch_payoff': player.payoff_chosen, 'payoff_pound':player.payoff_pound } # PAGES class Start(Page): @staticmethod def vars_for_template(player): player.participant.vars['payoff1', 'payoff2', 'payoff3','ran_num','include_random','value1','value2','value3','number1.1','number1.2','number2.1','number2.2','number3.1','number3.2'] = load_payoffs(player) player.participant.vars['chosen_payoff', 'chosen_exp','chosen_value'] = choose_payoff(player) class Demographics(Page): form_model = 'player' form_fields = ['age','gender','education_level','major','risk_preference'] @staticmethod def before_next_page(player,timeout_happened): player.participant.vars['total_payoff','shown_payoff','ch_payoff','payoff_pound']= calc_payoff(player) class End(Page): form_model = 'player' form_fields = ['comment_remark'] @staticmethod def vars_for_template(player): player.participant.finished = True @staticmethod def before_next_page(player, timeout_happened): player.time_end = time.time() class LastPage(Page): pass page_sequence = [Start, Demographics, End,LastPage]