from otree.api import * # from .admin_report_functions import * doc = """ Ultimatum Game. One of two players is asked to split 100. The second player can accept or reject the offer. If accepted, everyone gets their assigned amount. If rejected, nobody gets anything. See: Kahneman, Daniel, Jack L. Knetsch, and Richard H. Thaler. "Fairness and the assumptions of economics." Journal of business (1986): S285-S300. """ class C(BaseConstants): NAME_IN_URL = 'ultimatum_2' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 10 INSTRUCTIONS_TEMPLATE = 'ultimatum_2/instructions.html' ENDOWMENT = cu(100) # 10 rounds for the iterated version class Subsession(BaseSubsession): pass class Group(BaseGroup): amount_offered = models.CurrencyField(min=0, max=C.ENDOWMENT, doc="Amount offered") offer_accepted = models.BooleanField(doc="if offered amount is accepted") name_1 = models.StringField(label="Your name:") name_2 = models.StringField(label="Your name:") # for p in p1, p2: # p.participant.vars["ultimatum_gameF"] = dict(payoff=p.payoff) # print('p.payoff:', p.payoff) class Player(BasePlayer): pass # FUNCTIONS def creating_session(subsession): subsession.group_randomly() def set_payoffs(group: Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p1.payoff = (C.ENDOWMENT - group.amount_offered) * group.offer_accepted p2.payoff = group.amount_offered * group.offer_accepted p1.participant.vars['earning_1'] = p1.payoff p2.participant.vars['earning_1'] = p2.payoff def get_players(): pass # opponent = player.get_others_in_group() # print(opponent) # opponent_label = opponent.label # print(opponent_label) # return dict(opponent=opponent, opponent_label=opponent_label) def vars_for_admin_report(subsession): accepted_offers = [] rejected_offers = [] for subsession in subsession.in_all_rounds(): for group in subsession.get_groups(): if group.field_maybe_none('amount_offered') is not None: if group.field_maybe_none('offer_accepted'): accepted_offer = group.amount_offered accepted_offers.append(accepted_offer) else: rejected_offer = group.amount_offered rejected_offers.append(rejected_offer) payoffs = sorted([p.payoff for p in subsession.get_players() if p.payoff is not None]) return dict(payoffs=payoffs, accepted_offers=accepted_offers, rejected_offers=rejected_offers) # def js_vars(player: Player): # group = player.group # return dict( # taken=group.kept, # ) # PAGES class Introduction(Page): pass class Name1(Page): form_model = 'group' form_fields = ['name_1'] @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 class WaitForName(WaitPage): @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 class Name2(Page): form_model = 'group' form_fields = ['name_2'] @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 class WaitForName2(WaitPage): @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 class Offer(Page): form_model = 'group' form_fields = ['amount_offered'] @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 @staticmethod def vars_for_template(player: Player): group = player.group return dict(name_1=group.name_1, name_2=group.name_2) class WaitForOffer(WaitPage): @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 return True class Accept(Page): form_model = 'group' form_fields = ['offer_accepted'] @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): @staticmethod def vars_for_template(player: Player): group = player.group return dict(offer=group.amount_offered) # class Final(Page) # @staticmethod # def is_displayed(player: Player): # participant = player.participant # this_player = player.in_all_rounds() # payoffs. # return participant.finished # # @staticmethod # def js_vars(player: Player): # group = player.group # return dict( # taken=group.kept, # ) # # @staticmethod # def vars_for_admin_report(subsession): # payoffs = sorted([p.payoff for p in subsession.get_players()]) # return dict(payoffs=payoffs) page_sequence = [Introduction, Name1, WaitForName, Name2, WaitForName2, Offer, WaitForOffer, Accept, ResultsWaitPage, Results]