from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'ultimatum' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 1 AMOUNT = 10.00 # used to be 3 class Subsession(BaseSubsession): pass class Group(BaseGroup): proposer_amount = models.FloatField() responder_minimum = models.FloatField() proposer_earnings = models.FloatField() responder_earnings = models.FloatField() class Player(BasePlayer): distribution_self = models.FloatField( min=0.0, max=C.AMOUNT, label='How much would you distribute to yourself if you are selected as the proposer?' ) minimum_acceptance = models.FloatField( min=0.0, max=C.AMOUNT, label='What would be the minimum amount you would accept from your matching if you are selected as the receiver?' ) agreement = models.IntegerField( initial = -1 ) ultimatum_earnings = models.FloatField() # PAGES class MatchingWaitPage(WaitPage): group_by_arrival_time = True title_text = "Please wait" body_text = ("We are looking for subjects to build a group. The moment the group is formed you will start the last task of the experiment." "Please be patient as we wait for enough participants to start, which may take a few minutes. If you have been waiting for more than 20 minutes, we kindly ask that you exit the experiment. Thank you for your understanding!") def is_displayed(player): return player.round_number == 1 class P01_Ultimatum(Page): form_model = 'player' form_fields = ['distribution_self', 'minimum_acceptance'] def before_next_page(player, timeout_happened): if player.id_in_group == 1: player.group.proposer_amount = player.distribution_self if player.id_in_group == 2: player.group.responder_minimum = player.minimum_acceptance class UltimatumWaitPage(WaitPage): def after_all_players_arrive(group: Group): if ( C.AMOUNT - group.proposer_amount ) >= group.responder_minimum: group.proposer_earnings = group.proposer_amount group.responder_earnings = C.AMOUNT - group.proposer_amount for player in group.get_players(): player.agreement = 1 else: group.proposer_earnings = 0.0 group.responder_earnings = 0.0 for player in group.get_players(): player.agreement = 0 for player in group.get_players(): if player.id_in_group == 1: player.ultimatum_earnings = player.group.proposer_earnings if player.id_in_group == 2: player.ultimatum_earnings = player.group.responder_earnings player.participant.vars['money_earned_ultimatum'] = player.ultimatum_earnings class P02_UltimatumResults(Page): def vars_for_template(player): return dict( matching_amount = C.AMOUNT - player.group.proposer_amount, ) class P03_EndOfExperiment(Page): pass # the order in which the pages display page_sequence = [ MatchingWaitPage, P01_Ultimatum, UltimatumWaitPage, P02_UltimatumResults, P03_EndOfExperiment, ]