import numpy as np from otree import session from otree.api import * import random import string from otree.models import player, subsession, participant doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'RQ1' PLAYERS_PER_GROUP = None NUM_ROUNDS = 50 class Subsession(BaseSubsession): def creating_session(subsession): t1 = 'The two clinics may differ in terms of waiting times. In Clinic 1, you might experience a waiting duration of 10-12 seconds, whereas in Clinic 2 waiting duration is 1-20 seconds.' t2 = 'The two clinics may differ in terms of waiting times. In Clinic 1, you might wait an average of 11 seconds. In Clinic 2, maximum waiting time is 21 seconds.' t3 = 'The two clinics may differ in terms of waiting times. Clinic 1 focuses on the maximum waiting, and their maximum waiting time is 12.0 seconds. Clinic 2 focuses on the average waiting time, and their average waiting time is 10.5 seconds.' t4 = 'The two clinics may differ in terms of waiting times. Clinic 1 focuses on the maximum waiting, and their maximum waiting time is 16.0 seconds. Clinic 2 focuses on the average waiting time, and their average waiting time is 10.5 seconds.' wt10_12 = round(random.uniform(10, 12), 2) wt1_21 = round(random.uniform(1, 20), 2) wt1_16_t = round(np.random.triangular(1, 16, 16), 2) wt1_20_t = round(random.uniform(1, 20), 2) if subsession.session.config['treatment'] == 1: t = t1 wt1 = wt10_12 wt1repeat = wt10_12 wt2 = wt1_21 wt2repeat = wt1_21 button1 = "(10-12 seconds of waiting time)" button2 = "(1-20 seconds of waiting time)" room1 = "Waiting time is 10-12 seconds." room2 = "Waiting time is 1-20 seconds." elif subsession.session.config['treatment'] == 2: t = t2 wt1 = wt1_21 wt1repeat = wt1_21 wt2 = wt1_21 wt2repeat = wt1_21 button1 = "(11 seconds of average waiting time)" button2 = "(21 seconds of maximum waiting time)" room1 = "Average waiting time is 11 seconds." room2 = "Maximum waiting time is 21 seconds." elif subsession.session.config['treatment'] == 3: t = t3 wt1 = wt10_12 wt1repeat = wt10_12 wt2 = wt1_21 wt2repeat = wt1_21 button1 = "(12.0 seconds of maximum waiting time)" button2 = "(10.5 seconds of average waiting time)" room1 = "Maximum waiting time is 12.0 seconds." room2 = "Average waiting time is 10.5 seconds." elif subsession.session.config['treatment'] == 4: t = t4 wt1 = wt1_16_t wt1repeat = wt1_16_t wt2 = wt1_20_t wt2repeat = wt1_20_t button1 = "(16.0 seconds of maximum waiting time)" button2 = "(10.5 seconds of average waiting time)" room1 = "Maximum waiting time is 16.0 seconds." room2 = "Average waiting time is 10.5 seconds." return dict( t=t, wt1=wt1, wt1repeat=wt1repeat, wt2=wt2, wt2repeat=wt2repeat, button1=button1, button2=button2, room1=room1, room2=room2 ) class Group(BaseGroup): pass class Player(BasePlayer): chosen_clinic = models.IntegerField( choices=[ [1, 'Clinic 1'], [2, 'Clinic 2'] ], widget=widgets.RadioSelectHorizontal ) chosen_clinic_1 = models.IntegerField( choices=[ [1, 'Clinic 1'], [2, 'Clinic 2'] ], widget=widgets.RadioSelectHorizontal ) waiting_duration = models.FloatField() waiting_duration_1 = models.FloatField() redo1 = models.BooleanField(initial=False) redo2 = models.BooleanField(initial=False) time_spent_i = models.FloatField() # time_spent_q = models.FloatField() time_spent_c = models.FloatField() time_spent_w = models.FloatField() time_spent_c1 = models.FloatField() time_spent_w1 = models.FloatField() quiz1 = models.BooleanField( label='Are you allowed to choose different clinics for your sessions?' ) quiz2 = models.IntegerField( label="How many times are you allowed to re-attend a session if you miss it on your first time?") quiz3 = models.IntegerField( label="Which of the following options is wrong?", choices=[ [1, 'I have to click on the \'Pay attention to the nurse\' button whenever I see it.'], [2, 'I will automatically be redirected to the doctor\'s room when the waiting time ends.'], [3, 'I won\'t get paid if I miss to attend my session twice in a row.'] ], widget=widgets.RadioSelect ) age = models.IntegerField(label="What is your age?") gender = models.IntegerField( label="What is your gender?", choices=[ [1, 'Male'], [2, 'Female'], [3, 'Non-binary'], [4, 'Prefer not to say'] ], widget=widgets.RadioSelect ) risk_taking = models.IntegerField( label="Please indicate how much do you agree with the following statement: \"I am generally a person who is willing to take risks.\"", choices=[ [-2, 'Strongly Disagree'], [-1, 'Disagree'], [0, 'Neutral'], [1, 'Agree'], [2, 'Strongly Agree'] ], widget=widgets.RadioSelectHorizontal ) decision = models.LongStringField( label="What was the reasoning behind your decisions? Did you switch between the two clinics? What was the reason? Please indicte with a few sentences.") # PAGES class Initial(Page): form_model = "player" form_fields = ["time_spent_i"] def is_displayed(player: Player): return player.round_number == 1 def vars_for_template(player: Player): return dict( t=Subsession.creating_session(player.subsession).get('t') ) class Quiz(Page): form_model = "player" form_fields = ["quiz1", "quiz2", "quiz3"] def is_displayed(player: Player): return player.round_number == 1 def vars_for_template(player: Player): return dict( t=Subsession.creating_session(player.subsession).get('t') ) @staticmethod def js_vars(player: Player): return dict( t=Subsession.creating_session(player.subsession).get('t') ) # @staticmethod # def live_method(player, data): # player.time_spent_q = data @staticmethod def error_message(player: Player, values): solutions = dict(quiz1=True, quiz2=1, quiz3=2) if values != solutions: return "One or more answers were incorrect." class ChoosingPage(Page): form_model = "player" form_fields = ["chosen_clinic", "time_spent_c"] def vars_for_template(player: Player): return dict( current_round=player.round_number, rounds_done=player.round_number - 1 ) @staticmethod def js_vars(player: Player): return dict( current_round=player.round_number, t=Subsession.creating_session(player.subsession).get('t'), button1=Subsession.creating_session(player.subsession).get('button1'), button2=Subsession.creating_session(player.subsession).get('button2') ) class WaitingArea(Page): form_model = "player" form_fields = ["time_spent_w"] @staticmethod def js_vars(player): waiting_time = Subsession.creating_session(player.subsession).get('wt1') if player.chosen_clinic == 1 else \ Subsession.creating_session(player.subsession).get('wt2') player.waiting_duration = waiting_time return dict( waiting_time=waiting_time, the_clinic=player.chosen_clinic, room_description=Subsession.creating_session(player.subsession).get( 'room1') if player.chosen_clinic == 1 else Subsession.creating_session(player.subsession).get('room2') ) def vars_for_template(player: Player): return dict( current_round=player.round_number ) @staticmethod def live_method(player, data): player.redo1 = data class Redo1(Page): form_model = "player" form_fields = ["chosen_clinic_1", "time_spent_c1"] def is_displayed(player: Player): return player.redo1 def vars_for_template(player: Player): return dict( current_round=player.round_number, rounds_done=player.round_number - 1 ) @staticmethod def js_vars(player: Player): return dict( current_round=player.round_number, t=Subsession.creating_session(player.subsession).get('t'), button1=Subsession.creating_session(player.subsession).get('button1'), button2=Subsession.creating_session(player.subsession).get('button2') ) class Rewait1(Page): form_model = "player" form_fields = ["time_spent_w1"] def is_displayed(player: Player): return player.redo1 @staticmethod def js_vars(player): waiting_time_1 = Subsession.creating_session(player.subsession).get( 'wt1repeat') if player.chosen_clinic_1 == 1 else \ Subsession.creating_session(player.subsession).get('wt2repeat') player.waiting_duration_1 = waiting_time_1 return dict( waiting_time_1=waiting_time_1, the_clinic=player.chosen_clinic_1, room_description=Subsession.creating_session(player.subsession).get( 'room1') if player.chosen_clinic_1 == 1 else Subsession.creating_session(player.subsession).get('room2') ) def vars_for_template(player: Player): return dict( current_round=player.round_number ) @staticmethod def live_method(player, data): player.redo2 = data class Termination(Page): def is_displayed(player: Player): return player.redo2 class Questionnaire(Page): form_model = "player" form_fields = ["age", "gender", "risk_taking", "decision"] def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class End(Page): def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS # def js_vars(player: Player): # size=6 # chars = string.ascii_uppercase + string.digits # return dict( # code=''.join(random.choice(chars) for _ in range(size)) # ) def vars_for_template(player: Player): return { "completion_code": player.participant.code, } page_sequence = [Initial, Quiz, ChoosingPage, WaitingArea, Redo1, Rewait1, Termination, Questionnaire, End]