from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'public_goods_simple' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 MULTIPLIER = 1.8 ED_RICH = cu(75) ED_POOR = cu(25) ED_STANDARD = cu(50) class Subsession(BaseSubsession): pass class Group(BaseGroup): total_contribution_rich = models.CurrencyField() total_contribution_mc = models.CurrencyField() total_contribution_poor = models.CurrencyField() total_contribution_test = models.CurrencyField() total_contribution_standard = models.CurrencyField() individual_share_standard = models.CurrencyField() individual_share_test = models.CurrencyField() def set_payoffs(group: Group): players = group.get_players() contributions_standard = [p.contribution_standard for p in players] group.total_contribution_standard = sum(contributions_standard) contributions_rich = [p.contribution_rich for p in players] group.total_contribution_rich = sum(contributions_rich) contributions_mc = [p.contribution_mc for p in players] group.total_contribution_mc = sum(contributions_mc) contributions_poor = [p.contribution_poor for p in players] group.total_contribution_poor = sum(contributions_poor) s=0 r=0 m=0 a=0 for p in players: if p.roleZ == 1: s=s+1 if p.roleZ == 2: r=r+1 if p.roleZ == 3: m=m+1 if p.roleZ == 4: a=a+1 t=r+m+a group.total_contribution_test=group.total_contribution_rich+group.total_contribution_mc+group.total_contribution_poor group.individual_share_standard = (group.total_contribution_standard * C.MULTIPLIER / s) group.individual_share_test = (group.total_contribution_test* C.MULTIPLIER / t) for p in players: if p.roleZ==1: p.payoff = C.ED_STANDARD - p.contribution_standard + group.individual_share_standard if p.roleZ==2: p.payoff = C.ED_RICH - p.contribution_rich + group.individual_share_test if p.roleZ==3: p.payoff = C.ED_STANDARD - p.contribution_mc + group.individual_share_test if p.roleZ==4: p.payoff = C.ED_POOR - p.contribution_poor + group.individual_share_test def treatment_affectation(group: Group): players = group.get_players() import itertools treatment = itertools.cycle([1,2,3,4]) for p in players: p.roleZ = next(treatment) class Player(BasePlayer): contribution_poor = models.CurrencyField(initial=0, max=C.ED_POOR, min=0) contribution_mc = models.CurrencyField(initial=0, max=C.ED_STANDARD, min=0) contribution_rich = models.CurrencyField(initial=0, max=C.ED_RICH, min=0) contribution_standard = models.CurrencyField(initial=0, max=C.ED_STANDARD, min=0) roleZ = models.IntegerField() What_life_could_look_like_in_other_social_classes = models.LongStringField() Name_three_things_rainy_days_could_imply_for_each_social_class = models.LongStringField() Think_about_one_advantage_and_one_disadvantage_about_your_social_class = models.LongStringField() Who_should_contribute_the_most_according_to_you_and_why = models.LongStringField() What_do_you_think_was_the_hypthesis_of_the_experimentor = models.LongStringField() class MyWaitPage(WaitPage): after_all_players_arrive = treatment_affectation class Preliminary_Questions(Page): form_model = 'player' form_fields = ['What_life_could_look_like_in_other_social_classes', 'Name_three_things_rainy_days_could_imply_for_each_social_class', 'Think_about_one_advantage_and_one_disadvantage_about_your_social_class'] @staticmethod def is_displayed(player: Player): if player.roleZ == 2: return True if player.roleZ == 3: return True if player.roleZ == 4: return True if player.roleZ == 1: return False class Contribute_Standard(Page): form_model = 'player' form_fields = ['contribution_standard'] @staticmethod def is_displayed(player: Player): return player.roleZ == 1 class Contribute_Rich(Page): form_model = 'player' form_fields = ['contribution_rich'] @staticmethod def is_displayed(player: Player): return player.roleZ == 2 class Contribute_MC(Page): form_model = 'player' form_fields = ['contribution_mc'] @staticmethod def is_displayed(player: Player): return player.roleZ == 3 class Contribute_Poor(Page): form_model = 'player' form_fields = ['contribution_poor'] @staticmethod def is_displayed(player: Player): return player.roleZ == 4 class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class TOREWORK(Page): form_model = 'player' form_fields = ['Who_should_contribute_the_most_according_to_you_and_why', 'What_do_you_think_was_the_hypthesis_of_the_experimentor'] page_sequence = [MyWaitPage, Preliminary_Questions, Contribute_Standard, Contribute_Rich, Contribute_MC, Contribute_Poor, ResultsWaitPage, TOREWORK]