from otree.api import Currency as c, currency_range from . import models from ._builtin import Page, WaitPage from .models import Constants from mpl.config import * import time # variables for all templates # -------------------------------------------------------------------------------------------------------------------- def vars_for_all_templates(self): return { 'lottery_a_lo': c(Constants.lottery_a_lo), 'lottery_a_hi': c(Constants.lottery_a_hi), 'lottery_b_lo': c(Constants.lottery_b_lo), 'lottery_b_hi': c(Constants.lottery_b_hi) } # ******************************************************************************************************************** # # *** PAGE DECISION *** # # ******************************************************************************************************************** # class mid(Page): # form model # ---------------------------------------------------------------------------------------------------------------- form_model = 'player' def before_next_page(self): if (self.participant.vars['treatment'] == 2): self.player.page_pass_time = time.time() + 10 else: self.player.page_pass_time = time.time() + 30 class info_valuation(Page): # form model # ---------------------------------------------------------------------------------------------------------------- form_model = 'player' # form fields # ---------------------------------------------------------------------------------------------------------------- def get_form_fields(self): # unzip list of form_fields from list form_fields = [list(t) for t in zip(*self.participant.vars['mpl_choices_test'])][1] # provide form field associated with pagination or full list if Constants.one_choice_per_page: page = self.subsession.round_number return [form_fields[page - 1]] else: return form_fields # variables for template # ---------------------------------------------------------------------------------------------------------------- def vars_for_template(self): # specify info for progress bar total = len(self.participant.vars['mpl_choices']) page = self.subsession.round_number progress = page / total * 100 if Constants.one_choice_per_page: return { 'page': page, 'total': total, 'progress': progress, 'choices': [self.player.participant.vars['mpl_choices_test'][page - 1]] } else: return { 'choices': self.player.participant.vars['mpl_choices_test'] } # set player's payoff # ---------------------------------------------------------------------------------------------------------------- # set player's payoff # ---------------------------------------------------------------------------------------------------------------- def before_next_page(self): # unzip indices and form fields from list round_number = self.subsession.round_number form_fields = [list(t) for t in zip(*self.participant.vars['mpl_choices_test'])][1] indices = [list(t) for t in zip(*self.participant.vars['mpl_choices_test'])][0] index = indices[round_number - 1] self.player.page_pass_time = time.time() + 15 # if choices are displayed in tabular format # ------------------------------------------------------------------------------------------------------------ if not Constants.one_choice_per_page: # replace choices in for j, choice in zip(indices, form_fields): choice_i = getattr(self.player, choice) self.participant.vars['mpl_choices_made_test'][j - 1] = choice_i # set payoff self.player.set_payoffs() # determine consistency self.player.set_consistency() # set switching row self.player.set_switching_row() def is_displayed(self): return self.participant.vars['treatment'] == 1 class revelationa(Page): # form model # ---------------------------------------------------------------------------------------------------------------- form_model = 'player' def is_displayed(self): return ((self.participant.vars['treatment'] == 1) and (self.player.option_to_pay == "A")) def vars_for_template(self): # specify info for progress bar risk_5yr = self.player.participant.vars['brisk_five'] risk_life = self.player.participant.vars['brisk_life'] choice_to_pay = self.player.participant.vars['mpl_index_to_pay'] option = self.player.option_to_pay if option == 'A': payoff = self.player.value_to_pay else: payoff = Constants.lottery_b_hi return dict(risk_5yr=risk_5yr, risk_life=risk_life, choice_to_pay=choice_to_pay, option=option, payoff=payoff ) def error_message(self, values): if time.time() < self.player.page_pass_time: return "You cannot pass this page yet. Please review the information on the page and wait for at least 15 " \ "seconds before you continue" class revelationb(Page): # form model # ---------------------------------------------------------------------------------------------------------------- form_model = 'player' form_fields = ['brisk_five_test', 'brisk_life_test'] def is_displayed(self): return ((self.participant.vars['treatment'] == 1) and (self.player.option_to_pay == "B")) def vars_for_template(self): # specify info for progress bar risk_5yr = self.player.participant.vars['brisk_five'] risk_life = self.player.participant.vars['brisk_life'] choice_to_pay = self.player.participant.vars['mpl_index_to_pay'] option = self.player.option_to_pay if option == 'A': payoff = self.player.value_to_pay else: payoff = 10 return dict(risk_5yr=risk_5yr, risk_life=risk_life, choice_to_pay=choice_to_pay, option=option, payoff=payoff ) def error_message(self, values): if time.time() < self.player.page_pass_time: return "You cannot pass this page yet. Please review the information on the page and wait for at least 15 " \ "seconds before you continue" if self.player.brisk_five_test != self.participant.vars['brisk_five']: return "Please re-enter your estimated breast cancer risk from now to 5 years from now" if self.player.brisk_life_test != self.participant.vars['brisk_life']: return "Please re-enter your estimated breast cancer risk from now to 50 years from now" class control(Page): # form model # ---------------------------------------------------------------------------------------------------------------- form_model = 'player' def is_displayed(self): return self.participant.vars['treatment'] == 2 def error_message(self, values): if time.time() < self.player.page_pass_time: return "You cannot pass this page yet. Please review the information on the page and wait for at least 10 " \ "seconds before you continue" class treatment(Page): # form model # ---------------------------------------------------------------------------------------------------------------- form_model = 'player' form_fields = ['brisk_five_test', 'brisk_life_test'] def vars_for_template(self): risk_5yr = self.player.participant.vars['brisk_five'] risk_life = self.player.participant.vars['brisk_life'] return dict( risk_5yr=risk_5yr, risk_life=risk_life ) def is_displayed(self): return self.participant.vars['treatment'] == 3 def error_message(self, values): if time.time() < self.player.page_pass_time: return "You cannot pass this page yet. Please review the information on the page and wait for at least 30 " \ "seconds before you continue" if values["brisk_five_test"] != self.participant.vars['brisk_five']: return "Please re-enter your estimated breast cancer risk from now to 5 years from now" if values["brisk_life_test"] != self.participant.vars['brisk_life']: return "Please re-enter your estimated breast cancer risk from now to 50 years from now" # ******************************************************************************************************************** # # *** PAGE SEQUENCE *** # # ******************************************************************************************************************** # page_sequence = [mid, info_valuation, revelationa, revelationb, treatment, control]