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 { 'fee': c(self.session.config['participation_fee']), 'correct_incentive': c(Constants.correct_incentive), 'radio_amounts': zip(Constants.list2, Constants.list1), 'exp_duration': self.session.config['exp_duration'], 'anchor': self.player.participant.vars['anchor'], 'fixed_payment_per_question': c(self.session.config['fixed_payment_per_question']), 'total_fixed_payment': c(self.session.config['question_num'] * self.session.config['fixed_payment_per_question']) } @method_decorator(csrf_exempt, name='dispatch') # class Welcome(Page): # def is_displayed(self): # return self.round_number == 1 # # class FailedAnswer(Page): # def is_displayed(self): # return self.participant.vars['failed_answer'] and not self.participant.vars['failed_comprehension'] # def app_after_this_page(self, upcoming_apps): # return upcoming_apps[-1] class InstructionsPart1(Page): def is_displayed(self): return self.player.round_number == 1 class Begin(Page): def is_displayed(self): return self.player.round_number == 1 class DotPattern1(Page): def is_displayed(self): return self.round_number == 1 timer_text = 'Remaining Time:' timeout_seconds = Constants.dots_time class ValuationNoAnchor(Page): form_model = 'player' form_fields = ['confidence_noanchor'] timer_text = 'Remaining Time:' timeout_seconds = Constants.cu_time def before_next_page(self): if self.player.confidence_noanchor == 0: self.participant.vars['failed_answer'] = True self.player.failed_answer = True self.player.confidence_noanchor = None self.player.answer_failed =1 else: self.player.confidence_noanchor = 100 - 5 * (20 - self.player.confidence_noanchor + 1) class InstructionsPart2(Page): form_model = 'player' form_fields = ['anchor'] def is_displayed(self): return self.player.round_number == 1 and not self.participant.vars['failed_answer'] def before_next_page(self): self.participant.vars['anchor'] = self.player.anchor def js_vars(self): return dict( anchor=self.player.anchor, ) class DotPattern2(Page): def is_displayed(self): return self.round_number == 1 and not self.participant.vars['failed_answer'] timer_text = 'Remaining Time:' timeout_seconds = Constants.dots_time class AnchorDots(Page): def is_displayed(self): return self.round_number == 1 and not self.participant.vars['failed_answer'] form_model = 'player' form_fields = ['dots_anchor'] timer_text = 'Remaining Time:' timeout_seconds = Constants.cu_time def before_next_page(self): if not self.player.dots_anchor: self.participant.vars['failed_answer'] = True self.player.failed_answer = True self.player.answer_failed = 2 class GuessDots(Page): def is_displayed(self): return self.round_number == 1 and not self.participant.vars['failed_answer'] form_model = 'player' form_fields = ['dots_estimation'] def before_next_page(self): if not self.player.dots_estimation: self.participant.vars['failed_answer'] = True self.player.failed_answer = True self.player.answer_failed = 3 timer_text = 'Remaining Time:' timeout_seconds = Constants.cu_time class ValuationAnchor(Page): def vars_for_template(self): dots_low = self.player.dots_estimation - 5 dots_high = self.player.dots_estimation + 5 return { 'dots_low': dots_low, 'dots_high': dots_high } form_model = 'player' form_fields = ['confidence_anchor'] def is_displayed(self): return not self.participant.vars['failed_answer'] timer_text = 'Remaining Time:' timeout_seconds = Constants.cu_time def before_next_page(self): if self.player.confidence_anchor == 0: self.participant.vars['failed_answer'] = True self.player.failed_answer = True self.player.confidence_anchor = None self.player.answer_failed = 4 else: self.player.confidence_anchor = 100 - 5 * (20 - self.player.confidence_anchor + 1) class Wait(Page): pass timeout_seconds = 5 def before_next_page(self): self.player.set_payoff() class FailedComprehension(Page): def is_displayed(self): return self.player.failed_comprehension def app_after_this_page(self, upcoming_apps): return upcoming_apps[-1] class ComprehensionCheck(Page): def is_displayed(self): return self.round_number == 1 form_model = 'player' form_fields = [ 'qn_procedure', 'qn_confidence', ] def qn_procedure_error_message(self, value): if value != 1: self.player.qn_procedure_got_wrong = True self.player.failed_comprehension = True self.player.question_failed = 1 self.player.participant.vars['failed_comprehension_dots'] = True def qn_confidence_error_message(self, value): if value != 16: self.player.qn_confidence_got_wrong = True self.player.failed_comprehension = True self.player.question_failed = 2 self.player.participant.vars['failed_comprehension_dots'] = True page_sequence = [ InstructionsPart1, DotPattern1, ValuationNoAnchor, InstructionsPart2, DotPattern2, AnchorDots, GuessDots, ValuationAnchor, Wait ]