from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ this is demo of public goods stage 2 second part """ class Constants(BaseConstants): name_in_url = 's4btest' players_per_group = 4 num_rounds = 1 instructions_template = 's4btest/Instructions.html' initial_endowment = c(90) tax = c(10) bid_fund = c(100) 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)) class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: players = self.get_players() 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() == 1: ## FX: TAKE NOTE OF THIS, MEMBER 0 IS ACTUALLY MEMBER 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.participant.vars['fourone'] = p.payoff2 p.participant.vars['c41'] = p.contribution elif p.member_id() == 2: ##WHEN WE HAVE GROUP SIZE = 4, THIS NEED TO BE CHANGED ACCORDINGLY 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.participant.vars['fourone'] = p.payoff2 p.participant.vars['c41'] = p.contribution elif p.member_id() == 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 = 0 p.participant.vars['fourone'] = p.payoff2 p.participant.vars['c41'] = p.contribution else: leader = self.get_player_by_role('leader') p.contribution = p.leader_contribute leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = 0 p.participant.vars['fourone'] = leader.payoff2 p.participant.vars['c41'] = p.leader_contribute # def get_member(self,id): # for p in self.get_players(): # if 'member' in p.role() and p.member_id() == id: # return p 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 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()==1: p.current = sum([+Constants.initial_endowment, -p.member_contribute, +self.individual_share, ]) elif 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, ]) 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, ]) class Player(BasePlayer): member1con = models.CurrencyField() member2con = models.CurrencyField() member3con = models.CurrencyField() 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 member_id(self): # #player 1 is the leader, so member 1 is actually player 2 # return (self.participant.id_in_session) 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 member_id(self): #player 1 is the leader, so member 1 is actually player 2 return (self.id_in_group - 1) #def role(self): # if self.participant.vars['type'] == 'dominant' or self.participant.vars['type'] == 'non-dominant': # return 'leader' # return 'member {}'.format(self.member_id()) # bid_leader = models.CurrencyField( # min=0, max=Constants.bid_fund, # doc="""How much you want to pay to bid a leader? from 0 to 100""", # ) def leadertype(self): if self.role()!='leader': return self.participant.vars['member_type'] else: return 'leader' def membername(self): if self.participant.vars['member_type'] == 'Category C (participants who removed the fewest points)': return 'Category C (participants who removed the fewest points)' else: return 'Category A (participants who removed the most points)' 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]