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(85) ED_POOR = cu(5) ED_STANDARD = cu(20) 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 for p in players: if p.roleZ==1: p.contriball = p.contribution_standard if p.roleZ==2: p.contriball=p.contribution_rich if p.roleZ==3: p.contriball=p.contribution_mc if p.roleZ==4: p.contriball=p.contribution_poor 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) for p in players: if p.roleZ==1: p.role_string="standard class" p.endow=C.ED_STANDARD p.endowc=p.endow+15 if p.roleZ==2: p.role_string="upper class" p.endow=C.ED_RICH p.endowc=p.endow+15 if p.roleZ==3: p.role_string="middle class" p.endow=C.ED_STANDARD p.endowc=p.endow+15 if p.roleZ==4: p.role_string="lower class" p.endow=C.ED_POOR p.endowc=p.endow+15 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() Imagine_what_life_would_look_like_in_other_social_classes_Name_3_things = models.LongStringField() Think_about_one_advantage_and_one_disadvantage_to_belong_to_your_social_class = models.LongStringField() Imagine_what_rainy_days_could_imply_in_the_different_classes_Name_3_things = models.LongStringField() role_string = models.StringField() According_to_you_how_and_how_much_should_have_players_contributed = models.LongStringField() endow = models.CurrencyField() contriball = models.CurrencyField() endowc = models.CurrencyField() class MyWaitPage(WaitPage): after_all_players_arrive = treatment_affectation class Preliminary_Questions(Page): form_model = 'player' form_fields = ['Imagine_what_life_would_look_like_in_other_social_classes_Name_3_things', 'Think_about_one_advantage_and_one_disadvantage_to_belong_to_your_social_class', 'Imagine_what_rainy_days_could_imply_in_the_different_classes_Name_3_things'] @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 = ['According_to_you_how_and_how_much_should_have_players_contributed'] page_sequence = [MyWaitPage, Preliminary_Questions, Contribute_Standard, Contribute_Rich, Contribute_MC, Contribute_Poor, ResultsWaitPage, TOREWORK]