from otree.api import * c = cu doc = 'A public goods game with group competition\n' class Constants(BaseConstants): name_in_url = 'Public_Goods_Same_Group_Competition' players_per_group = None num_rounds = 5 endowment = 10 instructions_template = 'Public_Goods_Same_Group_Competition/instructions.html' def creating_session(subsession): session = subsession.session subsession.group_randomly(fixed_id_in_group=True) class Subsession(BaseSubsession): pass def set_payoffs(group): session = group.session players = group.get_players() group.shark_contributions = 0 group.jet_contributions = 0 for p in players: if (p.id_in_group % 2) == 0: group.shark_contributions = group.shark_contributions + p.contribution else: group.jet_contributions = group.jet_contributions + p.contribution if group.shark_contributions > group.jet_contributions: group.winning_team = "Sharks" group.losing_team = "Jets" group.team_winnings = (Constants.endowment * session.num_participants)/2 - group.jet_contributions elif group.shark_contributions < group.jet_contributions: group.winning_team = "Jets" group.losing_team = "Sharks" group.team_winnings = (Constants.endowment * session.num_participants)/2 - group.shark_contributions else: group.winning_team = "Tie" group.losing_team = "Tie" group.team_winnings = 0 group.individual_share = 2*group.team_winnings/session.num_participants for p in players: set_payoff(p) def set_teams(group): for p in group.get_players(): set_team(p) class Group(BaseGroup): individual_share = models.CurrencyField() shark_contributions = models.CurrencyField() jet_contributions = models.CurrencyField() winning_team = models.StringField() team_winnings = models.CurrencyField() losing_team = models.StringField() def set_payoff(player): group = player.group if group.winning_team == "Tie": player.payoff = Constants.endowment - player.contribution elif group.winning_team == player.team: player.payoff = Constants.endowment - player.contribution + group.individual_share else: player.payoff = 0 def set_team(player): group = player.group if (player.id_in_group % 2) == 0: player.team = "Sharks" else: player.team = "Jets" class Player(BasePlayer): contribution = models.IntegerField(max=Constants.endowment, min=0) team = models.StringField() class Introduction(Page): form_model = 'player' timeout_seconds = 100 @staticmethod def is_displayed(player): return player.round_number == 1 class DecisionWaitPage(WaitPage): after_all_players_arrive = set_teams class Decision(Page): form_model = 'player' form_fields = ['contribution'] class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): form_model = 'player' page_sequence = [Introduction, DecisionWaitPage, Decision, ResultsWaitPage, Results]