import random from otree.api import * import datetime as dt doc = """ oTree-App: KI-Beratung """ class C(BaseConstants): NAME_IN_URL = 'instructions' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): role_type = models.StringField(default=" ") # choice of investment amount and option push_option = models.StringField(blank=True) option_A = models.StringField(blank=True) option_B = models.StringField(blank=True) # general variables prolific_id = models.StringField(default=str(" ")) consent = models.IntegerField(blank=True) # check questions check_question_1 = models.IntegerField(blank=True) check_question_2 = models.IntegerField(blank=True) check_question_1_attempt_2 = models.IntegerField(blank=True) check_question_2_attempt_2 = models.IntegerField(blank=True) check_failed_once = models.IntegerField(blank=True) check_failed_twice = models.IntegerField(blank=True) # time variables starting_time = models.StringField(default=str(" ")) instructions_time = models.StringField(default=str(" ")) def creating_session(subsession): subsession.session.investor_count = 0 subsession.session.bank_count = 0 class GeneralInstructions(Page): form_model = 'player' form_fields = ['consent'] @staticmethod def error_message(player, values): if (values['consent'] != 1): return "Please confirm your consent!" @staticmethod def before_next_page(player, timeout_happened): if player.session.investor_count == player.session.bank_count: if player.id_in_group % 2 == 1: player.role_type = "investor" player.session.investor_count += 1 else: player.role_type = "bank" player.session.bank_count += 1 elif player.session.investor_count > player.session.bank_count: player.role_type = "bank" player.session.bank_count += 1 elif player.session.investor_count < player.session.bank_count: player.role_type = "investor" player.session.investor_count += 1 player.prolific_id = player.participant.label player.participant.role_type = player.role_type if player.role_type == 'investor': option = random.randint(1, 2) print(option) if option == 1: player.push_option = "A" elif option == 2: player.push_option = "B" print(player.push_option) player.participant.push_option = player.push_option random_option = random.randint(1, 2) print(random_option) if random_option == 1: player.option_A = "TurquoiseLake" player.option_B = "Bellerophon" elif random_option == 2: player.option_A = "Bellerophon" player.option_B = "TurquoiseLake" print(player.option_A) player.participant.option_A = player.option_A print(player.option_B) player.participant.option_B = player.option_B now = dt.datetime.now() player.starting_time = now.strftime("%Y-%m-%d %H:%M:%S") player.participant.starting_time = player.starting_time class Instructions(Page): form_model = 'player' form_fields = ['check_question_1', 'check_question_2'] @staticmethod def error_message(player, values): if values['check_question_1'] is None or values['check_question_2'] is None: return "Please answer all comprehension questions!" @staticmethod def before_next_page(player, timeout_happened): if player.check_question_1 == 1 and player.check_question_2 == 1: player.check_failed_once = 0 player.check_failed_twice = 0 else: player.check_failed_once = 1 player.check_failed_twice = 0 if player.check_question_1 == 1: player.check_question_1_attempt_2 = 1 if player.check_question_2 == 1: player.check_question_2_attempt_2 = 1 class InstructionsFail(Page): form_model = 'player' form_fields = ['check_question_1_attempt_2', 'check_question_2_attempt_2'] @staticmethod def is_displayed(player): if not (player.check_question_1 == 1 and player.check_question_2 == 1): return True else: return False @staticmethod def error_message(player, values): if values['check_question_1_attempt_2'] is None or values['check_question_2_attempt_2'] is None: return "Please answer all comprehension questions!" @staticmethod def before_next_page(player, timeout_happened): if player.check_question_1_attempt_2 == 1 and player.check_question_2_attempt_2 == 1: player.check_failed_twice = 0 else: player.check_failed_twice = 1 class Feedback(Page): @staticmethod def before_next_page(player, timeout_happened): now = dt.datetime.now() player.instructions_time = now.strftime("%Y-%m-%d %H:%M:%S") player.participant.instructions_time = player.instructions_time player.participant.check_failed_twice = player.check_failed_twice page_sequence = [GeneralInstructions, Instructions, InstructionsFail, Feedback]