from otree.api import * doc = """ Your app description """ class Constants(BaseConstants): import csv name_in_url = 'two_PBC_oneP_guide' players_per_group = None num_rounds = 1 win_payoff = cu(10) lose_payoff = cu(0) proportion = 0.9 # with open('two_PBC_one_player/database.csv', 'r') as para: # para = list(csv.DictReader(para)) # db_size = len(para) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): number = models.IntegerField(blank=True, choices=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], widget=widgets.RadioSelect ) the_other_number = models.IntegerField() diff = models.FloatField() target_number = models.FloatField(initial=0) is_winner = models.IntegerField() temp_payoff = models.CurrencyField() commit = models.IntegerField(initial=-1) quiz_one = models.IntegerField(blank=True, choices=[1,2,3,4], widget=widgets.RadioSelect) quiz_two = models.IntegerField(blank=True, choices=[1,2,3,4], widget=widgets.RadioSelect) Pass = models.BooleanField(initial=False) # def creating_session(subsession: Subsession): # import random # session = subsession.session # if subsession.round_number == 1: # paying_round = random.randint(1, Constants.num_rounds) # session.vars['paying_round'] = paying_round # subsession.group_randomly() def set_winner(player: Player): player.target_number = player.number + player.the_other_number player.target_number = player.target_number*Constants.proportion/2 player.target_number = round(player.target_number, 2) if player.number == player.the_other_number: player.is_winner = 2 player.payoff = Constants.win_payoff/2 elif player.number < player.the_other_number: player.is_winner = 1 player.payoff = Constants.win_payoff else: player.is_winner = 0 # PAGES class Instruction(Page): def is_displayed(player): return player.round_number == 1 class Choose(Page): form_model = 'player' form_fields = ['number'] @staticmethod def before_next_page(player, timeout_happened): player.the_other_number = 5 set_winner(player) def error_message(player, values): if values['number'] == None: return 'Please choose a number.' class Commit(Page): form_model = 'player' form_fields = ['commit'] def is_displayed(player): return player.commit == -1 # def before_next_page(player: Player, timeout_happened): # participant = player.participant # participant.two_PBC_cmt = player.commit @staticmethod def js_vars(player: Player): return dict(number = player.number) class Results(Page): def vars_for_template(player: Player): result = '' if player.is_winner == 1: result = 'You won.' elif player.is_winner == 0: result = 'You lost.' else: result = 'It was a tie.' return dict(result = result) class Quiz(Page): form_model = 'player' form_fields = ['quiz_one'] @staticmethod def error_message(player, values): for q in ['quiz_one']: if values[q] == None: return 'Please answer all the questions' def before_next_page(player, timeout_happened): if player.quiz_one == 2: player.Pass = True class Quiz_result(Page): @staticmethod def app_after_this_page(player, upcoming_apps): if player.Pass == True: return upcoming_apps[0] else: return "payment_info" # page_sequence = [Instruction, Choose, Results, Commit, Quiz, Quiz_result] page_sequence = [Quiz, Quiz_result]