from otree.api import * # from .admin_report_functions import * doc = """ Ultimatum Game (anonymous with a new person each time). 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_one_shot' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 1 INSTRUCTIONS_TEMPLATE = 'ultimatum_one_shot/instructions.html' ENDOWMENT = cu(100) 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") # 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(): # this_group = subsession.group # offer = C.ENDOWMENT - this_group.kept # all_offers.append(offer) # payoffs = sorted([p.payoff for p in subsession.get_players()]) for group in subsession.get_groups(): 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()]) 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 Offer(Page): form_model = 'group' form_fields = ['amount_offered'] @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 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) # # @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, Offer, WaitForOffer, Accept, ResultsWaitPage, Results]