from otree.api import * doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'ultimatum' players_per_group = 2 num_rounds = 2 budget = 100 class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): subsession.group_randomly(fixed_id_in_group = True) class Group(BaseGroup): proposed = models.IntegerField( min= 0, max = Constants.budget ) accept = models.IntegerField( choices = [ [0, "Reject"], [1, "Accept"], ], widget = widgets.RadioSelect ) class Player(BasePlayer): pass # PAGES class Welcome(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class ResponderWaits(WaitPage): @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 class Proposal(Page): @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 form_model = 'group' form_fields = ['proposed'] class Acceptance(Page): @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 form_model = 'group' form_fields = ['accept'] class ResultsWaitPage(WaitPage): @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 @staticmethod def after_all_players_arrive(group: Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if group.accept ==0: p1.payoff = 0 p2.payoff = 0 else: p1.payoff = Constants.budget - group.proposed p2.payoff = group.proposed class Results(Page): pass class FinalResult(Page): @staticmethod def is_displayed(player: Player): return player.round_number == Constants.num_rounds def vars_for_template(player: Player): import random paidround = random.randint(1,Constants.num_rounds) p=player.in_round(paidround) finalpayoff = p.payoff return dict( finalpayoff = finalpayoff, paidround=paidround ) page_sequence = [Welcome, ResponderWaits, Proposal, Acceptance, ResultsWaitPage, Results, FinalResult]