import math as M import random as R from otree.api import * author = 'Corey Scheinfeld' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'participation' players_per_group = None num_rounds = 10 instructions_template = 'participation/instructions.html' instructions_template2 = 'participation/part2.html' class Subsession(BaseSubsession): winner = models.StringField() alpha = models.IntegerField() beta = models.IntegerField() alpha_participants = models.IntegerField() beta_participants = models.IntegerField() class Group(BaseGroup): count = models.IntegerField() bonus = models.IntegerField() class Player(BasePlayer): group_type = models.StringField() group_bonus = models.IntegerField() personal_bonus = models.IntegerField() participate = models.BooleanField(choices=[[True, 'Participate'], [False, 'Do Not Participate']]) # FUNCTIONS def creating_session(subsession: Subsession): if subsession.round_number == 1: alpha_group = [] beta_group = [] matrix = subsession.get_group_matrix() for i in range(len(matrix[0])): if i < (M.ceil((len(matrix[0]) + 1) / 2)): beta_group.append(i + 1) else: alpha_group.append(i + 1) subsession.alpha = len(alpha_group) subsession.beta = len(beta_group) new_matrix = [alpha_group, beta_group] subsession.set_group_matrix(new_matrix) elif subsession.round_number > 1 and subsession.round_number < 6: subsession.group_like_round(1) if subsession.round_number == 6: all_players = subsession.get_players() alpha_group = [] beta_group = [] R.shuffle(all_players) for i in range(len(all_players)): if i < (M.ceil((len(all_players) * 2) / 3)): beta_group.append(i + 1) else: alpha_group.append(i + 1) subsession.alpha = len(alpha_group) subsession.beta = len(beta_group) new_matrix = [alpha_group, beta_group] subsession.set_group_matrix(new_matrix) elif subsession.round_number > 6 and subsession.round_number < 10: subsession.group_like_round(6) def set_up(subsession: Subsession): matrix = subsession.get_group_matrix() for p in matrix[0]: p.group_type = 'Alpha' p.personal_bonus = R.randrange(0, 55) for p in matrix[1]: p.group_type = 'Beta' p.personal_bonus = R.randrange(0, 55) def set_payoffs(subsession: Subsession): groups = subsession.get_groups() for g in groups: g.count = sum(p.participate for p in g.get_players()) group1, group2 = subsession.get_groups() subsession.alpha_participants = group1.count subsession.beta_participants = group2.count if group1.count > group2.count: group1.bonus = 105 group2.bonus = 5 subsession.winner = 'Alpha' elif group1.count < group2.count: group1.bonus = 5 group2.bonus = 105 subsession.winner = 'Beta' else: group1.bonus = 55 group2.bonus = 55 subsession.winner = 'Tie' for g in groups: for p in g.get_players(): p.payoff = g.bonus if p.participate: p.payoff += p.personal_bonus # PAGES class Introduction(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 or player.round_number == 6 class IntroductionWaitPage(WaitPage): wait_for_all_groups = True after_all_players_arrive = set_up class Main(Page): form_model = 'player' form_fields = ['participate'] @staticmethod def vars_for_template(player: Player): a = player.round_number - 5 return dict(a=a) class ResultsWaitPage(WaitPage): wait_for_all_groups = True after_all_players_arrive = set_payoffs class Results(Page): pass page_sequence = [Introduction, IntroductionWaitPage, Main, ResultsWaitPage, Results]