from otree.api import * import random doc = """ "Experiment" """ class Constants(BaseConstants): name_in_url = 'Ranking_Experiment_Results' players_per_group = 4 column_role = 'column' row_role = 'row' num_rounds = 1 #EARNING_PER_ITEM = self.session.config['real_world_currency_per_point'] randomrank1 = random.sample(range(16), 2) randomrank2 = random.sample(range(16), 2) randomrank3 = random.sample(range(16), 2) randomrank4 = random.sample(range(16), 2) ranknames = [] for i in range(0,16): ranknames.append('Rank {}'.format(i+1)) class Subsession(BaseSubsession): def creating_session(self): for p in self.get_players(): p.ranking=p.participant.vars['ranking'] class Group(BaseGroup): pass class Player(BasePlayer): age = models.IntegerField(label="How old are you?") country = models.StringField(label="What is your country of origin?") gender = models.StringField( choices=['Female', 'Male', 'Other','Skip'], widget=widgets.RadioSelectHorizontal, label="What is your gender?") gender_type = models.StringField(label="Please specify your gender if your answer is 'other'?", blank=True) profession = models.StringField(label="What is your profession / field of studies?") control = models.StringField( choices=['A great deal','A lot','A moderate amount','A little','None at all'], widget=widgets.RadioSelectHorizontal, label="Please, choose the answer ‘A little’ below") politics = models.IntegerField( widget=widgets.RadioSelect, choices=[1,2,3,4,5,6,7,8,9,10], label="In political matters, people talk of “the left” and “the right”. " "Generally speaking, how would you place your views on this scale? ") #FUNCTIONS #def creating_session(self): #for p in self.get_players(): # p.participant.vars['r1']=tup(getattr(p, 'ranking'))[0] def tup(x): x=x.replace('(', '') x=x.replace(')', '') x = x.split(',') return [(int(x[2*i]),int(x[2*i+1])) for i in range(0,16)] def tup_other(x): x=x.replace('(', '') x=x.replace(')', '') x = x.split(',') return [(int(x[2*i+1]),int(x[2*i])) for i in range(0,16)] def set_payoffs(group, EARNING_PER_ITEM= 0.5): for p in group.get_players(): p.payoff = (tup(p.participant.vars['ranking'])[min(random_tup_return(p.id_in_group)[0],random_tup_return(p.id_in_group)[1])][0]+tup_other(other_player(p).participant.vars['ranking'])[ min(random_tup_return(other_player(p).id_in_group)[0], random_tup_return(other_player(p).id_in_group)[1])][0])*EARNING_PER_ITEM # p.payoff = EARNING_PER_ITEM*p.payoff def other_player(player: Player): if player.id_in_group > 1: return player.group.get_player_by_id(player.id_in_group-1) else: return player.group.get_player_by_id(4) def random_tup(group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p3 = group.get_player_by_id(3) p4 = group.get_player_by_id(4) p1.random_tup=Constants.randomrank1 p2.random_tup=Constants.randomrank2 p3.random_tup=Constants.randomrank3 p4.random_tup=Constants.randomrank4 def random_tup_return(x): if x == 1: return Constants.randomrank1 else: return Constants.randomrank2 class Instructions(Page): form_model = 'player' form_fields = ['ranking'] class Stage1(Page): form_model = 'player' form_fields = ['ranking'] class ResultsWaitPage(WaitPage): group_by_arrival_time = True after_all_players_arrive = set_payoffs class Results(Page): @staticmethod def vars_for_template(player: Player): return { 'r1': tup(player.participant.vars['ranking'])[0], 'r2': tup(player.participant.vars['ranking'])[1], 'r3': tup(player.participant.vars['ranking'])[2], 'r4': tup(player.participant.vars['ranking'])[3], 'r5': tup(player.participant.vars['ranking'])[4], 'r6': tup(player.participant.vars['ranking'])[5], 'r7': tup(player.participant.vars['ranking'])[6], 'r8': tup(player.participant.vars['ranking'])[7], 'r9': tup(player.participant.vars['ranking'])[8], 'r10': tup(player.participant.vars['ranking'])[9], 'r11': tup(player.participant.vars['ranking'])[10], 'r12': tup(player.participant.vars['ranking'])[11], 'r13': tup(player.participant.vars['ranking'])[12], 'r14': tup(player.participant.vars['ranking'])[13], 'r15': tup(player.participant.vars['ranking'])[14], 'r16': tup(player.participant.vars['ranking'])[15], 'or1': tup(other_player(player).participant.vars['ranking'])[0], 'or2': tup(other_player(player).participant.vars['ranking'])[1], 'or3': tup(other_player(player).participant.vars['ranking'])[2], 'or4': tup(other_player(player).participant.vars['ranking'])[3], 'or5': tup(other_player(player).participant.vars['ranking'])[4], 'or6': tup(other_player(player).participant.vars['ranking'])[5], 'or7': tup(other_player(player).participant.vars['ranking'])[6], 'or8': tup(other_player(player).participant.vars['ranking'])[7], 'or9': tup(other_player(player).participant.vars['ranking'])[8], 'or10': tup(other_player(player).participant.vars['ranking'])[9], 'or11': tup(other_player(player).participant.vars['ranking'])[10], 'or12': tup(other_player(player).participant.vars['ranking'])[11], 'or13': tup(other_player(player).participant.vars['ranking'])[12], 'or14': tup(other_player(player).participant.vars['ranking'])[13], 'or15': tup(other_player(player).participant.vars['ranking'])[14], 'or16': tup(other_player(player).participant.vars['ranking'])[15], 'ranks_own': random_tup_return(player.id_in_group), 'ranks_own_higher': min(random_tup_return(player.id_in_group)), 'ranks_own_higher16': min(random_tup_return(player.id_in_group))+16, 'ranks_own_lower': max(random_tup_return(player.id_in_group)), 'ranks_own_lower16': max(random_tup_return(player.id_in_group)) + 16, 'ranks_other': random_tup_return(other_player(player).id_in_group), 'ranks_other_higher': min(random_tup_return(other_player(player).id_in_group))+32, 'ranks_other_higher16': min(random_tup_return(other_player(player).id_in_group))+48, 'ranks_other_lower': max(random_tup_return(other_player(player).id_in_group))+32, 'ranks_other_lower16': max(random_tup_return(other_player(player).id_in_group))+48, 'tuples_own1': tup(player.participant.vars['ranking'])[random_tup_return(player.id_in_group)[0]], 'tuples_own2': tup(player.participant.vars['ranking'])[random_tup_return(player.id_in_group)[1]], 'tuples_own_higher':tup(player.participant.vars['ranking'])[min(random_tup_return(player.id_in_group)[0],random_tup_return(player.id_in_group)[1])], 'tuples_own_lower': tup(player.participant.vars['ranking'])[ max(random_tup_return(player.id_in_group)[0], random_tup_return(player.id_in_group)[1])], 'tuples_own_pay': tup(player.participant.vars['ranking'])[min(random_tup_return(player.id_in_group)[0],random_tup_return(player.id_in_group)[1])][0], 'tuples_other1': tup(other_player(player).participant.vars['ranking'])[random_tup_return(other_player(player).id_in_group)[0]], 'tuples_other2': tup(other_player(player).participant.vars['ranking'])[random_tup_return(other_player(player).id_in_group)[1]], 'tuples_other_higher': tup(other_player(player).participant.vars['ranking'])[ min(random_tup_return(other_player(player).id_in_group)[0], random_tup_return(other_player(player).id_in_group)[1])], 'tuples_other_lower': tup(other_player(player).participant.vars['ranking'])[ max(random_tup_return(other_player(player).id_in_group)[0], random_tup_return(other_player(player).id_in_group)[1])], 'tuples_other_pay': tup(other_player(player).participant.vars['ranking'])[ min(random_tup_return(other_player(player).id_in_group)[0], random_tup_return(other_player(player).id_in_group)[1])][1], 'total_pay': tup(other_player(player).participant.vars['ranking'])[ min(random_tup_return(other_player(player).id_in_group)[0], random_tup_return(other_player(player).id_in_group)[1])][1]+tup(player.participant.vars['ranking'])[min(random_tup_return(player.id_in_group)[0],random_tup_return(player.id_in_group)[1])][0], } class End(Page): pass class Demographics(Page): form_model = 'player' form_fields = ['age','gender','country','control','politics','gender_type','profession'] page_sequence = [ResultsWaitPage,Results,Demographics,End]