from otree.api import * doc = """ Your app description """ class Constants(BaseConstants): import csv name_in_url = 'two_PBC_one_player' players_per_group = None num_rounds = 5 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) # 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 Choose(Page): form_model = 'player' form_fields = ['number'] def is_displayed(player): participant = player.participant if player.round_number == 1: participant.vars['two_PBC_cmt'] = -1 player.commit = participant.vars['two_PBC_cmt'] return player @staticmethod def js_vars(player: Player): return dict(commit = player.commit) def before_next_page(player, timeout_happened): import random row = random.randint(0,Constants.db_size-1) player.the_other_number = int(Constants.para[row]['number']) 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 is_displayed(player): # return player.commit != -1 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) page_sequence = [Choose, Results, Commit]