from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'ThresholdPGG' PLAYERS_PER_GROUP = 3 NUM_ROUNDS = 3 ENDOWMENT = cu(400) THRESHOLD = cu(600) RETURN_M = cu(800) RETURN_A = cu(600) RETURN_B = cu(400) INSTRUCTIONS_TEMPLATE = 'ThresholdPGG/instructions.html' class Subsession(BaseSubsession): pass class Group(BaseGroup): total_contribution = models.CurrencyField() completion = models.BooleanField(label='') omaisthree = models.BooleanField(choices=[[True, 'Yes'], [False, 'No']], widget=widgets.RadioSelect) tmaisone = models.BooleanField(choices=[[True, 'Yes'], [False, 'No']], widget=widgets.RadioSelect) tmaisthree = models.BooleanField(choices=[[True, 'Yes'], [False, 'No']], widget=widgets.RadioSelect) omaistwo = models.BooleanField(choices=[[True, 'Yes'], [False, 'No']], widget=widgets.RadioSelect) ponemanager = models.IntegerField(choices=[[1, 'Yes'], [2, 'No']], label='Do you wish to be the Manager?', widget=widgets.RadioSelect) ptwomanager = models.IntegerField(choices=[[1, 'Yes'], [2, 'No']], label='Do you wish to be the Manager?', widget=widgets.RadioSelect) pthreemanager = models.IntegerField(choices=[[1, 'Yes'], [2, 'No']], label='Do you wish to be the Manager?', widget=widgets.RadioSelect) thmaisone = models.BooleanField(choices=[[True, 'Yes'], [False, 'No']]) thmaistwo = models.BooleanField(choices=[[True, 'Yes'], [False, 'No']], widget=widgets.RadioSelect) managermessageA = models.LongStringField(label='What would like to say to the Rank A Worker?') managermessageB = models.LongStringField(label='What would like to say to the Rank B Worker?') atomanager = models.LongStringField(label='What message would you like to send to your Manager?') btomanager = models.LongStringField(label='What message would you like to send to your Manager?') numemos = models.IntegerField(choices=[[0, '0'], [1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5']], label='How many angry faces would you like to send to your Manager?', widget=widgets.RadioSelect) p1name = models.StringField() p2name = models.StringField() p3name = models.StringField() managercon = models.CurrencyField() workeracon = models.CurrencyField() workerbcon = models.CurrencyField() managername = models.StringField() workeraname = models.StringField() workerbname = models.StringField() p1age = models.IntegerField() p2age = models.IntegerField() p3age = models.IntegerField() def set_payoffs(group: Group): players = group.get_players() contributions = [p.contribution for p in players] group.total_contribution = sum(contributions) threshold = C.THRESHOLD for player in players: if player.type == 'Manager': group.managercon = player.contribution if group.total_contribution >= threshold: player.payoff = C.ENDOWMENT - player.contribution + C.RETURN_M else: player.payoff = C.ENDOWMENT elif player.type == 'Worker A': group.workeracon = player.contribution if group.total_contribution >= threshold: player.payoff = C.ENDOWMENT - player.contribution + C.RETURN_A else: player.payoff = C.ENDOWMENT elif player.type == 'Worker B': group.workerbcon = player.contribution if group.total_contribution >= threshold: player.payoff = C.ENDOWMENT - player.contribution + C.RETURN_B else: player.payoff = C.ENDOWMENT def role_p1(group: Group): for player in group.get_players(): if group.ponemanager == 1: if group.omaistwo == True: if player.id_in_group == 1: player.type = 'Manager' group.managername = group.p1name elif player.id_in_group == 2: player.type = 'Worker A' group.workeraname = group.p2name else: player.type = 'Worker B' group.workerbname = group.p3name elif group.omaisthree == True: if player.id_in_group == 1: player.type = 'Manager' group.managername = group.p1name elif player.id_in_group == 3: player.type = 'Worker A' group.workeraname = group.p3name else: player.type = 'Worker B' group.workerbname = group.p2name else: pass def role_p2(group: Group): for player in group.get_players(): if group.ponemanager == 2: if group.ptwomanager == 1: if group.tmaisone == True: if player.id_in_group == 2: player.type = 'Manager' group.managername = group.p2name elif player.id_in_group == 1: player.type = 'Worker A' group.workeraname = group.p1name else: player.type = 'Worker B' group.workerbname = group.p3name elif group.tmaisthree == True: if player.id_in_group == 2: player.type = 'Manager' group.managername = group.p2name elif player.id_in_group == 3: player.type = 'Worker A' group.workeraname = group.p3name else: player.type = 'Worker B' group.workerbname = group.p1name else: pass else: pass def role_p3(group: Group): for player in group.get_players(): if group.ponemanager == 2 and group.ptwomanager == 2: if group.pthreemanager == 1: if group.thmaisone == True: if player.id_in_group == 3: group.managername = group.p3name player.type = 'Manager' elif player.id_in_group == 1: group.workeraname = group.p1name player.type = 'Worker A' else: player.type = 'Worker B' group.workerbname = group.p2name elif group.thmaistwo == True: if player.id_in_group == 3: group.managername = group.p3name player.type = 'Manager' elif player.id_in_group == 2: group.workeraname = group.p2name player.type = 'Worker A' else: player.type = 'Worker B' group.workerbname = group.p1name else: pass else: pass def role_random(group: Group): for player in group.get_players(): if group.ponemanager == 2 and group.ptwomanager == 2 and group.pthreemanager == 2: if player.id_in_group == 1: player.type = 'Manager' group.managername = group.p1name elif player.id_in_group == 2: player.type = 'Worker A' group.workeraname = group.p2name else: player.type = 'Worker B' group.workerbname = group.p3name else: pass def set_names(group: Group): for player in group.get_players(): if player.round_number == 1: if player.id_in_group == 1: group.p1age = player.age if player.gender == 'Male': group.p1name = player.namemale elif player.gender == 'Female': group.p1name = player.namefemale else: group.p1name = player.nameother elif player.id_in_group == 2: group.p2age = player.age if player.gender == 'Male': group.p2name = player.namemale elif player.gender == 'Female': group.p2name = player.namefemale else: group.p2name = player.nameother elif player.id_in_group == 3: group.p3age = player.age if player.gender == 'Male': group.p3name = player.namemale elif player.gender == 'Female': group.p3name = player.namefemale else: group.p3name = player.nameother else: prev_group = group.in_round(group.round_number - 1) group.p1name = prev_group.p1name group.p2name = prev_group.p2name group.p3name = prev_group.p3name class Player(BasePlayer): contribution = models.CurrencyField(label='How much would you like to contribute?', max=C.ENDOWMENT, min=0) type = models.StringField() gender = models.StringField(choices=[['Male', 'Male'], ['Female', 'Female'], ['Others', 'Others']], label='What is your gender identity?', widget=widgets.RadioSelect) namefemale = models.StringField(choices=[['Heather', 'Heather'], ['Jessica', 'Jessica'], ['Hannah', 'Hannah'], ['Emily', 'Emily']], label='What name would you like to use with your group members in this project? ', widget=widgets.RadioSelect) namemale = models.StringField(choices=[['Jacob', 'Jacob'], ['Michael', 'Michael'], ['Joshua', 'Joshua'], ['Jeremy', 'Jeremy']], label='What name would you like to use with your group members in this project? ', widget=widgets.RadioSelect) nameother = models.StringField(choices=[['Kai', 'Kai'], ['Ridley', 'Ridley'], ['Lowen', 'Lowen'], ['Ellis', 'Ellis']], label='What name would you like to use with your group members in this project? ', widget=widgets.RadioSelect) age = models.IntegerField(label='What is your age in years?') class BasicInfo(Page): form_model = 'player' form_fields = ['gender', 'age'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class MaleName(Page): form_model = 'player' form_fields = ['namemale'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 and player.gender == 'Male' class FemaleName(Page): form_model = 'player' form_fields = ['namefemale'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 and player.gender == 'Female' class OtherName(Page): form_model = 'player' form_fields = ['nameother'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 and player.gender == 'Others' class NameWaitPage(WaitPage): after_all_players_arrive = set_names class Introduction(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 class P1Choice(Page): form_model = 'group' form_fields = ['ponemanager'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 class P1Ranking(Page): form_model = 'group' form_fields = ['omaistwo', 'omaisthree'] @staticmethod def is_displayed(player: Player): group = player.group onemanager = group.field_maybe_none('ponemanager') return onemanager == 1 and player.id_in_group == 1 class RoleP1WaitPage(WaitPage): after_all_players_arrive = role_p1 class P2Choice(Page): form_model = 'group' form_fields = ['ptwomanager'] @staticmethod def is_displayed(player: Player): group = player.group return group.ponemanager == 2 and player.id_in_group == 2 class P2Ranking(Page): form_model = 'group' form_fields = ['tmaisone', 'tmaisthree'] @staticmethod def is_displayed(player: Player): group = player.group twomanager = group.field_maybe_none('ptwomanager') return twomanager == 1 and player.id_in_group == 2 class RoleP2WaitPage(WaitPage): after_all_players_arrive = role_p2 class P3Choice(Page): form_model = 'group' form_fields = ['pthreemanager'] @staticmethod def is_displayed(player: Player): group = player.group return group.ponemanager == 2 and group.ptwomanager == 2 and player.id_in_group == 3 class P3Ranking(Page): form_model = 'group' form_fields = ['thmaisone', 'thmaistwo'] @staticmethod def is_displayed(player: Player): group = player.group threemanager = group.field_maybe_none('pthreemanager') return threemanager ==1 and player.id_in_group == 3 class RoleP3WaitPage(WaitPage): after_all_players_arrive = role_p3 class RoleRandomWaitPage(WaitPage): after_all_players_arrive = role_random class Role(Page): form_model = 'player' class ManagerMessage(Page): form_model = 'group' form_fields = ['managermessageA', 'managermessageB'] @staticmethod def is_displayed(player: Player): return player.type == 'Manager' class MMessageWaitPage(WaitPage): @staticmethod def is_displayed(player: Player): return player.type == 'Worker A' or player.type == 'Worker B' class MMessageDisplayA(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.type == 'Worker A' class MMessageDisplayB(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.type == 'Worker B' class Contrbute(Page): form_model = 'player' form_fields = ['contribution'] class ResultWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Result(Page): form_model = 'player' class AMessage(Page): form_model = 'group' form_fields = ['atomanager'] @staticmethod def is_displayed(player: Player): return player.type == 'Worker A' class BMessage(Page): form_model = 'group' form_fields = ['btomanager', 'numemos'] @staticmethod def is_displayed(player: Player): return player.type == 'Worker B' class ABMessageWaitPage(WaitPage): @staticmethod def is_displayed(player: Player): return player.type == 'Manager' class ABMessageDisplay(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.type =='Manager' page_sequence = [BasicInfo, MaleName, FemaleName, OtherName, NameWaitPage, Introduction, P1Choice, P1Ranking, RoleP1WaitPage, P2Choice, P2Ranking, RoleP2WaitPage, P3Choice, P3Ranking, RoleP3WaitPage, RoleRandomWaitPage, Role, ManagerMessage, MMessageWaitPage, MMessageDisplayA, MMessageDisplayB, Contrbute, ResultWaitPage, Result, AMessage, BMessage, ABMessageWaitPage, ABMessageDisplay]