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 def shared_vars(self): return { 'fee': c(self.session.config['participation_fee']), 'round': self.round_number + 6, 'exp_duration': self.session.config['exp_duration'], 'max_duration': self.session.config['max_duration'], 'task': self.player.task_identifier, 'treat': self.player.participant.vars['treat'], 'endowment': c(self.player.endowment), 'type': self.player.type, 'fixed_payment_per_question': c(self.session.config['fixed_payment_per_question']), 'total_fixed_payment': c(Constants.num_rounds * self.session.config['fixed_payment_per_question']), #8 baseline, 6 treatment 'num_questions': 12, 'id': self.participant.id_in_session, } current_lottery = [] #@method_decorator(csrf_exempt, name='dispatch') # class Welcome(Page): # def is_displayed(self): # return self.round_number == 1 # def vars_for_template(self): # return shared_vars(self) # class Consent(Page): # def is_displayed(self): # return self.round_number == 1 # def vars_for_template(self): # return shared_vars(self) # class Payment(Page): # def is_displayed(self): # return self.round_number == 1 # def vars_for_template(self): # return shared_vars(self) # class InstructionsPart1(Page): # def is_displayed(self): # return self.player.round_number == 1 # def vars_for_template(self): # return shared_vars(self) # class InstructionsPart2(Page): # form_model = 'player' # form_fields = ['qn_confidence'] # def is_displayed(self): # return self.player.round_number == 1 # def vars_for_template(self): # return { **shared_vars(self), # 'radio_amounts': list(zip([5*x for x in range(0,21)], list(range(1,22)))), # } # class InstructionsConfidence(Page): # def is_displayed(self): # return self.player.part_round_number == Constants.num_lotteries + 1 # def vars_for_template(self): # return shared_vars(self) # class FailedComprehension(Page): # def is_displayed(self): # return self.participant.vars['failed_comprehension'] and self.round_number == 1 # def vars_for_template(self): # return shared_vars(self) # class ComprehensionCheck(Page): # def is_displayed(self): # return self.round_number == 1 # def vars_for_template(self): # return { # **shared_vars(self), # 'radio_amounts': list(zip([5*x for x in range(0,21)], list(range(1,22)))), # } # form_model = 'player' # form_fields = [ # 'qn_lottery', # 'qn_list', # 'qn_confidence', # ] # def before_next_page(self): # if self.player.qn_lottery != 1: # self.player.qn_lottery_got_wrong = True # self.player.failed_comprehension = True # self.participant.vars['failed_comprehension'] = True # if self.player.qn_list != 1: # self.player.qn_list_got_wrong = True # self.player.failed_comprehension = True # self.participant.vars['failed_comprehension'] = True # if self.player.qn_confidence != 12: # self.player.qn_confidence_got_wrong = True # self.player.failed_comprehension = True # self.participant.vars['failed_comprehension'] = True class BeginStudy(Page): form_model = 'player' def is_displayed(self): return not self.participant.vars['failed_comprehension'] and self.round_number == 1 def vars_for_template(self): return shared_vars(self) class ElicitListExample(Page): def is_displayed(self): return not self.participant.vars['failed_comprehension'] and self.round_number == 1 and (self.player.is_load or self.player.is_complex_prob) def vars_for_template(self): return { **shared_vars(self), } def before_next_page(self): self.player.treat_group = self.player.participant.vars['treat'] class ElicitList(Page): #timeout_seconds = 18 def is_displayed(self): return not self.participant.vars['failed_comprehension'] and not self.player.is_load def vars_for_template(self): global current_lottery current_lottery = self.player.current_lottery() return {'abs_lv': abs(self.player.lottery_amount), 'current_lottery': current_lottery, **shared_vars(self), } form_model = 'player' form_fields = ['switching_point'] def before_next_page(self): self.player.set_switching_point_and_indicator() self.player.set_payoffs() class ElicitListLoad(Page): #timeout_seconds = 18 def is_displayed(self): return not self.participant.vars['failed_comprehension'] and self.player.is_load def vars_for_template(self): global current_lottery current_lottery = self.player.current_lottery() return {'abs_lv': abs(self.player.lottery_amount), 'current_lottery': current_lottery, **shared_vars(self), } form_model = 'player' form_fields = ['switching_point', 'load_sum'] def before_next_page(self): self.player.set_switching_point_and_indicator() # if self.timeout_happened: # self.player.timed_out = True #self.player.set_payoffs() class LoadSumEntry(Page): def is_displayed(self): return not self.participant.vars['failed_comprehension'] and self.player.is_load def vars_for_template(self): return shared_vars(self) form_model = 'player' form_fields = ['load_guess'] def before_next_page(self): if self.player.load_guess == self.player.load_sum: self.player.load_correct = 1 if self.player.round_number == 1: self.player.load_num_correct = 1 else: self.player.load_num_correct = self.participant.vars['load_num_correct'] + self.player.load_correct else: self.player.load_correct = 0 if self.player.round_number == 1: self.player.load_num_correct = 0 else: self.player.load_num_correct = self.participant.vars['load_num_correct'] + self.player.load_correct self.participant.vars['load_num_correct'] = self.player.load_num_correct self.player.set_payoffs() class PriceListStandard(Page): def is_displayed(self): return not self.participant.vars['failed_comprehension'] def vars_for_template(self): global current_lottery current_lottery = self.player.current_lottery() return { 'table_length1': self.player.table_length1(), 'current_lottery': current_lottery, **shared_vars(self), 'roclrangestart': self.player.rocl_range()[0], 'roclrangeend': self.player.rocl_range()[1], #for debugging 'list': self.player.participant.vars['gain_list_sequence'], } form_model = 'player' form_fields = ['switching_point'] def before_next_page(self): self.player.set_switching_point_and_indicator() self.player.set_payoffs() class Valuation(Page): form_model = 'player' form_fields = ['confidence'] def vars_for_template(self): bounds = self.player.range_bounds() window_size = 0.5 if abs(self.player.switching_point)>=window_size and self.player.switching_point + window_size <= abs(self.player.lottery_amount): bound_DE = [abs(self.player.switching_point+window_size), abs(self.player.switching_point-window_size)] elif self.player.lottery_amount > 0 and self.player.switching_point < window_size: bound_DE = [0, abs(self.player.switching_point + window_size)] elif self.player.lottery_amount > 0 and self.player.switching_point+window_size > self.player.lottery_amount: bound_DE = [self.player.switching_point - window_size, self.player.lottery_amount] return {**shared_vars(self), 'val_up_DE': '%.2f' % round(max(bound_DE),2), 'val_low_DE': '%.2f' % round(min(bound_DE),2), 'switching_point': '%.2f' % abs(self.player.switching_point), 'current_lottery': current_lottery, 'val_up': int(self.player.switching_point), 'absval_up': abs(int(self.player.switching_point)), 'val_low': int(self.player.switching_point - 1), 'absval_low': abs(int(self.player.switching_point - 1)), 'roclrangestart': self.player.rocl_range()[0], 'roclrangeend': self.player.rocl_range()[1], 'lowbound': bounds[0], 'highbound': bounds[1], 'radio_amounts': list(zip([5*x for x in range(0,21)], list(range(1,22)))), } def is_displayed(self): return not self.participant.vars['failed_comprehension'] def before_next_page(self): if self.round_number == Constants.num_rounds: self.player.payoff += Constants.num_rounds * self.session.config['fixed_round_bonus'] class Wait(Page): def is_displayed(self): return not self.participant.vars['failed_comprehension'] or self.round_number == 1 def before_next_page(self): self.player.set_treatment() timeout_seconds = 2 class Timeout(Page): form_model = 'player' def is_displayed(self): return not self.participant.vars['failed_comprehension'] and self.player.timed_out def vars_for_template(self): return shared_vars(self) class BetaPage(Page): def is_displayed(self): return not self.participant.vars['failed_comprehension'] form_model = 'player' form_fields = ['task_type_beta'] def before_next_page(self): self.player.set_treatment_beta() page_sequence = [ #Welcome, #Consent, #InstructionsPart1, #InstructionsPart2, #Payment, #ComprehensionCheck, #FailedComprehension, Wait, #BetaPage, ElicitListExample, ElicitList, ElicitListLoad, Valuation, LoadSumEntry, #Timeout, #PriceListStandard, ]