from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random from otree.models import player doc = """ this is demo of public goods stage 2 second part """ class Constants(BaseConstants): name_in_url = 's3test' players_per_group = 4 #4 num_rounds = 1 #8 instructions_template = 's3test/Instructions.html' initial_endowment = c(90) tax = c(10) take_away_endo = c(60) pool_multiplier = c(1.6) take_away_multiplier = c(3) answer_increment = c(3) leader_decision = currency_range(0, take_away_endo, answer_increment) leader_decision_count = len(leader_decision) keep_give_amounts = [] for answer in leader_decision: keep_give_amounts.append((answer, take_away_endo - answer)) password_leader = ['I will only be playing leader role for the next few rounds.','I may be playing both leader and player roles for the next few rounds.'] password_member = ['I will only be playing member role for the next few rounds.','I may be playing both leader and player roles for the next few rounds.'] class Subsession(BaseSubsession): def create_groups(self): leader_players = [p for p in self.get_players() if p.participant.vars['type'] == 'A (participants who removed the most points)' or p.participant.vars['type'] == 'C (participants who removed the fewest points)'] member_players = [p for p in self.get_players() if p.participant.vars['type'] == 'member'] print([p.participant.vars['type'] for p in leader_players]) print([p.participant.vars['type'] for p in member_players]) if self.round_number == 1: groupmat = [[leader_players[0], member_players[0], member_players[1], member_players[2]], [leader_players[1], member_players[3], member_players[4], member_players[5]]] self.set_group_matrix(groupmat) class Group(BaseGroup): total_contribution = models.CurrencyField() individual_share = models.CurrencyField() decision_member1 = models.CurrencyField(choices=Constants.leader_decision, label='') decision_member2 = models.CurrencyField(choices=Constants.leader_decision, label='') decision_member3 = models.CurrencyField(choices=Constants.leader_decision, label='') def set_payoffs(self): self.total_contribution= sum([p.contribution for p in self.get_players() if p.contribution != None]) self.individual_share = self.total_contribution * Constants.pool_multiplier / Constants.players_per_group print(self.individual_share) for p in self.get_players(): if 'member' in p.role(): p.contribution = p.member_contribute if p.member_id()==2: if self.subsession.round_number == 1: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threeone'] = p.payoff2 elif self.subsession.round_number == 2: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threetwo'] = p.payoff2 elif self.subsession.round_number == 3: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threethree'] = p.payoff2 elif self.subsession.round_number == 4: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threefour'] = p.payoff2 elif self.subsession.round_number == 5: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threefive'] = p.payoff2 elif self.subsession.round_number == 6: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threesix'] = p.payoff2 elif self.subsession.round_number == 7: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threeseven'] = p.payoff2 elif self.subsession.round_number == 8: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threeeight'] = p.payoff2 elif p.member_id()==3: if self.subsession.round_number == 1: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threeone'] = p.payoff2 elif self.subsession.round_number == 2: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threetwo'] = p.payoff2 elif self.subsession.round_number == 3: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threethree'] = p.payoff2 elif self.subsession.round_number == 4: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threefour'] = p.payoff2 elif self.subsession.round_number == 5: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threefive'] = p.payoff2 elif self.subsession.round_number == 6: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threesix'] = p.payoff2 elif self.subsession.round_number == 7: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threeseven'] = p.payoff2 elif self.subsession.round_number == 8: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['threeeight'] = p.payoff2 elif p.member_id()==4: if self.subsession.round_number == 1: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['threeone'] = p.payoff2 elif self.subsession.round_number == 2: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['threetwo'] = p.payoff2 elif self.subsession.round_number == 3: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['threethree'] = p.payoff2 elif self.subsession.round_number == 4: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['threefour'] = p.payoff2 elif self.subsession.round_number == 5: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['threefive'] = p.payoff2 elif self.subsession.round_number == 6: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['threesix'] = p.payoff2 elif self.subsession.round_number == 7: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['threeseven'] = p.payoff2 elif self.subsession.round_number == 8: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['threeeight'] = p.payoff2 else: leader = self.get_player_by_role('leader') p.contribution = p.leader_contribute if self.subsession.round_number == 1: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['threeone'] = leader.payoff2 elif self.subsession.round_number == 2: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['threetwo'] = leader.payoff2 elif self.subsession.round_number == 3: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['threethree'] = leader.payoff2 elif self.subsession.round_number == 4: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['threefour'] = leader.payoff2 elif self.subsession.round_number == 5: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['threefive'] = leader.payoff2 elif self.subsession.round_number == 6: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['threesix'] = leader.payoff2 elif self.subsession.round_number == 7: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['threeseven'] = leader.payoff2 elif self.subsession.round_number == 8: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['threeeight'] = leader.payoff2 def current(self): self.total_contribution= sum([p.contribution for p in self.get_players() if p.contribution != None]) self.individual_share = self.total_contribution * Constants.pool_multiplier / Constants.players_per_group print(self.individual_share) for p in self.get_players(): if 'member' in p.role(): p.contribution = p.member_contribute if p.member_id()==2: p.current = sum([+Constants.initial_endowment, -p.member_contribute, +self.individual_share, ]) elif p.member_id()==3: p.current = sum([+Constants.initial_endowment, -p.member_contribute, +self.individual_share, ]) elif p.member_id()==4: p.current = sum([+Constants.initial_endowment, -p.member_contribute, +self.individual_share, ]) else: leader = self.get_player_by_role('leader') p.contribution = p.leader_contribute leader.current = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) def limit(self): for p in self.get_players(): if 'member' in p.role(): if p.payoff < 0 : p.payoff = 0 else: return p.payoff else: return def leaderdom(self): for p in self.get_players(): if 'member' in p.role() and p.member_id() == 2: p.leaderdom = self.get_players()[0].participant.vars['type'] if 'member' in p.role() and p.member_id() == 3: p.leaderdom = self.get_players()[0].participant.vars['type'] if 'member' in p.role() and p.member_id() == 4: p.leaderdom = self.get_players()[0].participant.vars['type'] def get_member(self): for p in self.get_players(): if 'member' in p.role() and p.member_id() == 1: return 1 if 'member' in p.role() and p.member_id() == 2: return 2 if 'member' in p.role() and p.member_id() == 3: return 3 class Player(BasePlayer): member1con = models.CurrencyField() member2con = models.CurrencyField() member3con = models.CurrencyField() leaderdom = models.StringField() payoff2 = models.CurrencyField() current = models.CurrencyField() # member member_contribute = models.CurrencyField( min=0, max=Constants.initial_endowment ) # leader, this is leader's contribute, and only display for leader_contr page. leader_contribute = models.CurrencyField( min=0, max=Constants.initial_endowment ) contribution = models.CurrencyField() def who(self): if self.participant.vars['type'] == 'A (participants who removed the most points)': return 'A (participants who removed the most points)' elif self.participant.vars['type'] == 'C (participants who removed the fewest points)': return 'C (participants who removed the few points)' else: return 'member {}'.format(self.member_id()) def member_id(self): # player 1 is the leader, so member 1 is actually player 2 return (self.id_in_group) def role(self): if self.participant.vars['type'] == 'A (participants who removed the most points)' or self.participant.vars['type'] == 'C (participants who removed the fewest points)': return 'leader' else: return 'member {}'.format(self.member_id()) def leadertype(self): if self.role()!='Dominant Leader' or 'Non-dominant Leader': return self.participant.vars['memberleadtype'] else: return 'leader' password_member = models.CharField(choices=['I will only play the Group Member role for the next few rounds.','I may be playing both Group Leader and Group Member role for the next few rounds.'], widget = widgets.RadioSelect) password_leader = models.CharField(choices=['I will only play the Group Leader role for the next few rounds.','I may be playing both Group Leader and Group Member role for the next few rounds.'], widget = widgets.RadioSelect) password_after2 = models.CharField(initial='') def player1(self): return self.group.get_players()[0] def player2(self): return self.group.get_players()[1] def player3(self): return self.group.get_players()[2] def player4(self): return self.group.get_players()[3] def other_player1(self): return self.get_others_in_group()[0] def other_player2(self): return self.get_others_in_group()[1] def other_player3(self): return self.get_others_in_group()[2] leadercheck = models.CharField(choices=['Group Leader', 'Group Member', ], widget=widgets.RadioSelect) membercheck = models.CharField(choices=['Group Leader', 'Group Member', ], widget=widgets.RadioSelect)