from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'intro' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 QUIZ_CHOICES = [1,2,3] QUIZ_VALUES = [100, 600] QUIZ = dict(q1=QUIZ_VALUES[0], q2=QUIZ_VALUES[1], q3=QUIZ_CHOICES[0], q6=QUIZ_CHOICES[1], q5=QUIZ_CHOICES[1]) QUIZ_ERROR_MESSAGE = dict(q1="Incorrect answer. Read and answer again", q2="Incorrect answer. Read and answer again", q3="Are you sure? You can only gain by redeeming coupon X", q6="Are you sure? Issuing coupon Y you will have to pay a prize", q5="Are you sure? Issuing coupon Y you will have to pay a prize") class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): q1 = models.IntegerField( label="What is the minimum payout in zlotys you will receive tomorrow if you have one ticket X?" ) q2 = models.IntegerField( label="What is the maximum payout in zlotys you will have to pay tomorrow if you issue one ticket X?" ) q3 = models.IntegerField( label="If X is offered for free, would you take it?", choices=[(1, 'Yes'), (2, 'No'), (3, 'I\'m not sure')], widget=widgets.RadioSelect ) q6 = models.IntegerField( label="If you had one ticket X, would you sell it for free?", choices=[(1, 'Yes'), (2, 'No'), (3, 'I\'m not sure')], widget=widgets.RadioSelect ) q5 = models.IntegerField( label="Would you issue one ticket X to another person for free?", choices=[(1, 'Yes'), (2, 'No'), (3, 'I\'m not sure')], widget=widgets.RadioSelect ) q7 = models.IntegerField( label="Please consider the same question again.", choices=[(1, 'I am changing my answer and want ticket X for free.'), (2, 'I still don\'t want this ticket for free.')], widget=widgets.RadioSelect, blank=True ) q8 = models.IntegerField( label="Please consider the same question again.", choices=[(1, 'I\'m changing my answer and I don\'t want to issue ticket Y for free.'), (2, 'I still want to issue this ticket for free.')], widget=widgets.RadioSelect, blank=True ) q9 = models.IntegerField( label="Please consider the same question again.", choices=[(1, 'I want ticket X for free.'), (2, 'I don’t want ticket X for free.')], widget=widgets.RadioSelect, blank=True ) q10 = models.IntegerField( label="Please consider the same question again.", choices=[(1, 'I don’t want to issue ticket Y for free.'), (2, 'I want to issue ticket Y for free.')], widget=widgets.RadioSelect, blank=True ) q11 = models.IntegerField( label="Please consider the same question again.", choices=[(1, 'I\'m changing my answer and would not sell ticket X for free.'), (2, 'I still want to sell ticket X for free.')], widget=widgets.RadioSelect, blank=True ) q12 = models.IntegerField( label="Please consider the same question again.", choices=[(1, 'I don’t want to sell ticket X for free.'), (2, 'I want to sell ticket X for free.')], widget=widgets.RadioSelect, blank=True ) # PAGES class Instructions(Page): pass class Quiz(Page): form_model = 'player' #form_fields = list(C.QUIZ) form_fields = ["q1", "q2", "q3", "q6", "q5"] @staticmethod def error_message(player: Player, values): errors = {k: C.QUIZ_ERROR_MESSAGE[k] for k, v in C.QUIZ.items() if values[k] != v and k not in ["q3", "q6", "q5"]} return errors class Reasessment(Page): form_model = 'player' form_fields = ["q7", "q8"] @staticmethod def is_displayed(player: Player): if player.q3 == 2 and player.q6 == 1: return True else: return False class ReasessmentTest(Page): form_model = 'player' form_fields = ["q7", "q8", "q9", "q10", "q11", "q12"] def js_vars(player: Player): return dict( q3_val=player.q3, q5_val=player.q5, q6_val=player.q6 ) #@staticmethod #def error_message(player: Player, values): # errors = {k: C.QUIZ_ERROR_MESSAGE[k] for k, v in C.QUIZ.items() if values[k] != v and k not in ["q3", "q6", "q5"]} # return errors @staticmethod def is_displayed(player: Player): if player.q3 != 1 or player.q6 != 2 or player.q5 != 2: return True else: return False class Reasess_q7_only(Page): form_model = 'player' form_fields = ["q7"] @staticmethod def is_displayed(player: Player): if player.q3 == 2 and player.q6 == 2: return True else: return False class Reasess_q8_only(Page): form_model = 'player' form_fields = ["q8"] @staticmethod def is_displayed(player: Player): if player.q3 == 1 and player.q6 == 1: return True else: return False class Reasessment2(Page): form_model = 'player' form_fields = ["q9", "q10"] @staticmethod def is_displayed(player: Player): if player.q3 == 3 and player.q6 == 3: return True else: return False class Reasess_q9_only(Page): form_model = 'player' form_fields = ["q9"] @staticmethod def is_displayed(player: Player): if player.q3 == 3 and player.q6 == 2: return True else: return False class Reasess_q10_only(Page): form_model = 'player' form_fields = ["q10"] @staticmethod def is_displayed(player: Player): if player.q3 == 1 and player.q6 == 3: return True else: return False class Reasessment3(Page): form_model = 'player' form_fields = ["q7", "q10"] @staticmethod def is_displayed(player: Player): if player.q3 == 2 and player.q6 == 3: return True else: return False class Reasessment4(Page): form_model = 'player' form_fields = ["q9", "q8"] @staticmethod def is_displayed(player: Player): if player.q3 == 3 and player.q6 == 1: return True else: return False #page_sequence = [Instructions, Quiz, Reasessment, Reasessment2, Reasess_q7_only, Reasess_q8_only, Reasess_q9_only, Reasess_q10_only, Reasessment3, Reasessment4] page_sequence = [Instructions, Quiz, ReasessmentTest]