from otree.api import Currency as c, currency_range from . import models from ._builtin import Page, WaitPage from .models import Constants import time import random class Welcome(Page): def before_next_page(self): # user has 6 minutes to complete as many pages as possible self.participant.vars['expiry_timestamp'] = time.time() + Constants.PLS_time * 60 class PLS(Page): def get_timeout_seconds(self): return self.participant.vars['expiry_timestamp'] - time.time() def before_next_page(self): if self.timeout_happened: self.player.leader_invest1 = 0 self.player.leader_invest2 = 0 self.player.leader_invest3 = 0 class Consent(Page): form_model = 'player' form_fields = ['accept'] def before_next_page(self): self.player.participant.vars['accept'] = self.player.accept if self.timeout_happened: self.player.leader_invest1 = 0 self.player.leader_invest2 = 0 self.player.leader_invest3 = 0 class Overview(Page): def is_displayed(self): return self.player.accept class InstructionsLink(Page): def is_displayed(self): return self.player.accept class EndInstructions(Page): def is_displayed(self): return self.player.accept # class Instructions1(Page): # def is_displayed(self): # return self.player.accept # class Instructions2(Page): # def is_displayed(self): # return self.player.accept # # # class Instructions2a(Page): # def is_displayed(self): # return self.player.accept # # # class Instructions2b(Page): # def is_displayed(self): # return self.player.accept # # # class Instructions3(Page): # def is_displayed(self): # return self.player.accept # # # class Instructions4(Page): # def is_displayed(self): # return self.player.accept # # # class Instructions4a(Page): # def is_displayed(self): # return self.player.accept # class Instructions5(Page): # def is_displayed(self): # return self.player.accept class PracticeQuestions(Page): def is_displayed(self): return self.player.accept form_model = 'player' form_fields = ['q1'] class PracticeQuestions2(Page): def is_displayed(self): return self.player.accept form_model = 'player' form_fields = ['q2'] class PracticeQuestions3(Page): def is_displayed(self): return self.player.accept form_model = 'player' form_fields = ['q3'] class PracticeQuestions4(Page): def is_displayed(self): return self.player.accept form_model = 'player' form_fields = ['q4'] class PracticeQuestions5(Page): def is_displayed(self): return self.player.accept form_model = 'player' form_fields = ['q5'] class PracticeQuestions6(Page): def is_displayed(self): return self.player.accept form_model = 'player' form_fields = ['q6i'] class PracticeQuestions7(Page): def is_displayed(self): return self.player.accept form_model = 'player' form_fields = ['q6ii'] class EndQuiz(Page): def is_displayed(self): return self.player.accept class InvestDecision(Page): def is_displayed(self): return self.player.accept def before_next_page(self): self.player.generate_random_nums() class Invest1(Page): def is_displayed(self): return self.player.accept form_model = 'player' form_fields = ['ind_invest1', 'ind_invest2', 'ind_invest3'] def get_form_fields(self): fields = self.form_fields random.shuffle(fields) return fields # def get_form_fields(self): # if self.player.random_num_x == 1: # return ['ind_invest3', 'ind_invest3'] # elif self.player.random_num_x == 2: # return ['ind_invest2', 'ind_invest2'] # else: # return ['ind_invest1', 'ind_invest1'] class EndStage1(Page): def is_displayed(self): return self.player.accept class LeaderSelection(Page): def is_displayed(self): return self.player.accept form_model = 'player' form_fields = ['Election'] def before_next_page(self): self.participant.vars['expiry_timestamp'] = time.time() + Constants.LeaderDecision_time * 60 class LeaderDecision(Page): def is_displayed(self): return self.player.accept def get_timeout_seconds(self): return self.participant.vars['expiry_timestamp'] - time.time() def before_next_page(self): if self.timeout_happened: self.player.leader_invest1 = 0 self.player.leader_invest2 = 0 self.player.leader_invest3 = 0 class Leader1(Page): def is_displayed(self): return self.player.accept form_model = 'player' form_fields = ['leader_invest1', 'leader_invest2', 'leader_invest3'] def get_form_fields(self): fields = self.form_fields random.shuffle(fields) return fields class CountingInstructions(Page): def is_displayed(self): return self.round_number == Constants.num_rounds and self.player.accept # def before_next_page(self): # self.player.participant.vars['charity'] = self.group.charity class WorkPage(Page): def is_displayed(self): return self.player.accept def before_next_page(self): self.player.solved_tables = self.player.num_tasks_correct if self.player.solved_tables >= Constants.payment_threshold: self.player.CompletedTenTables = True else: self.player.CompletedTenTables = False if not self.player.CompletedTenTables: self.player.payoff = c(0) # select the x to be paid if self.player.random_num_x == 1: self.player.ind_invest_chosen = self.player.ind_invest1 elif self.player.random_num_x == 2: self.player.ind_invest_chosen = self.player.ind_invest2 else: self.player.ind_invest_chosen = self.player.ind_invest3 # safe payoff if self.player.CompletedTenTables: self.player.payoff = c((100 - self.player.ind_invest_chosen) * Constants.payment / 100) # add risky payment if random_num_coin == 1 (heads) if self.player.random_num_x == 1 and self.player.random_num_coin == 2 and self.player.CompletedTenTables: self.player.payoff += c(self.player.ind_invest1 * Constants.payment * Constants.x1 / 100) elif self.player.random_num_x == 2 and self.player.random_num_coin == 2 and self.player.CompletedTenTables: self.player.payoff += c(self.player.ind_invest2 * Constants.payment * Constants.x2 / 100) elif self.player.random_num_x == 3 and self.player.random_num_coin == 2 and self.player.CompletedTenTables: self.player.payoff += c(self.player.ind_invest3 * Constants.payment * Constants.x3 / 100) self.player.participant.vars['solved_tables'] = self.player.solved_tables self.player.participant.vars['task_payoff'] = c(self.player.payoff) self.player.participant.vars['coin_outcome'] = self.player.random_num_coin self.player.participant.vars['random_num_x'] = self.player.random_num_x self.player.participant.vars['ind_invest_chosen'] = self.player.ind_invest_chosen # self.player.participant.vars['random_num_leader'] = self.player.random_num_leader class AdditionalDecision(Page): def is_displayed(self): return self.player.accept form_model = 'player' form_fields = ['AdditionalTables'] class WorkPageAdditional(Page): def is_displayed(self): return self.player.accept def before_next_page(self): self.player.solved_additional_tables = \ self.player.num_tasks_correct - self.player.solved_tables self.player.participant.vars['solved_additional_tables'] = self.player.solved_additional_tables form_model = 'player' form_fields = ['finished'] class EndStage3(Page): def is_displayed(self): return self.player.accept class AdditionalWaitPage(WaitPage): def is_displayed(self): return self.player.accept def after_all_players_arrive(self): self.group.select_charity() self.group.group_total() self.group.select_leader() self.group.implement_leader_investment() # self.group.donation_outcome() class SurveyP1(Page): def is_displayed(self): return self.player.accept def before_next_page(self): self.participant.vars['group_tables'] = self.group.group_tables self.player.participant.vars['group_income'] = self.group.group_income self.participant.vars['donation'] = self.group.donation self.participant.vars['Election'] = self.player.Election self.participant.vars['IsLeader'] = self.player.IsLeader self.participant.vars['charity'] = self.group.charity self.participant.vars['leader_risky1'] = self.group.leader_risky1 self.participant.vars['leader_risky2'] = self.group.leader_risky2 self.participant.vars['leader_risky3'] = self.group.leader_risky3 self.participant.vars['leader_coin'] = self.group.leader_coin self.participant.vars['leader_x'] = self.group.leader_x page_sequence = [ Welcome, PLS, Consent, Overview, InstructionsLink, EndInstructions, PracticeQuestions, PracticeQuestions2, PracticeQuestions3, PracticeQuestions4, PracticeQuestions5, PracticeQuestions6, PracticeQuestions7, EndQuiz, InvestDecision, Invest1, EndStage1, LeaderSelection, LeaderDecision, Leader1, CountingInstructions, WorkPage, AdditionalDecision, WorkPageAdditional, EndStage3, AdditionalWaitPage, SurveyP1 ] # page_sequence = [ # Welcome, # PLS, # Consent, # Overview, # InstructionsLink, # EndInstructions, # PracticeQuestions7, # EndQuiz, # InvestDecision, # Invest1, # EndStage1, # LeaderSelection, # LeaderDecision, # Leader1, # CountingInstructions, # WorkPage, # AdditionalDecision, # WorkPageAdditional, # EndStage3, # AdditionalWaitPage, # SurveyP1 # ]