from otree.api import * doc = """ Your app description """ class C(BaseConstants): time_to_complete_experiment = 30 show_up = cu(3.5) NAME_IN_URL = 'UnusualUses' PLAYERS_PER_GROUP = 3 NUM_ROUNDS = 3 task_time = 180 task_time_minutes = 3 practice_time = 60 use_1 = "newspaper" use_2 = "tin can" use_3 = "brick" practice_use = "car tire" bonus_RE = cu(6) bonus_belief = cu(1) review_from_player_2_on_player_1_quan = 1 review_from_player_2_on_player_1_qual = 5 # review_from_player_3_on_player_1_quan = 2 # review_from_player_3_on_player_1_qual = 4 review_from_player_1_on_player_2_quan = 3 review_from_player_1_on_player_2_qual = 6 # review_from_player_3_on_player_2_quan = 1 # review_from_player_3_on_player_2_qual = 8 review_from_player_1_on_player_3_quan = 3 review_from_player_1_on_player_3_qual = 4 review_from_player_2_on_player_3_quan = 1 review_from_player_2_on_player_3_qual = 4 # review_from_player_1_on_player_4_quan = 0 # review_from_player_1_on_player_4_qual = 8 # review_from_player_2_on_player_4_quan = 2 # review_from_player_2_on_player_4_qual = 1 # review_from_player_3_on_player_4_quan = 4 # review_from_player_3_on_player_4_qual = 6 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass def make_field(label): return models.StringField( label=label, blank=True, ) def make_field_qual(): return models.IntegerField( min=0, max=10, label="Quality Rating:", ) def make_field_quan(): return models.IntegerField( min=0, max=10, label="Quantity Rating:", ) class Player(BasePlayer): ################### Consent ################# consent = models.BooleanField( initial=False ) ########### Control questions and Validation ############## control_review_trans = models.IntegerField( label="What quality rating did Participant 2 assign to your answers?" ) control_review_intrans = models.FloatField( label = " What is the total quality rating you received?" ) control_1_one = models.IntegerField( choices=[ [1, "The group member who received the highest total rating by another group member."], [2, "The group member who came up with the highest number of uses."], [3, "The group member who came up with the most unusual uses."], ], widget=widgets.RadioSelect, label = "1. Who wins the bonus payment?" ) control_1_three = models.IntegerField( choices=[ [1, "The group member who received the highest average total rating by the other group members."], [2, "The group member who came up with the highest number of uses."], [3, "The group member who came up with the most unusual uses."], ], widget=widgets.RadioSelect, label="1. Who wins the bonus payment?" ) control_2 = models.IntegerField( choices=[ [1, "1"], [2, "2"], [3, "3"], ], widget=widgets.RadioSelect, label="2. How many other group members will you rate in each task?" ) control_3 = models.IntegerField( choices=[ [1, "1"], [2, "2"], [3, "3"], ], widget=widgets.RadioSelect, label="3. How many other group members will rate you in each task?" ) control_4 = models.BooleanField( label="4. After completing your rating decision, will you see which group member gave the lowest ratings?" ) control_attempts_1 = models.IntegerField(initial=0) control_attempts_2 = models.IntegerField(initial=0) control_attempts_3 = models.IntegerField(initial=0) control_attempts_4 = models.IntegerField(initial=0) control_attempts_review_trans = models.IntegerField(initial=0) control_attempts_review_intrans = models.IntegerField(initial=0) ################################################################################################################### treatment = models.StringField() effort = models.IntegerField( choices=[1,2,3,4,5,6,7], widget=widgets.RadioSelect, label = "How much effort did you invest in the previous task?" ) PracticeUse1 = models.StringField(label="1. Unusual use") PracticeUse2 = make_field("2. Unusual use") PracticeUse3 = make_field("3. Unusual use") PracticeUse4 = make_field("4. Unusual use") PracticeUse5 = make_field("5. Unusual use") PracticeUse6 = make_field("6. Unusual use") PracticeUse7 = make_field("7. Unusual use") PracticeUse8 = make_field("8. Unusual use") PracticeUse9 = make_field("9. Unusual use") PracticeUse10 = make_field("10. Unusual use") practice_review_on_player_1_quan = make_field_quan() practice_review_on_player_2_quan = make_field_quan() practice_review_on_player_1_qual = make_field_qual() practice_review_on_player_2_qual = make_field_qual() UnusualUse1 = make_field("1. Unusual use") UnusualUse2 = make_field("2. Unusual use") UnusualUse3 = make_field("3. Unusual use") UnusualUse4 = make_field("4. Unusual use") UnusualUse5 = make_field("5. Unusual use") UnusualUse6 = make_field("6. Unusual use") UnusualUse7 = make_field("7. Unusual use") UnusualUse8 = make_field("8. Unusual use") UnusualUse9 = make_field("9. Unusual use") UnusualUse10 = make_field("10. Unusual use") @staticmethod # save unusual uses and beliefs def save_unusual(player): if player.round_number == 1: player.participant.vars['UnusualUse1_round1'] = player.UnusualUse1 player.participant.vars['UnusualUse2_round1'] = player.UnusualUse2 player.participant.vars['UnusualUse3_round1'] = player.UnusualUse3 player.participant.vars['UnusualUse4_round1'] = player.UnusualUse4 player.participant.vars['UnusualUse5_round1'] = player.UnusualUse5 player.participant.vars['UnusualUse6_round1'] = player.UnusualUse6 player.participant.vars['UnusualUse7_round1'] = player.UnusualUse7 player.participant.vars['UnusualUse8_round1'] = player.UnusualUse8 player.participant.vars['UnusualUse9_round1'] = player.UnusualUse9 player.participant.vars['UnusualUse10_round1'] = player.UnusualUse10 if player.round_number == 2: player.participant.vars['UnusualUse1_round2'] = player.UnusualUse1 player.participant.vars['UnusualUse2_round2'] = player.UnusualUse2 player.participant.vars['UnusualUse3_round2'] = player.UnusualUse3 player.participant.vars['UnusualUse4_round2'] = player.UnusualUse4 player.participant.vars['UnusualUse5_round2'] = player.UnusualUse5 player.participant.vars['UnusualUse6_round2'] = player.UnusualUse6 player.participant.vars['UnusualUse7_round2'] = player.UnusualUse7 player.participant.vars['UnusualUse8_round2'] = player.UnusualUse8 player.participant.vars['UnusualUse9_round2'] = player.UnusualUse9 player.participant.vars['UnusualUse10_round2'] = player.UnusualUse10 if player.round_number == 3: player.participant.vars['UnusualUse1_round3'] = player.UnusualUse1 player.participant.vars['UnusualUse2_round3'] = player.UnusualUse2 player.participant.vars['UnusualUse3_round3'] = player.UnusualUse3 player.participant.vars['UnusualUse4_round3'] = player.UnusualUse4 player.participant.vars['UnusualUse5_round3'] = player.UnusualUse5 player.participant.vars['UnusualUse6_round3'] = player.UnusualUse6 player.participant.vars['UnusualUse7_round3'] = player.UnusualUse7 player.participant.vars['UnusualUse8_round3'] = player.UnusualUse8 player.participant.vars['UnusualUse9_round3'] = player.UnusualUse9 player.participant.vars['UnusualUse10_round3'] = player.UnusualUse10 team_practice = models.LongStringField() rank_practice = models.IntegerField() def find_rank(player): treatment = player.session.config['treatment'] if treatment == "Three_trans" or treatment == "Three_intrans": total_review_on_player_1 = round((C.review_from_player_2_on_player_1_quan + C.review_from_player_2_on_player_1_qual + player.practice_review_on_player_1_quan + player.practice_review_on_player_1_qual) / 2,2), total_review_on_player_2 = round((C.review_from_player_1_on_player_2_quan + C.review_from_player_1_on_player_2_qual + player.practice_review_on_player_2_quan + player.practice_review_on_player_2_qual) / 2,2), total_review_on_player_3 = round((C.review_from_player_1_on_player_3_quan + C.review_from_player_1_on_player_3_qual + C.review_from_player_2_on_player_3_quan + C.review_from_player_2_on_player_3_qual) / 2,2), else: total_review_on_player_1 = player.practice_review_on_player_1_quan + player.practice_review_on_player_1_qual, total_review_on_player_2 = C.review_from_player_1_on_player_2_quan + C.review_from_player_1_on_player_2_qual, total_review_on_player_3 = C.review_from_player_2_on_player_3_quan + C.review_from_player_2_on_player_3_qual, total_review_on_player_1 = float('.'.join(str(ele) for ele in total_review_on_player_1)) total_review_on_player_2 = float('.'.join(str(ele) for ele in total_review_on_player_2)) total_review_on_player_3 = float('.'.join(str(ele) for ele in total_review_on_player_3)) team = {'1': total_review_on_player_1, '2': total_review_on_player_2, '3': total_review_on_player_3, } print("Your team is") print(team) player.team_practice = ' - '.join([str(i) for i in team.values()]) # reshuffle the dictionary to account for ties team_set = list(set(team)) team = {i: team[i] for i in team_set} print("Reshuffeled team") print(team) winner = max(team, key=team.get) print("Winner:") print(winner) # Inverse sort team by performance team_sorted = sorted(team.items(), key=lambda item: item[1], reverse=True) print("Sorted team:") print(team_sorted) # Enumerate and label by name rank = {x[0]: idx for idx, x in enumerate(team_sorted, 1)} print("Rank:") print(rank) player.participant.vars["RE_rank_practice_player_1"] = rank['1'] player.participant.vars["RE_rank_practice_player_2"] = rank['2'] player.participant.vars["RE_rank_practice_player_3"] = rank['3'] player_id = player.id_in_group print("Player ID:") print(player_id) rank = rank['3'] player.rank_practice = rank return rank def control_1_one_error_message(player, value): print('value is', value) if value != 1: player.control_attempts_1 += 1 return 'You answered the question above incorrectly. Please try again.' def control_1_three_error_message(player, value): if value != 1: player.control_attempts_1 += 1 return 'You answered the question above incorrectly. Please try again.' def control_2_error_message(player, value): treatment = player.session.config['treatment'] if treatment == "One_trans" or treatment == "One_intrans": if value != 1: player.control_attempts_2 += 1 return 'You answered the question above incorrectly. Please try again.' else: if value != 2: player.control_attempts_2 += 1 return 'You answered the question above incorrectly. Please try again.' def control_3_error_message(player, value): treatment = player.session.config['treatment'] if treatment == "One_trans" or treatment == "One_intrans": if value != 1: player.control_attempts_3 += 1 return 'You answered the question above incorrectly. Please try again.' else: if value != 2: player.control_attempts_3 += 1 return 'You answered the question above incorrectly. Please try again.' def control_4_error_message(player, value): treatment = player.session.config['treatment'] if treatment == "One_trans" or treatment == "Three_trans": if value != True: player.control_attempts_4 += 1 return 'You answered the question above incorrectly. Please try again.' else: if value != False: player.control_attempts_4 += 1 return 'You answered the question above incorrectly. Please try again.' def control_review_trans_error_message(player, value): if value != C.review_from_player_2_on_player_3_qual: player.control_attempts_review_trans += 1 return 'You answered the question above incorrectly. Please try again.' def control_review_intrans_error_message(player, value): treatment = player.session.config['treatment'] if treatment == "One_intrans": if value != C.review_from_player_2_on_player_3_qual: player.control_attempts_review_intrans += 1 return 'You answered the question above incorrectly. Please try again.' if treatment == "Three_intrans": if value != (C.review_from_player_2_on_player_3_qual + C.review_from_player_1_on_player_3_qual)/2: player.control_attempts_review_intrans += 1 return 'You answered the question above incorrectly. Please try again.' # PAGES class Welcome(Page): def is_displayed(player): return player.round_number == 1 class Consent(Page): def is_displayed(player): return player.round_number == 1 form_model = 'player' form_fields = ['consent'] class Instruction(Page): def is_displayed(player): return player.round_number == 1 class RE(Page): timeout_seconds = C.task_time form_model = 'player' form_fields = ['UnusualUse1', 'UnusualUse2', 'UnusualUse3', 'UnusualUse4', 'UnusualUse5', 'UnusualUse6', 'UnusualUse7', 'UnusualUse8', 'UnusualUse9', 'UnusualUse10'] class Belief(Page): form_model = 'player' form_fields = ["effort"] def vars_for_template(player): return dict( treatment=player.session.config['treatment'], ) @staticmethod def before_next_page(player, timeout_happened): player.save_unusual(player) class PracticeInstruction(Page): @staticmethod def is_displayed(player): return player.round_number == 1 class PracticeRE(Page): timeout_seconds = C.practice_time @staticmethod def is_displayed(player): return player.round_number == 1 form_model = 'player' form_fields = ['PracticeUse1', 'PracticeUse2', 'PracticeUse3', 'PracticeUse4', 'PracticeUse5', 'PracticeUse6', 'PracticeUse7', 'PracticeUse8', 'PracticeUse9', 'PracticeUse10'] class InstructionPayment(Page): @staticmethod def is_displayed(player): return player.round_number == 1 def vars_for_template(player): return dict( treatment=player.session.config['treatment'] ) class PracticeReview(Page): @staticmethod def is_displayed(player): return player.round_number == 1 form_model = 'player' form_fields = ['PracticeUse1', 'PracticeUse2', 'PracticeUse3', 'PracticeUse4', 'PracticeUse5', 'PracticeUse6', 'PracticeUse7', 'PracticeUse8', 'PracticeUse9', 'PracticeUse10'] def vars_for_template(player): return dict( treatment=player.session.config['treatment'], PracticeUse1=player.PracticeUse1, PracticeUse2=player.PracticeUse2, PracticeUse3=player.PracticeUse3, PracticeUse4=player.PracticeUse4, PracticeUse5=player.PracticeUse5, PracticeUse6=player.PracticeUse6, PracticeUse7=player.PracticeUse7, PracticeUse8=player.PracticeUse8, PracticeUse9=player.PracticeUse9, PracticeUse10=player.PracticeUse10, ) @ staticmethod def get_form_fields(player): if player.session.config['treatment'] == "Three_trans" or player.session.config['treatment'] == "Three_intrans": return ['practice_review_on_player_1_qual', 'practice_review_on_player_2_qual','practice_review_on_player_1_quan', 'practice_review_on_player_2_quan'] else: return ['practice_review_on_player_1_qual', 'practice_review_on_player_1_quan'] @staticmethod def js_vars(player): return dict( round=player.round_number, id=player.id_in_group, treatment=player.session.config['treatment'], ) class PracticeShowReview_Rework(Page): @staticmethod def is_displayed(player): return player.round_number == 1 form_model = 'player' @staticmethod def get_form_fields(player): if player.session.config['treatment'] == "Three_trans" or player.session.config['treatment'] == "One_trans": return ['control_review_trans'] else: return ['control_review_intrans'] def vars_for_template(player): treatment = player.session.config['treatment'] if treatment == "Three_trans" or treatment == "Three_intrans": total_review_on_player_1 = round((C.review_from_player_2_on_player_1_quan + C.review_from_player_2_on_player_1_qual + player.practice_review_on_player_1_quan + player.practice_review_on_player_1_qual) / 2,2), total_review_on_player_2 = round((C.review_from_player_1_on_player_2_quan + C.review_from_player_1_on_player_2_qual + player.practice_review_on_player_2_quan + player.practice_review_on_player_2_qual) / 2,2), total_review_on_player_3 = round((C.review_from_player_1_on_player_3_quan + C.review_from_player_1_on_player_3_qual + C.review_from_player_2_on_player_3_quan + C.review_from_player_2_on_player_3_qual) / 2,2), total_review_on_player_1_quan = round((C.review_from_player_2_on_player_1_quan + player.practice_review_on_player_1_quan) / 2,2), total_review_on_player_2_quan = round((C.review_from_player_1_on_player_2_quan + player.practice_review_on_player_2_quan) / 2,2), total_review_on_player_3_quan = round((C.review_from_player_1_on_player_3_quan + C.review_from_player_2_on_player_3_quan) / 2,2), total_review_on_player_1_qual = round((C.review_from_player_2_on_player_1_qual + player.practice_review_on_player_1_qual) / 2,2), total_review_on_player_2_qual = round((C.review_from_player_1_on_player_2_qual + player.practice_review_on_player_2_qual) / 2,2), total_review_on_player_3_qual = round((C.review_from_player_1_on_player_3_qual + C.review_from_player_2_on_player_3_qual) / 2,2), else: total_review_on_player_1 = player.practice_review_on_player_1_quan + player.practice_review_on_player_1_qual, total_review_on_player_2 = C.review_from_player_1_on_player_2_quan + C.review_from_player_1_on_player_2_qual, total_review_on_player_3 = C.review_from_player_2_on_player_3_quan + C.review_from_player_2_on_player_3_qual, total_review_on_player_1_quan = player.practice_review_on_player_1_quan, total_review_on_player_2_quan = C.review_from_player_1_on_player_2_quan, total_review_on_player_3_quan = C.review_from_player_2_on_player_3_quan, total_review_on_player_1_qual = player.practice_review_on_player_1_qual, total_review_on_player_2_qual = C.review_from_player_1_on_player_2_qual, total_review_on_player_3_qual = C.review_from_player_2_on_player_3_qual, total_review_on_player_1 = float('.'.join(str(ele) for ele in total_review_on_player_1)) total_review_on_player_2 = float('.'.join(str(ele) for ele in total_review_on_player_2)) total_review_on_player_3 = float('.'.join(str(ele) for ele in total_review_on_player_3)) rank = player.find_rank() if treatment == "Three_trans" or treatment == "Three_intrans": return dict( treatment=player.session.config['treatment'], review_on_player_1_from_player_2_qual=C.review_from_player_2_on_player_1_qual, review_on_player_1_from_player_3_qual=player.practice_review_on_player_1_qual, review_on_player_2_from_player_1_qual=C.review_from_player_1_on_player_2_qual, review_on_player_2_from_player_3_qual=player.practice_review_on_player_2_qual, review_on_player_3_from_player_1_qual=C.review_from_player_1_on_player_3_qual, review_on_player_3_from_player_2_qual=C.review_from_player_2_on_player_3_qual, review_on_player_1_from_player_2_quan=C.review_from_player_2_on_player_1_quan, review_on_player_1_from_player_3_quan=player.practice_review_on_player_1_quan, review_on_player_2_from_player_1_quan=C.review_from_player_1_on_player_2_quan, review_on_player_2_from_player_3_quan=player.practice_review_on_player_2_quan, review_on_player_3_from_player_1_quan=C.review_from_player_1_on_player_3_quan, review_on_player_3_from_player_2_quan=C.review_from_player_2_on_player_3_quan, total_review_on_player_1_from_player_2=C.review_from_player_2_on_player_1_quan + C.review_from_player_2_on_player_1_qual, total_review_on_player_1_from_player_3=player.practice_review_on_player_1_quan + player.practice_review_on_player_1_qual, total_review_on_player_2_from_player_1=C.review_from_player_1_on_player_2_quan + C.review_from_player_1_on_player_2_qual, total_review_on_player_2_from_player_3=player.practice_review_on_player_2_quan + player.practice_review_on_player_2_qual, total_review_on_player_3_from_player_1=C.review_from_player_1_on_player_3_quan + C.review_from_player_1_on_player_3_qual, total_review_on_player_3_from_player_2=C.review_from_player_2_on_player_3_quan + C.review_from_player_2_on_player_3_qual, total_review_from_player_1=round((C.review_from_player_1_on_player_2_quan + C.review_from_player_1_on_player_2_qual + C.review_from_player_1_on_player_3_quan + C.review_from_player_1_on_player_3_qual) / 2,2), total_review_from_player_2=round((C.review_from_player_2_on_player_1_quan + C.review_from_player_2_on_player_1_qual + C.review_from_player_2_on_player_3_quan + C.review_from_player_2_on_player_3_qual) / 2,2), total_review_from_player_3=round((player.practice_review_on_player_1_quan + player.practice_review_on_player_1_qual + player.practice_review_on_player_2_quan + player.practice_review_on_player_2_qual) / 2,2), total_review_on_player_1=total_review_on_player_1, total_review_on_player_2=total_review_on_player_2, total_review_on_player_3=total_review_on_player_3, total_review_on_player_1_quan = round((C.review_from_player_2_on_player_1_quan + player.practice_review_on_player_1_quan) / 2,2), total_review_on_player_2_quan = round((C.review_from_player_1_on_player_2_quan + player.practice_review_on_player_2_quan) / 2,2), total_review_on_player_3_quan = round((C.review_from_player_1_on_player_3_quan + C.review_from_player_2_on_player_3_quan) / 2,2), total_review_on_player_1_qual = round((C.review_from_player_2_on_player_1_qual + player.practice_review_on_player_1_qual) / 2,2), total_review_on_player_2_qual = round((C.review_from_player_1_on_player_2_qual + player.practice_review_on_player_2_qual) / 2,2), total_review_on_player_3_qual = round((C.review_from_player_1_on_player_3_qual + C.review_from_player_2_on_player_3_qual) / 2,2), rank=rank, rank_player_1 = player.participant.vars["RE_rank_practice_player_1"], rank_player_2 = player.participant.vars["RE_rank_practice_player_2"], rank_player_3 = player.participant.vars["RE_rank_practice_player_3"], ) else: return dict( treatment=player.session.config['treatment'], review_on_player_1_from_player_3_qual=player.practice_review_on_player_1_qual, review_on_player_2_from_player_1_qual=C.review_from_player_1_on_player_2_qual, review_on_player_3_from_player_2_qual=C.review_from_player_2_on_player_3_qual, review_on_player_1_from_player_3_quan=player.practice_review_on_player_1_quan, review_on_player_2_from_player_1_quan=C.review_from_player_1_on_player_2_quan, review_on_player_3_from_player_2_quan=C.review_from_player_2_on_player_3_quan, total_review_on_player_1_from_player_3=player.practice_review_on_player_1_qual + player.practice_review_on_player_1_quan, total_review_on_player_2_from_player_1=C.review_from_player_1_on_player_2_qual + C.review_from_player_1_on_player_2_quan, total_review_on_player_3_from_player_2=C.review_from_player_2_on_player_3_qual + C.review_from_player_2_on_player_3_quan, total_review_on_player_1=total_review_on_player_1, total_review_on_player_2=total_review_on_player_2, total_review_on_player_3=total_review_on_player_3, total_review_on_player_1_quan=player.practice_review_on_player_1_quan, total_review_on_player_2_quan=C.review_from_player_1_on_player_2_quan, total_review_on_player_3_quan=C.review_from_player_2_on_player_3_quan, total_review_on_player_1_qual=player.practice_review_on_player_1_qual, total_review_on_player_2_qual=C.review_from_player_1_on_player_2_qual, total_review_on_player_3_qual=C.review_from_player_2_on_player_3_qual, rank=rank, rank_player_1=player.participant.vars["RE_rank_practice_player_1"], rank_player_2=player.participant.vars["RE_rank_practice_player_2"], rank_player_3=player.participant.vars["RE_rank_practice_player_3"], ) class Control(Page): @staticmethod def is_displayed(player): return player.round_number == 1 form_model = 'player' @staticmethod def get_form_fields(player): if player.session.config['treatment'] == "One_trans" or player.session.config['treatment'] == "One_intrans": return ['control_1_one', 'control_2', 'control_3', 'control_4'] else: return ['control_1_three', 'control_2', 'control_3', 'control_4'] #page_sequence = [RE, Belief] page_sequence = [Welcome, Consent, Instruction, PracticeInstruction, PracticeRE, InstructionPayment, PracticeReview, PracticeShowReview_Rework, Control, RE, Belief]