from otree.api import * import random doc = """ One player decides how to divide a certain amount between himself and the other player. See: Kahneman, Daniel, Jack L. Knetsch, and Richard H. Thaler. "FairnessModuleNotFoundError: No module named 'otree' and the assumptions of economics." Journal of business (1986): S285-S300. """ class C(BaseConstants): NAME_IN_URL = 'dictator_multiple_round' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 INSTRUCTIONS_TEMPLATE = 'dictator_multiple_round/instructions.html' ENDOWMENT = cu(100) Diff_dec_similar = 1 Probability = 0.5 # currency_range(0, 100, 0.5) # this gives: # [$0.00, $0,50, $1 ,..., $90, $90,5, $100] class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): player_id = models.StringField() treatment = models.StringField() shared = models.CurrencyField( doc="""Amount dictator decided to share to another""", min=0, max=C.ENDOWMENT, label="How much do you want to send to participant 2?" " I will share...", ) shared2 = models.CurrencyField( doc="""Amount dictator decided to share to another at last""", min=0, max=C.ENDOWMENT, label="How much do you want to send to participant 2?" " I will share at last...", ) kept = models.CurrencyField() ################################################# # FUNCTIONS ################################################# # ACA VAN LOS RANDOM. EN FUNCTIONS. def set_payoffs(player: Player): player.kept = C.ENDOWMENT - player.shared2 player.payoff = player.kept #p1 = player.player_id #p2 = player.player_id #player.kept = C.ENDOWMENT - player.shared #p1.payoff = player.kept #p2.payoff = player.shared # Balance treatment groups: Itertools def creating_session(subsession: Subsession): import itertools treatments = itertools.cycle(['dec_diff', 'dec_similar', 'dec_fifty', 'dec_placebo']) for player in subsession.get_players(): player.treatment = next(treatments) ################################################# # PAGES ################################################# class Introduction(Page): pass class Sent(Page): form_model = 'player' form_fields = ['shared'] timeout_seconds = 30 @staticmethod def js_vars(player: Player): return dict(endowment=C.ENDOWMENT) # @staticmethod # def before_next_page(player: Player, timeout_happened): # participant = player.participant # p1 = participant.get_player_by_id() # player.payoff = p1.shared # p1.payoff = C.ENDOWMENT - p1.shared class ResultsWaitPage(WaitPage): pass class Results(Page): @staticmethod def vars_for_template(player: Player): result = C.ENDOWMENT - player.shared return { "Result": result } ##################################################### class Introduction2(Page): pass class Sent2_dec_diff(Page): form_model = 'player' form_fields = ['shared2'] @staticmethod def is_displayed(player: Player): return player.treatment == 'dec_diff' @staticmethod def js_vars(player: Player): return dict(endowment=C.ENDOWMENT) @staticmethod def before_next_page(player: Player, timeout_happened): import random if random.random() < C.Probability: set_payoffs(player) else: player.payoff = cu(0) #participant = player.participant #import random #potential_payoff = random.randint(100, 200) #player.shared2 = shared2 #participant.app_payoffs[__name__] = potential_payoff class Sent2_dec_similar(Page): form_model = 'player' form_fields = ['shared2'] @staticmethod def is_displayed(player: Player): return player.treatment == 'dec_similar' @staticmethod def js_vars(player: Player): return dict(endowment=C.ENDOWMENT) @staticmethod def vars_for_template(player: Player): other_shared_mas_1 = player.shared + C.Diff_dec_similar other_shared_less_1 = player.shared - C.Diff_dec_similar return dict( other_shared_mas_1=other_shared_mas_1, other_shared_less_1=other_shared_less_1, ) @staticmethod def before_next_page(player: Player, timeout_happened): import random if random.random() < C.Probability: set_payoffs(player) else: player.payoff = cu(0) class Sent2_equal(Page): form_model = 'player' form_fields = ['shared2'] @staticmethod def is_displayed(player: Player): return player.treatment == 'dec_fifty' @staticmethod def js_vars(player: Player): return dict(endowment=C.ENDOWMENT) @staticmethod def before_next_page(player: Player, timeout_happened): import random if random.random() < C.Probability: set_payoffs(player) else: player.payoff = cu(0) class Sent2_placebo(Page): form_model = 'player' form_fields = ['shared2'] @staticmethod def is_displayed(player: Player): return player.treatment == 'dec_placebo' @staticmethod def js_vars(player: Player): return dict(endowment=C.ENDOWMENT) @staticmethod def before_next_page(player: Player, timeout_happened): import random if random.random() < C.Probability: set_payoffs(player) else: player.payoff = cu(0) class FinalResult(Page): #en la Ășltima ronda... #@staticmethod #def is_displayed(player: Player): # return player.round_number == C.NUM_ROUNDS @staticmethod def vars_for_template(player: Player): result2 = C.ENDOWMENT - player.shared2 return { "Result": result2, } page_sequence = [Introduction, Sent, Results, Introduction2, Sent2_dec_diff, Sent2_dec_similar, Sent2_equal, Sent2_placebo, FinalResult]