# __init__.py from otree.api import * import random author = "Gerhard Riener" doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = "judgement" PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 # TODO: Check treatments TREAT_LIST = ["base", "basefree", "costly"] TREAT_WEIGHTS = [30, 10, 60] PROPGUILTYLIST = [70, 85, 95, 99] COST_INFO_LIST = [0, 2, 5] ENDOWMENT = cu(10) SALARYA = cu(10) ADDA = cu(3) REDUCTIONA = cu(5) PUNISHMENT = cu(5) class Subsession(BaseSubsession): pass def creating_session(subsession): # randomize to treatments for player in subsession.get_players(): player.treat = str( random.choices(population=C.TREAT_LIST, weights=C.TREAT_WEIGHTS, k=1)[0] ) print("set player.treat to", player.treat) player.propguilty = random.choice(C.PROPGUILTYLIST) print("set player.propguilty to", player.propguilty) player.costinfo = random.choice(C.COST_INFO_LIST) print("set player.costinfo to", player.costinfo) player.player_A_stole = random.choice([True, False]) print("set player.player_A_stole", player.player_A_stole) class Group(BaseGroup): pass class Player(BasePlayer): treat = models.StringField() costinfo = models.CurrencyField() propguilty = models.StringField() probreductionB = models.StringField() obtaininfo = models.BooleanField( doc="""Willing ot obtain info""", label="Ich möchte diese Information erhalten", # default=False ) punish = models.BooleanField( doc="""Willingness to reduce payment of worker A""", label="Ich möchte Arbeitnehmer A bestrafen und etwas vom Lohn abziehen", error_messages={"required": "you custom error message"}, ) player_A_stole = models.BooleanField(initial=False) ## FUNCTIONS @staticmethod def set_payoffs(player: Player): for player in subsession.get_players(player): if player.obtaininfo: player.payoff = C.ENDOWMENT - player.costinfo else: player.payoff = C.ENDOWMENT ## PAGES class story(Page): # after_all_players_arrive = 'set_probreductionB' def vars_for_template(player: Player): return dict( obtaininfo=player.field_maybe_none("obtaininfo"), treat=player.field_maybe_none("treat"), costinfo=player.field_maybe_none("costinfo"), propguilty=player.propguilty, propnotguilty=player.propguilty, ) class information(Page): form_model = "player" form_fields = {"obtaininfo"} def vars_for_template(player: Player): return dict( obtaininfo=player.field_maybe_none("obtaininfo"), treat=player.field_maybe_none("treat"), costinfo=player.field_maybe_none("costinfo"), propguilty=player.propguilty, propnotguilty=player.propguilty, ) def is_displayed(player: Player): return player.treat == "costly" class information_basefree(Page): form_model = "player" def vars_for_template(player: Player): return dict( treat=player.field_maybe_none("treat"), costinfo=player.field_maybe_none("costinfo"), propguilty=player.field_maybe_none("propguilty"), propnotguilty=player.field_maybe_none("propguilty"), ) def is_displayed(player: Player): return player.treat == "basefree" class decision(Page): form_model: str = "player" form_fields = {"punish"} def vars_for_template(player: Player): return dict( obtaininfo=player.field_maybe_none("obtaininfo"), treat=player.field_maybe_none("treat"), costinfo=player.field_maybe_none("costinfo"), propguilty=player.field_maybe_none("propguilty"), propnotguilty=player.field_maybe_none("propguilty"), player_A_stole=player.field_maybe_none("player_A_stole"), ) class ResultsWaitPage(WaitPage): # pass # group_by_arrival_time = True after_all_players_arrive = set_payoffs class Results(Page): def vars_for_template(player: Player): return dict( obtaininfo=player.payoff, ) page_sequence = [story, information, information_basefree, decision, Results]