import random from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) from otree.api import * doc = """ This is a nine-period threshold public goods game with 6 players. """ class Constants(BaseConstants): name_in_url = 'public_goods' players_per_group = 3 num_rounds = 1 instructions_template = 'public_goods/instructions.html' # """Amount allocated to each player""" endowment = 36 multiplier = 0.00 catastrophe = 108 endowment2 = c(0) class Subsession(BaseSubsession): def vars_for_admin_report(self): payoffs = sorted([p.payoff for p in self.get_players()]) return dict(payoffs=payoffs) class Group(BaseGroup): #Pledges and Leadership has_leader = models.BooleanField(initial=False) leader_pledges1 = models.BooleanField(initial=False) pledge1leader = models.BooleanField(initial=False) pledge1leader_choice1 = models.IntegerField(initial=0) pledge1leader_choice2 = models.IntegerField(initial=0) pledge1leader_choice3 = models.IntegerField(initial=0) total_pledge1_static = models.IntegerField(initial=0) total_pledge2_static =models.IntegerField(initial=0) total_pledge3_static = models.IntegerField(initial=0) total_pledge1_dynamic = models.IntegerField(initial=0) total_pledge11_static = models.IntegerField(initial=0) total_pledge12_static = models.IntegerField(initial=0) total_pledge13_static = models.IntegerField(initial=0) #Group-level contributions per round total_contribution1_static = models.IntegerField(initial=0) total_contribution2_static = models.IntegerField(initial=0) total_contribution3_static = models.IntegerField(initial=0) total_contribution4_static = models.IntegerField(initial=0) total_contribution5_static = models.IntegerField(initial=0) total_contribution6_static = models.IntegerField(initial=0) total_contribution7_static = models.IntegerField(initial=0) total_contribution8_static = models.IntegerField(initial=0) total_contribution9_static = models.IntegerField(initial=0) total_contribution1_dynamic = models.IntegerField(initial=0) total_contribution2_dynamic = models.IntegerField(initial=0) total_contribution3_dynamic = models.IntegerField(initial=0) total_contribution4_dynamic = models.IntegerField(initial=0) total_contribution5_dynamic = models.IntegerField(initial=0) total_contribution6_dynamic = models.IntegerField(initial=0) total_contribution7_dynamic = models.IntegerField(initial=0) total_contribution8_dynamic = models.IntegerField(initial=0) total_contribution9_dynamic = models.IntegerField(initial=0) # Aggregate group-level contributions STATIC total_contribution12_static = models.IntegerField(initial=0) total_contribution123_static = models.IntegerField(initial=0) total_contribution1234_static = models.IntegerField(initial=0) total_contribution12345_static = models.IntegerField(initial=0) total_contribution123456_static = models.IntegerField(initial=0) total_contribution1234567_static = models.IntegerField(initial=0) total_contribution12345678_static = models.IntegerField(initial=0) total_contribution123456789_static = models.IntegerField(initial=0) # Aggregate group-level contributions DYNAMIC total_contribution12_dynamic = models.IntegerField(initial=0) total_contribution123_dynamic = models.IntegerField(initial=0) total_contribution1234_dynamic = models.IntegerField(initial=0) total_contribution12345_dynamic = models.IntegerField(initial=0) total_contribution123456_dynamic = models.IntegerField(initial=0) total_contribution1234567_dynamic = models.IntegerField(initial=0) total_contribution12345678_dynamic = models.IntegerField(initial=0) total_contribution123456789_dynamic = models.IntegerField(initial=0) #Other total_aggregate_contributions = models.IntegerField(initial=0) total_aggregate_contributions_dynamic = models.IntegerField(initial=0) individual_share = models.IntegerField(initial=0) threshold = models.IntegerField(initial=0) threshold_reached = models.IntegerField() dropout = models.LongStringField() contribution1_static = models.IntegerField(initial=0) def set_payoffs(self): self.total_contribution1_static = sum([p.contribution1 for p in self.get_players()]) self.total_contribution2_static = sum([p.contribution2 for p in self.get_players()]) self.total_contribution3_static = sum([p.contribution3 for p in self.get_players()]) self.total_contribution4_static = sum([p.contribution4 for p in self.get_players()]) self.total_contribution5_static = sum([p.contribution5 for p in self.get_players()]) self.total_contribution6_static = sum([p.contribution6 for p in self.get_players()]) self.total_contribution7_static = sum([p.contribution7 for p in self.get_players()]) self.total_contribution8_static = sum([p.contribution8 for p in self.get_players()]) self.total_contribution9_static = sum([p.contribution9 for p in self.get_players()]) self.total_contribution1_dynamic = int(sum([p.contribution1 for p in self.get_players()]) * 1.5) self.total_contribution2_dynamic = int(sum([p.contribution2 for p in self.get_players()]) * 1.5) self.total_contribution3_dynamic = int(sum([p.contribution3 for p in self.get_players()]) * 1.5) self.total_contribution4_dynamic = int(sum([p.contribution4 for p in self.get_players()]) * 1.0) self.total_contribution5_dynamic = int(sum([p.contribution5 for p in self.get_players()]) * 1.0) self.total_contribution6_dynamic = int(sum([p.contribution6 for p in self.get_players()]) * 1.0) self.total_contribution7_dynamic = int(sum([p.contribution7 for p in self.get_players()]) * 0.5) self.total_contribution8_dynamic = int(sum([p.contribution8 for p in self.get_players()]) * 0.5) self.total_contribution9_dynamic = int(sum([p.contribution9 for p in self.get_players()]) * 0.5) if self.session.config['color'] == 'red': self.total_aggregate_contributions = (self.total_contribution1_dynamic + self.total_contribution2_dynamic + self.total_contribution3_dynamic + self.total_contribution4_dynamic + self.total_contribution5_dynamic + self.total_contribution6_dynamic + self.total_contribution7_dynamic + self.total_contribution8_dynamic + self.total_contribution9_dynamic) else: self.total_aggregate_contributions = (self.total_contribution1_static + self.total_contribution2_static + self.total_contribution3_static + self.total_contribution4_static + self.total_contribution5_static + self.total_contribution6_static + self.total_contribution7_static + self.total_contribution8_static + self.total_contribution9_static) for p in self.get_players(): if self.total_aggregate_contributions >= Constants.catastrophe: self.session.vars.update(target_met=True) self.session.vars.update(success=True) p.payoff = Constants.endowment - (p.contribution1 + p.contribution2 + p.contribution3 + p.contribution4 + p.contribution5 + p.contribution6 + p.contribution7 + p.contribution8 + p.contribution9) else: self.session.vars.update(target_met=False) if random.random()<0.3: self.session.vars.update(target_met=True) else: self.session.vars.update(target_met=False) p.payoff = 0 def dropouts(self): for p in self.get_players(): str(self.participant.vars) def pledge1leader(self): for p in self.get_players(): if p.pledge1leader_choiceAll == True: self.pledge1leader = True self.session.vars.update(leader_pledged=True) else: self.pledge1leader = False self.session.vars.update(leader_pledged=False) def set_pledge1_payoff(self): self.total_pledge1_static = self.pledge1leader_choice1 self.total_pledge2_static = self.pledge1leader_choice2 self.total_pledge3_static = self.pledge1leader_choice3 self.total_pledge11_static = sum([p.pledge1leader_choice1 for p in self.get_players()]) self.total_pledge12_static = sum([p.pledge1leader_choice2 for p in self.get_players()]) self.total_pledge13_static = sum([p.pledge1leader_choice3 for p in self.get_players()]) for p in self.get_players(): p.pledge1leader_choice1 = self.pledge1leader_choice1 p.pledge1leader_choice2 = self.pledge1leader_choice2 p.pledge1leader_choice3 = self.pledge1leader_choice3 def set_contribution1_payoff(self): self.total_contribution1_static = sum([p.contribution1 for p in self.get_players()]) self.total_contribution1_dynamic = int(sum([p.contribution1 for p in self.get_players()]) * 1.5) def set_contribution2_payoff(self): self.total_contribution1_static = sum([p.contribution1 for p in self.get_players()]) self.total_contribution1_dynamic = int(sum([p.contribution1 for p in self.get_players()]) * 1.5) self.total_contribution2_static = sum([p.contribution2 for p in self.get_players()]) self.total_contribution2_dynamic = int(sum([p.contribution2 for p in self.get_players()]) * 1.5) self.total_contribution12_static = self.total_contribution1_static + self.total_contribution2_static self.total_contribution12_dynamic = self.total_contribution1_dynamic + self.total_contribution2_dynamic def set_contribution3_payoff(self): self.total_contribution1_static = sum([p.contribution1 for p in self.get_players()]) self.total_contribution1_dynamic = int(sum([p.contribution1 for p in self.get_players()]) * 1.5) self.total_contribution2_static = sum([p.contribution2 for p in self.get_players()]) self.total_contribution2_dynamic = int(sum([p.contribution2 for p in self.get_players()]) * 1.5) self.total_contribution3_static = sum([p.contribution3 for p in self.get_players()]) self.total_contribution3_dynamic = int(sum([p.contribution3 for p in self.get_players()]) * 1.5) self.total_contribution123_static = self.total_contribution1_static + self.total_contribution2_static \ + self.total_contribution3_static self.total_contribution123_dynamic = self.total_contribution1_dynamic + self.total_contribution2_dynamic \ + self.total_contribution3_dynamic def set_contribution4_payoff(self): self.total_contribution1_static = sum([p.contribution1 for p in self.get_players()]) self.total_contribution1_dynamic = int(sum([p.contribution1 for p in self.get_players()]) * 1.5) self.total_contribution2_static = sum([p.contribution2 for p in self.get_players()]) self.total_contribution2_dynamic = int(sum([p.contribution2 for p in self.get_players()]) * 1.5) self.total_contribution3_static = sum([p.contribution3 for p in self.get_players()]) self.total_contribution3_dynamic = int(sum([p.contribution3 for p in self.get_players()]) * 1.5) self.total_contribution4_static = sum([p.contribution4 for p in self.get_players()]) self.total_contribution4_dynamic = int(sum([p.contribution4 for p in self.get_players()]) * 1.0) self.total_contribution1234_static = self.total_contribution1_static + self.total_contribution2_static \ + self.total_contribution3_static + self.total_contribution4_static self.total_contribution1234_dynamic = self.total_contribution1_dynamic + self.total_contribution2_dynamic \ + self.total_contribution3_dynamic + self.total_contribution4_dynamic def set_contribution5_payoff(self): self.total_contribution1_static = sum([p.contribution1 for p in self.get_players()]) self.total_contribution1_dynamic = int(sum([p.contribution1 for p in self.get_players()]) * 1.5) self.total_contribution2_static = sum([p.contribution2 for p in self.get_players()]) self.total_contribution2_dynamic = int(sum([p.contribution2 for p in self.get_players()]) * 1.5) self.total_contribution3_static = sum([p.contribution3 for p in self.get_players()]) self.total_contribution3_dynamic = int(sum([p.contribution3 for p in self.get_players()]) * 1.5) self.total_contribution4_static = sum([p.contribution4 for p in self.get_players()]) self.total_contribution4_dynamic = int(sum([p.contribution4 for p in self.get_players()]) * 1.0) self.total_contribution5_static = sum([p.contribution5 for p in self.get_players()]) self.total_contribution5_dynamic = int(sum([p.contribution5 for p in self.get_players()]) * 1.0) self.total_contribution12345_static = self.total_contribution1_static + self.total_contribution2_static \ + self.total_contribution3_static + self.total_contribution4_static \ + self.total_contribution5_static self.total_contribution12345_dynamic = self.total_contribution1_dynamic + self.total_contribution2_dynamic \ + self.total_contribution3_dynamic + self.total_contribution4_dynamic \ + self.total_contribution5_dynamic def set_contribution6_payoff(self): self.total_contribution1_static = sum([p.contribution1 for p in self.get_players()]) self.total_contribution1_dynamic = int(sum([p.contribution1 for p in self.get_players()]) * 1.5) self.total_contribution2_static = sum([p.contribution2 for p in self.get_players()]) self.total_contribution2_dynamic = int(sum([p.contribution2 for p in self.get_players()]) * 1.5) self.total_contribution3_static = sum([p.contribution3 for p in self.get_players()]) self.total_contribution3_dynamic = int(sum([p.contribution3 for p in self.get_players()]) * 1.5) self.total_contribution4_static = sum([p.contribution4 for p in self.get_players()]) self.total_contribution4_dynamic = int(sum([p.contribution4 for p in self.get_players()]) * 1.0) self.total_contribution5_static = sum([p.contribution5 for p in self.get_players()]) self.total_contribution5_dynamic = int(sum([p.contribution5 for p in self.get_players()]) * 1.0) self.total_contribution6_static = sum([p.contribution6 for p in self.get_players()]) self.total_contribution6_dynamic = int(sum([p.contribution6 for p in self.get_players()]) * 1.0) self.total_contribution123456_static = self.total_contribution1_static + self.total_contribution2_static \ + self.total_contribution3_static + self.total_contribution4_static \ + self.total_contribution5_static + self.total_contribution6_static self.total_contribution123456_dynamic = self.total_contribution1_dynamic + self.total_contribution2_dynamic \ + self.total_contribution3_dynamic + self.total_contribution4_dynamic \ + self.total_contribution5_dynamic + self.total_contribution6_dynamic def set_contribution7_payoff(self): self.total_contribution1_static = sum([p.contribution1 for p in self.get_players()]) self.total_contribution1_dynamic = int(sum([p.contribution1 for p in self.get_players()]) * 1.5) self.total_contribution2_static = sum([p.contribution2 for p in self.get_players()]) self.total_contribution2_dynamic = int(sum([p.contribution2 for p in self.get_players()]) * 1.5) self.total_contribution3_static = sum([p.contribution3 for p in self.get_players()]) self.total_contribution3_dynamic = int(sum([p.contribution3 for p in self.get_players()]) * 1.5) self.total_contribution4_static = sum([p.contribution4 for p in self.get_players()]) self.total_contribution4_dynamic = int(sum([p.contribution4 for p in self.get_players()]) * 1.0) self.total_contribution5_static = sum([p.contribution5 for p in self.get_players()]) self.total_contribution5_dynamic = int(sum([p.contribution5 for p in self.get_players()]) * 1.0) self.total_contribution6_static = sum([p.contribution6 for p in self.get_players()]) self.total_contribution6_dynamic = int(sum([p.contribution6 for p in self.get_players()]) * 1.0) self.total_contribution7_static = sum([p.contribution7 for p in self.get_players()]) self.total_contribution7_dynamic = int(sum([p.contribution7 for p in self.get_players()]) * 0.5) self.total_contribution1234567_static = self.total_contribution1_static + self.total_contribution2_static \ + self.total_contribution3_static + self.total_contribution4_static \ + self.total_contribution5_static + self.total_contribution6_static \ + self.total_contribution7_static self.total_contribution1234567_dynamic = self.total_contribution1_dynamic + self.total_contribution2_dynamic \ + self.total_contribution3_dynamic + self.total_contribution4_dynamic \ + self.total_contribution5_dynamic + self.total_contribution6_dynamic \ + self.total_contribution7_dynamic def set_contribution8_payoff(self): self.total_contribution1_static = sum([p.contribution1 for p in self.get_players()]) self.total_contribution1_dynamic = int(sum([p.contribution1 for p in self.get_players()]) * 1.5) self.total_contribution2_static = sum([p.contribution2 for p in self.get_players()]) self.total_contribution2_dynamic = int(sum([p.contribution2 for p in self.get_players()]) * 1.5) self.total_contribution3_static = sum([p.contribution3 for p in self.get_players()]) self.total_contribution3_dynamic = int(sum([p.contribution3 for p in self.get_players()]) * 1.5) self.total_contribution4_static = sum([p.contribution4 for p in self.get_players()]) self.total_contribution4_dynamic = int(sum([p.contribution4 for p in self.get_players()]) * 1.0) self.total_contribution5_static = sum([p.contribution5 for p in self.get_players()]) self.total_contribution5_dynamic = int(sum([p.contribution5 for p in self.get_players()]) * 1.0) self.total_contribution6_static = sum([p.contribution6 for p in self.get_players()]) self.total_contribution6_dynamic = int(sum([p.contribution6 for p in self.get_players()]) * 1.0) self.total_contribution7_static = sum([p.contribution7 for p in self.get_players()]) self.total_contribution7_dynamic = int(sum([p.contribution7 for p in self.get_players()]) * 0.5) self.total_contribution8_static = sum([p.contribution8 for p in self.get_players()]) self.total_contribution8_dynamic = int(sum([p.contribution8 for p in self.get_players()]) * 0.5) self.total_contribution12345678_static = self.total_contribution1_static + self.total_contribution2_static \ + self.total_contribution3_static + self.total_contribution4_static \ + self.total_contribution5_static + self.total_contribution6_static \ + self.total_contribution7_static + self.total_contribution8_static self.total_contribution12345678_dynamic = self.total_contribution1_dynamic + self.total_contribution2_dynamic \ + self.total_contribution3_dynamic + self.total_contribution4_dynamic \ + self.total_contribution5_dynamic + self.total_contribution6_dynamic \ + self.total_contribution7_dynamic + self.total_contribution8_dynamic def set_contribution9_payoff(self): self.total_contribution1_static = sum([p.contribution1 for p in self.get_players()]) self.total_contribution1_dynamic = int(sum([p.contribution1 for p in self.get_players()]) * 1.5) self.total_contribution2_static = sum([p.contribution2 for p in self.get_players()]) self.total_contribution2_dynamic = int(sum([p.contribution2 for p in self.get_players()]) * 1.5) self.total_contribution3_static = sum([p.contribution3 for p in self.get_players()]) self.total_contribution3_dynamic = int(sum([p.contribution3 for p in self.get_players()]) * 1.5) self.total_contribution4_static = sum([p.contribution4 for p in self.get_players()]) self.total_contribution4_dynamic = int(sum([p.contribution4 for p in self.get_players()]) * 1.0) self.total_contribution5_static = sum([p.contribution5 for p in self.get_players()]) self.total_contribution5_dynamic = int(sum([p.contribution5 for p in self.get_players()]) * 1.0) self.total_contribution6_static = sum([p.contribution6 for p in self.get_players()]) self.total_contribution6_dynamic = int(sum([p.contribution6 for p in self.get_players()]) * 1.0) self.total_contribution7_static = sum([p.contribution7 for p in self.get_players()]) self.total_contribution7_dynamic = int(sum([p.contribution7 for p in self.get_players()]) * 0.5) self.total_contribution8_static = sum([p.contribution8 for p in self.get_players()]) self.total_contribution8_dynamic = int(sum([p.contribution8 for p in self.get_players()]) * 0.5) self.total_contribution9_static = sum([p.contribution9 for p in self.get_players()]) self.total_contribution9_dynamic = int(sum([p.contribution9 for p in self.get_players()]) * 0.5) self.total_contribution123456789_static = self.total_contribution1_static + self.total_contribution2_static \ + self.total_contribution3_static + self.total_contribution4_static \ + self.total_contribution5_static + self.total_contribution6_static \ + self.total_contribution7_static + self.total_contribution8_static \ + self.total_contribution9_static self.total_contribution123456789_dynamic = self.total_contribution1_dynamic + self.total_contribution2_dynamic \ + self.total_contribution3_dynamic + self.total_contribution4_dynamic \ + self.total_contribution5_dynamic + self.total_contribution6_dynamic \ + self.total_contribution7_dynamic + self.total_contribution8_dynamic \ + self.total_contribution9_dynamic def set_real_payoff(self): for p in self.get_players(): p.real_payoff = round(float(p.payoff) * 0.50, 2) def is_reached(self): return self.total_both_contributions >= self.threshold def set_threshold(self): self.threshold = 108 class Player(BasePlayer): color = models.StringField() is_leader = models.BooleanField(initial = False) real_payoff = models.FloatField() role_player = models.CharField(initial = 'Follower') leader_pledged1 = models.BooleanField(initial = True) leader_choice1 = models.CharField(initial = 'NoPledge') is_leader = models.BooleanField() leader_id = models.IntegerField() pledge1 = models.IntegerField(initial=0) pledge2 = models.IntegerField(initial=0) pledge3 = models.IntegerField(initial=0) pledge1leader_choice = models.BooleanField( choices=[[True, 'Yes, I want to pledge'], [False, 'No, I do not want to pledge']], label="Would you like to make a pledge to the other 5 players for the rounds 1, 2, 3?" ) pledge1leader_choiceAll = models.BooleanField(initial = False) pledge1leader_choice1 = models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="What value should (insert value1) take for rounds 1, 2, 3?" ) pledge1leader_choice2 =models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="What value should (insert value2) take for rounds 1, 2, 3?" ) pledge1leader_choice3 =models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="What value should (insert value3) take for rounds 1, 2, 3?" ) pledge1follower_choice = models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="What value should (insert value) take for rounds 1, 2, 3?" ) contribution1_dynamic = models.IntegerField(initial=0) def set_contribution1_dynamic(self): #this is still an ISSUE self.contribution1_dynamic = p.contribution1 * 1.5 contribution_sum = models.IntegerField() contribution12_static = models.IntegerField() #this is an ISSUE def set_contribution12_static(self): self.contribution12_static = int(p.contribution1 + p.contribution2) contribution1 = models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="Round 1: How much do you want to contribute to the Climate Pot (0-4 Cashcoins)?" ) contribution2 = models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="Round 2: How much do you want to contribute to the Climate Pot (0-4 Cashcoins)?" ) contribution3 = models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="Round 3: How much do you want to contribute to the Climate Pot (0-4 Cashcoins)?" ) contribution4 = models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="Round 4: How much do you want to contribute to the Climate Pot (0-4 Cashcoins)?" ) contribution5 = models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="Round 5: How much do you want to contribute to the Climate Pot (0-4 Cashcoins)?" ) contribution6 = models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="Round 6: How much do you want to contribute to the Climate Pot (0-4 Cashcoins)?" ) contribution7 = models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="Round 7: How much do you want to contribute to the Climate Pot (0-4 Cashcoins)?" ) contribution8 = models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="Round 8: How much do you want to contribute to the Climate Pot (0-4 Cashcoins)?" ) contribution9 = models.IntegerField(widget=widgets.RadioSelect, choices=[0, 1, 2, 3, 4], label="Round 9: How much do you want to contribute to the Climate Pot (0-4 Cashcoins)?" ) email = models.StringField(blank=True, label="E-Mail Address:") notes = models.LongStringField(blank=True, label="Do you have any comments about the experiment? If yes, please leave them here:") def choose_leader(player: Player): if player.id_in_group == player.is_leader: player.role_player = 'Leader' else: player.role_player = 'Follower' return player.role_player