from otree.api import * c = cu doc = 'Majo' class C(BaseConstants): NAME_IN_URL = 'Majo' PLAYERS_PER_GROUP = None NUM_ROUNDS = 10 ENDOWMENT = cu(100) CANDIDATE_A_ROLE = 'A' CANDIDATE_B_ROLE = 'B' VOTER_1_ROLE = '1' VOTER_2_ROLE = '2' VOTER_3_ROLE = '3' VOTER_4_ROLE = '4' VOTER_5_ROLE = '5' VOTER_6_ROLE = '6' VOTER_7_ROLE = '7' VOTER_8_ROLE = '8' class Subsession(BaseSubsession): pass class Group(BaseGroup): winner = models.StringField() def determine_winner_and_payoffs(group: Group): # Determine Winner votes = [ group.get_player_by_id(3).vote_for, group.get_player_by_id(4).vote_for, group.get_player_by_id(5).vote_for, group.get_player_by_id(6).vote_for, group.get_player_by_id(7).vote_for, group.get_player_by_id(8).vote_for, group.get_player_by_id(9).vote_for, group.get_player_by_id(10).vote_for] votes_for_A = votes.count("A") votes_for_B = votes.count("B") group.winner = "A" # This needs to be random!!! if votes_for_A > votes_for_B: group.winner = "A" #determine A as winner elif votes_for_A < votes_for_B: group.winner = "B" # Determine payoffs candidate_A = group.get_player_by_id(1) candidate_B = group.get_player_by_id(2) total_voters_by_A = sum([candidate_A.v01,candidate_A.v02,candidate_A.v03,candidate_A.v04,candidate_A.v05,candidate_A.v06,candidate_A.v07,candidate_A.v08]) total_voters_by_B = sum([candidate_B.v01,candidate_B.v02,candidate_B.v03,candidate_B.v04,candidate_B.v05,candidate_B.v06,candidate_B.v07,candidate_B.v08]) amount_per_voter_A = 0 amount_per_voter_B = 0 if total_voters_by_A > 0: amount_per_voter_A = 100 / total_voters_by_A if total_voters_by_B > 0: amount_per_voter_B = 100 / total_voters_by_B voter_1 = group.get_player_by_id(3) voter_2 = group.get_player_by_id(4) voter_3 = group.get_player_by_id(5) voter_4 = group.get_player_by_id(6) voter_5 = group.get_player_by_id(7) voter_6 = group.get_player_by_id(8) voter_7 = group.get_player_by_id(9) voter_8 = group.get_player_by_id(10) if group.winner == "A": voter_1.payoff = amount_per_voter_A * candidate_A.v01 voter_2.payoff = amount_per_voter_A * candidate_A.v02 voter_3.payoff = amount_per_voter_A * candidate_A.v03 voter_4.payoff = amount_per_voter_A * candidate_A.v04 voter_5.payoff = amount_per_voter_A * candidate_A.v05 voter_6.payoff = amount_per_voter_A * candidate_A.v06 voter_7.payoff = amount_per_voter_A * candidate_A.v07 voter_8.payoff = amount_per_voter_A * candidate_A.v08 candidate_A.payoff = 100 candidate_B.payoff = 0 else: voter_1.payoff = amount_per_voter_B * candidate_B.v01 voter_2.payoff = amount_per_voter_B * candidate_B.v02 voter_3.payoff = amount_per_voter_B * candidate_B.v03 voter_4.payoff = amount_per_voter_B * candidate_B.v04 voter_5.payoff = amount_per_voter_B * candidate_B.v05 voter_6.payoff = amount_per_voter_B * candidate_B.v06 voter_7.payoff = amount_per_voter_B * candidate_B.v07 voter_8.payoff = amount_per_voter_B * candidate_B.v08 candidate_A.payoff = 0 candidate_B.payoff = 100 #Accumulated wealth for other_player in group.get_players(): other_player.accumulated_wealth = other_player.accumulated_wealth + other_player.payoff class Player(BasePlayer): v01 = models.BooleanField(widget=widgets.RadioSelectHorizontal) v02 = models.BooleanField(widget=widgets.RadioSelectHorizontal) v03 = models.BooleanField(widget=widgets.RadioSelectHorizontal) v04 = models.BooleanField(widget=widgets.RadioSelectHorizontal) v05 = models.BooleanField(widget=widgets.RadioSelectHorizontal) v06 = models.BooleanField(widget=widgets.RadioSelectHorizontal) v07 = models.BooleanField(widget=widgets.RadioSelectHorizontal) v08 = models.BooleanField(widget=widgets.RadioSelectHorizontal) vote_for = models.StringField() accumulated_wealth = models.CurrencyField() def custom_export(players): yield ['participant_code', 'id_in_group'] for p in players: pp = p.participant yield [pp.code, p.id_in_group] class Welcome(Page): form_model = 'player' @staticmethod def before_next_page(player: Player, timeout_happened): payoffs = [p.payoff for p in player.in_all_rounds()] player.accumulated_wealth = sum(payoffs) class WaitForOthers(WaitPage): @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group < 11 class Campaigning(Page): form_model = 'player' form_fields = ['v01', 'v02', 'v03', 'v04', 'v05', 'v06', 'v07', 'v08'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group < 3 return True @staticmethod def vars_for_template(player: Player): group = player.group voter_1 = group.get_player_by_id(3) voter_2 = group.get_player_by_id(4) voter_3 = group.get_player_by_id(5) voter_4 = group.get_player_by_id(6) voter_5 = group.get_player_by_id(7) voter_6 = group.get_player_by_id(8) voter_7 = group.get_player_by_id(9) voter_8 = group.get_player_by_id(10) if group.round_number == 1: voter_1.accumulated_wealth = 0 voter_2.accumulated_wealth = 0 voter_3.accumulated_wealth = 0 voter_4.accumulated_wealth = 0 voter_5.accumulated_wealth = 0 voter_6.accumulated_wealth = 0 voter_7.accumulated_wealth = 0 voter_8.accumulated_wealth = 0 return dict( voter_1 = group.get_player_by_id(3), voter_2 = group.get_player_by_id(4), voter_3 = group.get_player_by_id(5), voter_4 = group.get_player_by_id(6), voter_5 = group.get_player_by_id(7), voter_6 = group.get_player_by_id(8), voter_7 = group.get_player_by_id(9), voter_8 = group.get_player_by_id(10) ) class WaitingForCandidates(WaitPage): body_text = 'The candidates are creating their campaigning platforms (Wahlprogramme). ' @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group > 2 class WaitingForTheOtherCandidate(WaitPage): body_text = 'Waiting for the other candidate' @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group < 3 class Voting(Page): form_model = 'player' form_fields = ['vote_for'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group > 2 return True @staticmethod def vars_for_template(player: Player): group = player.group candidate_A = group.get_player_by_id(1) candidate_B = group.get_player_by_id(2) total_voters_by_A = sum([candidate_A.v01,candidate_A.v02,candidate_A.v03,candidate_A.v04,candidate_A.v05,candidate_A.v06,candidate_A.v07,candidate_A.v08]) total_voters_by_B = sum([candidate_B.v01,candidate_B.v02,candidate_B.v03,candidate_B.v04,candidate_B.v05,candidate_B.v06,candidate_B.v07,candidate_B.v08]) total_voters_rel_by_A = 0 if total_voters_by_A >0: total_voters_rel_by_A = round(100/total_voters_by_A) total_voters_rel_by_B = 0 if total_voters_by_B >0: total_voters_rel_by_B = round(100/total_voters_by_B) return dict( candidate_A = candidate_A, candidate_B = candidate_B, voter_1 = group.get_player_by_id(3), voter_2 = group.get_player_by_id(4), voter_3 = group.get_player_by_id(5), voter_4 = group.get_player_by_id(6), voter_5 = group.get_player_by_id(7), voter_6 = group.get_player_by_id(8), voter_7 = group.get_player_by_id(9), voter_8 = group.get_player_by_id(10), total_voters_by_A = total_voters_by_A, total_voters_by_B = total_voters_by_B, total_voters_rel_by_A = total_voters_rel_by_A, total_voters_rel_by_B = total_voters_rel_by_B, ) class WaitingForVoters(WaitPage): after_all_players_arrive = determine_winner_and_payoffs body_text = 'Waiting for the voters' @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group > 0 class Outcome(Page): form_model = 'player' @staticmethod def vars_for_template(player: Player): group = player.group votes = [ group.get_player_by_id(3).vote_for, group.get_player_by_id(4).vote_for, group.get_player_by_id(5).vote_for, group.get_player_by_id(6).vote_for, group.get_player_by_id(7).vote_for, group.get_player_by_id(8).vote_for, group.get_player_by_id(9).vote_for, group.get_player_by_id(10).vote_for ] votes_for_A = 0 votes_for_B = 0 votes_for_abstain = 0 votes_for_A = votes.count("A") votes_for_B = votes.count("B") votes_for_abstain = votes.count("abstain") all_votes = 8 ### budget_A = 100 ### gov budget budget_B = 100 ### gov budget votes_rel_for_A = 0 votes_rel_for_B = 0 votes_rel_for_abstain = 0 votes_rel_for_A = (votes_for_A / all_votes)*100 votes_rel_for_B = (votes_for_B / all_votes)*100 votes_rel_for_abstain = (votes_for_abstain / all_votes)*100 ### add stuff candidate_A = group.get_player_by_id(1) candidate_B = group.get_player_by_id(2) total_voters_by_A = sum([candidate_A.v01,candidate_A.v02,candidate_A.v03,candidate_A.v04,candidate_A.v05,candidate_A.v06,candidate_A.v07,candidate_A.v08]) total_voters_by_B = sum([candidate_B.v01,candidate_B.v02,candidate_B.v03,candidate_B.v04,candidate_B.v05,candidate_B.v06,candidate_B.v07,candidate_B.v08]) budget_A_per_voter = 0 if total_voters_by_A >0: budget_A_per_voter = round(budget_A/total_voters_by_A, 2) budget_B_per_voter = 0 if total_voters_by_B >0: budget_B_per_voter = round(budget_B/total_voters_by_B, 2) return dict( votes_rel_for_A = votes_rel_for_A, votes_rel_for_B = votes_rel_for_B, votes_rel_for_abstain = votes_rel_for_abstain, votes_for_A = votes_for_A, votes_for_B = votes_for_B, votes_for_abstain = votes_for_abstain, budget_A = budget_A, budget_B = budget_B, total_voters_by_A = total_voters_by_A, ### add stuff total_voters_by_B = total_voters_by_B, budget_A_per_voter = budget_A_per_voter, budget_B_per_voter = budget_B_per_voter, candidate_A = candidate_A, candidate_B = candidate_B ) page_sequence = [Welcome, WaitForOthers, Campaigning, WaitingForCandidates, WaitingForTheOtherCandidate, Voting, WaitingForVoters, Outcome]