from otree.api import * import random c = Currency doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'divide_numbers_treatment' players_per_group = None num_rounds = 3 divisor_treatment_1 = 2 divisor_treatment_2 = 4 class Subsession(BaseSubsession): def creating_session(self): number_players = len(self.get_players()) treatment_list = [] # we want a balanced randomisation, not all players in group 1 and 0 in 2. for i in range(number_players): if i % 2 == 0: # % gives remainder of division by 2: if it is, true; if it's not, false treatment_list.append(True) else: treatment_list.append(False) for player in self.get_players(): index = random.randint(0, len(treatment_list)-1) player.is_treatment_1 = treatment_list.pop(index) # this ensures the balanced randomisation class Group(BaseGroup): pass class Player(BasePlayer): division_result_entered = models.FloatField() random_number = models.IntegerField() is_treatment_1 = models.BooleanField() # PAGES class MyPage(Page): form_model = "player" form_fields = ["division_result_entered"] def vars_for_template(player: Player): player.random_number = random.randint(0, 100) if player.is_treatment_1: divisor = Constants.divisor_treatment_1 else: divisor = Constants.divisor_treatment_2 return{ "divisor": divisor, } class Results(Page): def vars_for_template(self): if self.player.is_treatment_1: correct_answer = self.player.random_number / Constants.divisor_treatment_1 else: correct_answer = self.player.random_number / Constants.divisor_treatment_2 if self.player.division_result_entered == correct_answer: result_text = "correct" else: result_text = "false" return{ "result_text": result_text, "correct_answer": correct_answer, } page_sequence = [MyPage, Results]