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 = 's5btest' players_per_group = 4 num_rounds = 1 instructions_template = 's5btest/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() def test(self): grouppointslist=[] groupid = 0 for g in self.get_groups(): groupid += 1 points = 0 for p in g.get_players(): points += p.leader_contribute if p.role() == 'leader' else p.member_contribute p.participant.vars['groupid51'] = groupid p.participant.vars['maxgroup51'] = 'loser' grouppointslist.append(points) maxgroup = [] for ind in range(int(len(grouppointslist)/2)): if grouppointslist[2*ind] 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ])*1.2 p.original2 = p.payoff2 / 1.2 p.increase2 = p.original2 * 0.2 else: p.payoff2 = 0 p.original2 = 0 p.increase2 = 0 p.payoff = 0 p.participant.vars['fiveone'] = p.payoff2 p.member1con = self.get_players()[2].participant.vars['c41'] p.member2con = self.get_players()[3].participant.vars['c41'] elif p.member_id() == 2 : p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) * 1.2 p.original2 = p.payoff2 / 1.2 p.increase2 = p.original2 * 0.2 p.text = 'Because your group has won...' p.symbol = '+' p.text2 = '+20%' if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) * 1.2 p.original2 = p.payoff2 / 1.2 p.increase2 = p.original2 * 0.2 else: p.payoff2 = 0 p.original2 = 0 p.increase2 = 0 p.payoff = 0 p.participant.vars['fiveone'] = p.payoff2 p.member1con = self.get_players()[1].participant.vars['c41'] p.member2con = self.get_players()[3].participant.vars['c41'] elif p.member_id() == 3: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) * 1.2 p.original2 = p.payoff2 / 1.2 p.increase2 = p.original2 * 0.2 p.text = 'Because your group has won...' p.symbol = '+' p.text2 = '+20%' if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) * 1.2 p.original2 = p.payoff2 / 1.2 p.increase2 = p.original2 * 0.2 else: p.payoff2 = 0 p.original2 = 0 p.increase2 = 0 p.payoff = 0 p.participant.vars['fiveone'] = p.payoff2 p.member1con = self.get_players()[1].participant.vars['c41'] p.member2con = self.get_players()[2].participant.vars['c41'] 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, ])* 1.2 leader.original2 = p.payoff2 / 1.2 leader.increase2 = p.original2 * 0.2 leader.text = 'Because your group has won...' leader.symbol = '+' leader.text2 = '+20%' leader.payoff = 0 p.participant.vars['fiveone'] = leader.payoff2 p.member1con = self.get_players()[1].participant.vars['c41'] p.member2con = self.get_players()[2].participant.vars['c41'] p.member2con = self.get_players()[3].participant.vars['c41'] else: if 'member' in p.role(): if p.member_id() == 1 : p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ])* 0.8 p.original2 = p.payoff2 / 0.8 p.increase2 = p.original2 * 0.2 p.text = 'Because your group has lost...' p.symbol = '-' p.text2 = '-20%' if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ])*0.8 p.original2 = p.payoff2/0.8 p.increase2 = p.original2 * 0.2 else: p.payoff2 = 0 p.original2 = 0 p.increase2 = 0 p.payoff = 0 p.participant.vars['fiveone'] = p.payoff2 p.member1con = self.get_players()[2].participant.vars['c41'] p.member2con = self.get_players()[3].participant.vars['c41'] elif p.member_id() == 2 : p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) * 0.8 p.original2 = p.payoff2 / 0.8 p.increase2 = p.original2 * 0.2 p.text = 'Because your group has lost...' p.symbol = '-' p.text2 = '-20%' if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) * 0.8 p.original2 = p.payoff2 / 0.8 p.increase2 = p.original2 * 0.2 else: p.payoff2 = 0 p.original2 = 0 p.increase2 = 0 p.payoff = 0 p.participant.vars['fiveone'] = p.payoff2 p.member1con = self.get_players()[1].participant.vars['c41'] p.member2con = self.get_players()[3].participant.vars['c41'] elif p.member_id() == 3: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) * 0.8 p.original2 = p.payoff2 / 0.8 p.increase2 = p.original2 * 0.2 p.text = 'Because your group has lost...' p.symbol = '-' p.text2 = '-20%' if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) * 0.8 p.original2 = p.payoff2 / 0.8 p.increase2 = p.original2 * 0.2 else: p.payoff2 = 0 p.original2 = 0 p.increase2 = 0 p.payoff = 0 p.participant.vars['fiveone'] = p.payoff2 p.member1con = self.get_players()[1].participant.vars['c41'] p.member2con = self.get_players()[2].participant.vars['c41'] 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, ])*0.8 leader.original2 = p.payoff2 / 0.8 leader.increase2 = p.original2 * 0.2 leader.text = 'Because your group has lost...' leader.symbol = '-' leader.text2 = '-20%' leader.payoff = 0 p.participant.vars['fiveone'] = leader.payoff2 p.member1con = self.get_players()[1].participant.vars['c41'] p.member2con = self.get_players()[2].participant.vars['c41'] p.member3con = self.get_players()[3].participant.vars['c41'] 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, ]) # 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 Password = models.CharField(initial='') class Player(BasePlayer): member1con = models.CurrencyField() member2con = models.CurrencyField() member3con = models.CurrencyField() payoff2 = models.CurrencyField() original2 = models.CurrencyField() increase2 = models.CurrencyField() text2 = models.StringField() symbol = models.StringField() text = models.StringField() increase = models.CurrencyField() original = 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 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 checkmaxgroup51(self): if self.participant.vars['maxgroup51'] == 'winner': return 'Congratulations! Your group has won!' else: return 'Sorry! Your group has lost!' leaderpass = models.CharField(initial='') def membername51(self): if self.participant.vars['member_type51'] == '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] # 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""", # )