from otree.api import * import random import json from datetime import datetime import time doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'count_number' PLAYERS_PER_GROUP = None NUM_ROUNDS = 9 POINTS_PER_CORRECT_ANSWER = cu(1) MATRIX_SIZE = 7 # One round means the page sequence will be done once. Otherwise when the results page is over. class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): matrix_size = C.MATRIX_SIZE random_matrix = [[random.randint(0, 1) for _ in range(matrix_size)] for _ in range(matrix_size)] correct_sum = sum(sum(row) for row in random_matrix) subsession.session.vars[f'count1_matrix_round_{subsession.round_number}'] = random_matrix subsession.session.vars[f'count1_correct_sum_round_{subsession.round_number}'] = correct_sum class Group(BaseGroup): pass class Player(BasePlayer): number_entered = models.IntegerField(label='Please enter the total number of \'1\'s:') sum_of_numbers = models.IntegerField() #Store the correct number result = models.StringField() start_time = models.FloatField(blank=True) # Timestamp when the page is loaded end_time = models.FloatField(blank=True) # Timestamp when the page is submitted # PAGES class Start(Page): form_model = "player" form_fields = ["number_entered"] @staticmethod def vars_for_template(player: Player): player.start_time = time.time() current_round_key = f"count1_matrix_round_{player.round_number}" # Retrieve the matrix for this round random_matrix = player.session.vars[current_round_key] correct_sum = player.session.vars[f'count1_correct_sum_round_{player.round_number}'] player.sum_of_numbers = correct_sum # Retrieve the global progress and treatments progress_percent = player.participant.vars['total_progress'] treatment = player.participant.vars.get('treatment', None) return { 'matrix': random_matrix, 'progress_percent': progress_percent, 'treatment': treatment, } @staticmethod def before_next_page(player: Player, timeout_happened): total_rounds = player.session.config['total_rounds'] progress_increment = 100 / total_rounds player.participant.vars['total_progress'] += progress_increment if player.number_entered == 999: player.result = "Skipped" elif player.number_entered == player.sum_of_numbers: player.result = "Correct" player.payoff = C.POINTS_PER_CORRECT_ANSWER else: player.result = "Wrong" player.payoff = cu(0) player.end_time = time.time() class Results(Page): pass class DelayPage(Page): timeout_seconds = 35 @staticmethod def is_displayed(player:Player): return player.round_number == C.NUM_ROUNDS @staticmethod def vars_for_template(player: Player): return { 'delay_time_seconds': 35 } page_sequence = [Start, DelayPage]