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]