import random from otree.api import * author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): # Constants can be any python variable type # string name_in_url = 'divide_numbers_treatments' players_per_group = None num_rounds = 1 divisor_treatment_1 = 2 divisor_treatment_2 = 4 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): division_result_entered = models.FloatField(label="Result") random_number = models.IntegerField() is_treatment_1 = models.BooleanField() # FUNCTIONS def creating_session(subsession): # balanced randomisation of subjects into treatment 1 and 2 number_players = len(subsession.get_players()) treatment_list = [] for i in range(number_players): # % gives the remainder of a division # ensures that both treatments are balanced if i % 2 == 0: treatment_list.append(True) else: treatment_list.append(False) for player in subsession.get_players(): # get a random treatment index = random.randint(0, len(treatment_list)-1) # pop removes the value from the list so it wont be assigned again player.is_treatment_1 = treatment_list.pop(index) # PAGES class MyPage(Page): form_model = 'player' # names must correspond to fields in models.py form_fields = ['division_result_entered'] @staticmethod def vars_for_template(player): player.random_number = random.randint(1, 100) if player.is_treatment_1: divisor = Constants.divisor_treatment_1 else: divisor = Constants.divisor_treatment_2 return { "divisor": divisor, } class Results(Page): @staticmethod def vars_for_template(player): if player.is_treatment_1: correct_answer = player.random_number / Constants.divisor_treatment_1 else: correct_answer = player.random_number / Constants.divisor_treatment_2 if correct_answer == player.division_result_entered: result_text = "correct" else: result_text = "false" return { "result_text": result_text, "correct_answer": correct_answer, } # the order in which pages are displayed page_sequence = [MyPage, Results]