from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator import numpy as np def vars_for_all_templates(self): return { 'radio_amounts': zip(Constants.list2, Constants.list1), 'participation_fee': c(self.session.config['participation_fee']), 'round': self.round_number, 'exp_duration': self.session.config['exp_duration'], 'fixed_bonus': c(self.session.config['fixed_bonus']), 'fixed_payment': c(self.session.config['fixed_bonus'] + self.session.config['participation_fee']), 'max_bonus': c(11.5), 'lottery_min': c(self.player.lottery_min), 'lottery_max': c(self.player.lottery_max), 'row_span': (Constants.choices['wta1'][1] - Constants.choices['wta1'][0])/Constants.choices['wta1'][2] + 1, 'choice': self.player.choice_num, 'switch': self.player.indicator_never_always_switcher } @method_decorator(csrf_exempt, name='dispatch') class ProlificID(Page): def is_displayed(self): return self.round_number == 1 form_model = 'player' form_fields = ['prolific_id'] class Welcome(Page): def is_displayed(self): return self.round_number == 1 class Consent(Page): def is_displayed(self): return self.round_number == 1 form_model = 'player' form_fields = ['consent'] def app_after_this_page(self, upcoming_apps): if not self.player.consent: self.participant.vars['consent'] = False return upcoming_apps[-1] class InstructionsPart1(Page): def is_displayed(self): return self.player.round_number == 1 class InstructionsPart2(Page): def is_displayed(self): return self.player.round_number == 1 class InstructionsPart2_2(Page): def is_displayed(self): return self.player.round_number == 1 form_model = 'player' form_fields = [ 'confidence_hidden' ] class test(Page): def is_displayed(self): return self.player.round_number == 1 class ComprehensionCheck(Page): def is_displayed(self): return self.round_number == 1 form_model = 'player' form_fields = [ 'qn_lottery', 'qn_list', 'qn_confidence' ] def qn_lottery_error_message(self, value): if value != 1: self.player.qn_lottery_got_wrong = True self.player.failed_comprehension = True self.participant.vars['failed_comprehension'] = True self.player.question_failed = 1 def qn_list_error_message(self, value): if value != 1: self.player.qn_list_got_wrong = True self.player.failed_comprehension = True self.participant.vars['failed_comprehension'] = True self.player.question_failed = 2 def qn_confidence_error_message(self, value): if value != 16: self.player.qn_confidence_got_wrong = True self.player.failed_comprehension = True self.participant.vars['failed_comprehension'] = True self.player.question_failed = 3 class BeginStudy(Page): def is_displayed(self): return self.player.round_number == 1 and not self.participant.vars['failed_comprehension'] class List(Page): def is_displayed(self): return not self.participant.vars['failed_comprehension'] def vars_for_template(self): min = self.player.lottery_min max = self.player.lottery_max step_size = self.player.step_size right_side_amounts = list(self.player.frange(min, max, step_size)) return { 'right_side_amounts': right_side_amounts } def js_vars(self): return { 'fixed': self.player.lottery_max, 'choice': self.player.choice_num, 'min': self.player.lottery_min, 'max': self.player.lottery_max } form_model = 'player' form_fields = ['switching_point'] def before_next_page(self): self.player.set_switching_point_and_indicator() self.player.participant.vars[self.player.choice_name] = self.player.switching_point class Valuation(Page): def is_displayed(self): return not self.participant.vars['failed_comprehension'] form_model = 'player' form_fields = ['confidence'] def vars_for_template(self): val_up = self.player.switching_point val_low = self.player.switching_point - self.player.step_size if val_up == 9999: val_up = self.player.lottery_max if val_up == 0: val_up = self.player.lottery_min return { 'val_up': c(val_up), 'val_low': c(val_low), 'switch': self.player.indicator_never_always_switcher } def js_vars(self): return { 'choice': self.player.choice_num } def before_next_page(self): self.player.confidence = 100 - 5 * (20 - self.player.confidence) class FailedComprehension(Page): def is_displayed(self): return self.participant.vars['failed_comprehension'] and self.round_number == 1 def app_after_this_page(self, upcoming_apps): return upcoming_apps[-1] class Wait(Page): def is_displayed(self): return self.round_number == Constants.num_rounds timeout_seconds = 5 page_sequence = [ # ProlificID, # Welcome, # Consent, # InstructionsPart1, # InstructionsPart2, InstructionsPart2_2, test, # ComprehensionCheck, # FailedComprehension, # List, # Valuation, # Wait ]