from otree.api import * c = cu doc = '\nThis is a standard 2-player trust game where the amount sent by player 1 gets\ntripled. The trust game was first proposed by\n\n Berg, Dickhaut, and McCabe (1995)\n.\n' class C(BaseConstants): NAME_IN_URL = 'trust' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 1 MULTIPLIER = 3 RECEIVER_MULTIPLIER = 1.5 ENDOWMENT = 10 INSTRUCTIONS_TEMPLATE = 'trust/instructions.html' class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): session = subsession.session import random for group in subsession.get_groups(): group.sender_multiplier = random.choice([1,2]) group.randommessage_ind = random.choice([1,2,3,4,5,6,7,8,9,10]) group.randommessage = random.choice([1,2,3]) class Group(BaseGroup): sender_multiplier = models.FloatField(choices=[[1, '1'], [2, '2']]) sender_own_realized = models.FloatField() sender_other_realized = models.FloatField() receiver_other_amt = models.FloatField() receiver_own_realized = models.FloatField() receiver_other_realized = models.FloatField() sender_own_amt = models.FloatField(label='Please enter an amount.', max=C.ENDOWMENT, min=0) receiver_own_amt = models.FloatField(label='Please enter an amount.', max=C.ENDOWMENT, min=0) sender_transfer = models.FloatField(min=0) receiver_transfer = models.FloatField(min=0) sender_other_amt = models.FloatField(min=0) sender_total_invest = models.FloatField() sender_total_realize = models.FloatField() receiver_total_invest = models.FloatField() receiver_total_realize = models.FloatField() sender_ex_own = models.FloatField(label='Please enter an amount.', max=C.ENDOWMENT, min=0) sender_ex_transfer = models.FloatField() sender_ex_other = models.FloatField() sender_ex_total = models.FloatField() sender_ex_other_real = models.FloatField() sender_ex_payoff = models.FloatField() sender_message = models.IntegerField(choices=[[1, 'Send message: I received account that doubles investment.'], [2, 'Send message: I received account where investment stays the same.'], [3, 'Do not send message.']], label='Please select one of the following options.') sender_confirm = models.IntegerField(choices=[[1, 'Yes'], [0, 'No']]) receiver_belief = models.IntegerField(choices=[[1, '一定收到了翻倍的投资账户'], [2, '很可能收到了翻倍的投资账户'], [3, '同样可能收到会翻倍的和不会翻倍的投资账户'], [4, '很可能收到了不会翻倍的投资账户'], [5, '一定收到了不会翻倍的投资账户']], label='Please select one of the following options.') receiver_confirm = models.IntegerField(choices=[[1, 'Yes'], [0, 'No']]) receiver_belief2 = models.IntegerField(choices=[[1, '您的家人很可能发送了正确的消息'], [2, '您的家人很可能发送了错误的消息'], [3, '您的家人很可能没有发送消息'], [4, '无法判断']], label='Please select one of the following options.') receiver_ex_own = models.FloatField(label='Please enter an amount.', max=C.ENDOWMENT, min=0) receiver_ex_other = models.FloatField() receiver_ex_transfer = models.FloatField() receiver_ex_total = models.FloatField() receiver_ex_own_real = models.FloatField() receiver_ex_total_real = models.FloatField() receiver_ex_payoff = models.FloatField() sender_belief2 = models.IntegerField(choices=[[1, '很可能收到了消息说我收到了翻倍的账户。'], [2, '很可能收到了消息说我收到了不能翻倍的账户。'], [3, '很可能没有收到消息。'], [0, '不清楚。']], label='Please select one of the following options.') sender_belief = models.IntegerField(choices=[[1, '很可能会觉得我收到了翻倍的账户'], [2, '很可能会觉得我收到了不翻倍的账户'], [3, '会觉得收到两个账户的可能性差不多'], [0, '不清楚']], label='Please select one of the following options.') randommessage_ind = models.IntegerField(choices=[[1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7'], [8, '8'], [9, '9'], [10, '10']]) randommessage = models.IntegerField(choices=[[1, '1'], [2, '2'], [3, '3']]) message = models.IntegerField(choices=[[1, '1'], [2, '2'], [3, '3']]) def sent_back_amount_max(group: Group): return group.sent_amount * C.MULTIPLIER def set_payoffs(group: Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p1.payoff = group.sender_total_realize - group.sender_transfer + group.receiver_transfer p2.payoff = group.receiver_total_realize + group.sender_transfer - group.receiver_transfer def set_realization(group: Group): group.sender_total_invest = group.sender_own_amt + group.receiver_other_amt group.sender_total_realize = group.sender_total_invest * group.sender_multiplier group.receiver_total_invest = group.receiver_own_amt + group.sender_other_amt group.receiver_total_realize = group.receiver_total_invest * C.RECEIVER_MULTIPLIER def set_random_message(group: Group): if group.randommessage_ind == 1: group.message = group.randommessage else: group.message = group.sender_message class Player(BasePlayer): pass class Introduction(Page): form_model = 'player' class Sender(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 class Receiver(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 class SenderExample(Page): form_model = 'group' form_fields = ['sender_ex_own'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group group.sender_ex_other = 20 - group.sender_ex_own group.sender_ex_other_real = group.sender_ex_other * C.RECEIVER_MULTIPLIER class SenderExampleConfirm(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group group.sender_ex_total = group.sender_ex_own + 10 class SenderExampleTransfer(Page): form_model = 'group' form_fields = ['sender_ex_transfer'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group group.sender_ex_payoff = group.sender_ex_total - group.sender_ex_transfer @staticmethod def error_message(player: Player, values): group = player.group if values['sender_ex_transfer'] > group.sender_ex_total: return 'Maximum transfer cannot exceed total realized amount in the account' class SenderExampleResults(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 class ReceiverExample(Page): form_model = 'group' form_fields = ['receiver_ex_own'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group group.receiver_ex_other = 20 - group.receiver_ex_own group.receiver_ex_own_real = group.receiver_ex_own * C.RECEIVER_MULTIPLIER group.receiver_ex_total = group.receiver_ex_own + 10 group.receiver_ex_total_real = group.receiver_ex_total * C.RECEIVER_MULTIPLIER class ReceiverExampleConfirm(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 class ReceiverExampleTransfer(Page): form_model = 'group' form_fields = ['receiver_ex_transfer'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group group.receiver_ex_payoff = group.receiver_ex_total_real - group.receiver_ex_transfer @staticmethod def error_message(player: Player, values): group = player.group if values['receiver_ex_transfer'] > group.receiver_ex_total_real: return 'Maximum transfer cannot exceed total realized amount in the account' class ReceiverExampleResult(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 class WaitToStart(WaitPage): pass class SenderSelection(Page): form_model = 'group' @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 class SenderMessage(Page): form_model = 'group' form_fields = ['sender_message'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 class ReceiverInstruction(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 class ReceiverMustWait(WaitPage): after_all_players_arrive = set_random_message class SenderBelief(Page): form_model = 'group' form_fields = ['sender_belief', 'sender_belief2'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 class ReceiverBelief(Page): form_model = 'group' form_fields = ['receiver_belief', 'receiver_belief2'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 class SenderAllocation(Page): form_model = 'group' form_fields = ['sender_own_amt'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group group.sender_other_amt = 20 - group.sender_own_amt group.sender_own_realized = group.sender_own_amt * group.sender_multiplier group.sender_other_realized = group.sender_other_amt * C.RECEIVER_MULTIPLIER class ReceiverAllocation(Page): form_model = 'group' form_fields = ['receiver_own_amt'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group group.receiver_other_amt = 20 - group.receiver_own_amt group.receiver_own_realized = group.receiver_own_amt * C.RECEIVER_MULTIPLIER group.receiver_other_realized = group.receiver_other_amt * group.sender_multiplier class SenderAllocationConfirmation(Page): form_model = 'group' form_fields = ['sender_confirm'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 class ReceiverAllocationConfirmation(Page): form_model = 'group' form_fields = ['receiver_confirm'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 class SenderAllocation2(Page): form_model = 'group' form_fields = ['sender_own_amt'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 and group.sender_confirm == 0 @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group group.sender_other_amt = 20 - group.sender_own_amt group.sender_own_realized = group.sender_own_amt * group.sender_multiplier group.sender_other_realized = group.sender_other_amt * C.RECEIVER_MULTIPLIER class ReceiverAllocation2(Page): form_model = 'group' form_fields = ['receiver_own_amt'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 and group.receiver_confirm == 0 @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group group.receiver_other_amt = 20 - group.receiver_own_amt group.receiver_own_realized = group.receiver_own_amt * C.RECEIVER_MULTIPLIER group.receiver_other_realized = group.receiver_other_amt * group.sender_multiplier class AllocationWaitPage(WaitPage): after_all_players_arrive = set_realization class SenderTransfer(Page): form_model = 'group' form_fields = ['sender_transfer'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 @staticmethod def error_message(player: Player, values): group = player.group if values['sender_transfer'] > group.sender_total_realize: return 'Maximum transfer cannot exceed total realized amount in the account' class ReceiverTransfer(Page): form_model = 'group' form_fields = ['receiver_transfer'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 @staticmethod def error_message(player: Player, values): group = player.group if values['receiver_transfer'] > group.receiver_total_realize: return 'Maximum transfer cannot exceed total realized amount in the account' class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): form_model = 'player' class Debrief(Page): form_model = 'player' page_sequence = [Introduction, Sender, Receiver, SenderExample, SenderExampleConfirm, SenderExampleTransfer, SenderExampleResults, ReceiverExample, ReceiverExampleConfirm, ReceiverExampleTransfer, ReceiverExampleResult, WaitToStart, SenderSelection, SenderMessage, ReceiverInstruction, ReceiverMustWait, SenderBelief, ReceiverBelief, SenderAllocation, ReceiverAllocation, SenderAllocationConfirmation, ReceiverAllocationConfirmation, SenderAllocation2, ReceiverAllocation2, AllocationWaitPage, SenderTransfer, ReceiverTransfer, ResultsWaitPage, Results, Debrief]