from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants class instructions(Page): def is_displayed(self): return self.round_number == 1 class reverse(Page): def is_displayed(self): return self.round_number == 5 class Shock(Page): form_model = 'group' form_fields = ['sent_amount'] def is_displayed(self): return (self.player.id_in_group == 1 and self.round_number == 1) or (self.player.id_in_group == 2 and self.round_number == 5) def vars_for_template(self): participant = self.participant return { 'redemption_code': participant.label, } class Punishment(Page): form_model = 'group' form_fields = ['sent_amount', 'amount_demanded'] def error_message(self, values): print('values is', values) if values["amount_demanded"] > 3 * values["sent_amount"]: return 'The amount you are requesting is more than what P2(the computer) will receive ' def is_displayed(self): return (self.player.id_in_group == 1 and self.round_number == 2) or (self.player.id_in_group == 2 and self.round_number == 6) def vars_for_template(self): participant = self.participant return { 'redemption_code': participant.label, } class Basic(Page): form_model = 'group' form_fields = ['sent_amount'] def is_displayed(self): return (self.player.id_in_group == 1 and self.round_number == 3) or (self.player.id_in_group == 2 and self.round_number == 7) def vars_for_template(self): participant = self.participant return { 'redemption_code': participant.label, } class MyWaitPage(WaitPage): group_by_arrival_time = True def is_displayed(self): return self.round_number == 1 class SendBackRandom(Page): timeout_seconds = 0 form_model = 'group' form_fields = ['sent_back_amount'] def before_next_page(self): if self.timeout_happened: self.group.sent_back_amount = self.group.sent_amount * self.session.vars['random_return'] * self.session.vars[ 'computer_selects'] def is_displayed(self): return (self.player.id_in_group == 2 and self.round_number == 1) or (self.player.id_in_group == 1 and self.round_number == 5) def vars_for_template(self): participant = self.participant return { 'random_amount': self.group.sent_amount * self.session.vars['random_return'], 'redemption_code': participant.label #'less_endowment': Constants.endowment - self.group.sent_amount } def sent_back_amount_choices(self): return currency_range( c(0), self.group.sent_amount * Constants.multiplication_factor, c(1) ) class SendBackPunishment(Page): timeout_seconds = 0 form_model = 'group' form_fields = ['sent_back_amount'] def before_next_page(self): if self.timeout_happened: self.group.sent_back_amount = self.group.sent_amount * Constants.multiplication_factor * self.session.vars['computer_selects'] def is_displayed(self): return (self.player.id_in_group == 2 and self.round_number == 2) or (self.player.id_in_group == 1 and self.round_number == 6) def vars_for_template(self): participant = self.participant return { 'tripled_amount': self.group.sent_amount * Constants.multiplication_factor, 'less_endowment': Constants.endowment - self.group.sent_amount, 'redemption_code': participant.label, 'comp_sb': self.group.sent_amount * Constants.multiplication_factor * self.session.vars['computer_selects'] } def sent_back_amount_choices(self): return currency_range( c(0), self.group.sent_amount * Constants.multiplication_factor, c(1) ) ####################################### class Fine45(Page): form_model = 'group' form_fields = ['sent_amount', 'amount_demanded'] def error_message(self, values): print('values is', values) if values["amount_demanded"] > 3 * values["sent_amount"]: return 'The amount you are requesting is more than what P2(the computer) will receive ' def is_displayed(self): return (self.player.id_in_group == 1 and self.round_number == 4) or (self.player.id_in_group == 2 and self.round_number == 8) def vars_for_template(self): participant = self.participant return { 'redemption_code': participant.label, } class Fineback(Page): timeout_seconds = 0 form_model = 'group' form_fields = ['sent_back_amount'] def before_next_page(self): if self.timeout_happened: self.group.sent_back_amount = self.group.sent_amount * Constants.multiplication_factor * self.session.vars['computer_selects'] def is_displayed(self): return (self.player.id_in_group == 2 and self.round_number == 4) or (self.player.id_in_group == 1 and self.round_number == 8) def vars_for_template(self): participant = self.participant return { 'tripled_amount': self.group.sent_amount * Constants.multiplication_factor, 'less_endowment': Constants.endowment - self.group.sent_amount, 'redemption_code': participant.label, 'comp_sb': self.group.sent_amount * Constants.multiplication_factor * self.session.vars['computer_selects'] } def sent_back_amount_choices(self): return currency_range( c(0), self.group.sent_amount * Constants.multiplication_factor, c(1) ) ###################################### class SendBack(Page): timeout_seconds = 0 form_model = 'group' form_fields = ['sent_back_amount'] def before_next_page(self): if self.timeout_happened: self.group.sent_back_amount = self.group.sent_amount * Constants.multiplication_factor * self.session.vars[ 'computer_selects'] def is_displayed(self): return (self.player.id_in_group == 2 and self.round_number == 3) or (self.player.id_in_group == 1 and self.round_number == 7) def vars_for_template(self): participant = self.participant return { 'tripled_amount': self.group.sent_amount * Constants.multiplication_factor, 'less_endowment': Constants.endowment - self.group.sent_amount, 'redemption_code': participant.label } def sent_back_amount_choices(self): return currency_range( c(0), self.group.sent_amount * Constants.multiplication_factor, c(1) ) class WaitForP1(WaitPage): pass #title_text = "Waiting for your partner to make a decision" #body_text = "Once they have made a decision, this page will disappear and you will be asked to make a different decision" class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): group = self.group if self.round_number == 1 or self.round_number == 5: p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p1.payoff = Constants.endowment - group.sent_amount + group.sent_amount * self.session.vars['random_return'] * self.session.vars['computer_selects'] p2.payoff = Constants.endowment + group.sent_amount * self.session.vars['random_return'] - group.sent_amount* self.session.vars['random_return'] * self.session.vars['computer_selects'] else: p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p1.payoff = Constants.endowment - group.sent_amount + group.sent_amount * Constants.multiplication_factor * self.session.vars['computer_selects'] p2.payoff = Constants.endowment + group.sent_amount * Constants.multiplication_factor - group.sent_amount * Constants.multiplication_factor * self.session.vars['computer_selects'] def vars_for_template(self): participant = self.participant return { 'tripled_amount': self.group.sent_amount * Constants.multiplication_factor, 'less_endowment': Constants.endowment - self.group.sent_amount, 'comp_sb': self.group.sent_amount * Constants.multiplication_factor * self.session.vars[ 'computer_selects'], 'random_sb': self.group.sent_amount * self.session.vars['random_return'] * self.session.vars[ 'computer_selects'], 'redemption_code': participant.label } class Results(Page): def is_displayed(self): return self.round_number == 2 or self.round_number == 3 or self.round_number == 4 or self.round_number == 6 or self.round_number == 7 or self.round_number == 8 def vars_for_template(self): participant = self.participant return { 'tripled_amount': self.group.sent_amount * Constants.multiplication_factor, 'less_endowment': Constants.endowment - self.group.sent_amount, 'comp_sb': self.group.sent_amount * Constants.multiplication_factor * self.session.vars['computer_selects'], 'random_sb': self.group.sent_amount * self.session.vars['random_return'] * self.session.vars['computer_selects'], 'redemption_code': participant.label } class Shockresults(Page): def is_displayed(self): return self.round_number == 3 or self.round_number == 5 def vars_for_template(self): participant = self.participant return { 'tripled_amount': self.group.sent_amount * Constants.multiplication_factor, 'less_endowment': Constants.endowment - self.group.sent_amount, 'comp_sb': self.group.sent_amount * Constants.multiplication_factor * self.session.vars['computer_selects'], 'random_sb': self.group.sent_amount * self.session.vars['random_return'] * self.session.vars[ 'computer_selects'], 'redemption_code': participant.label } class Everypage(Page): def is_displayed(self): return (self.player.id_in_group == 1 and self.round_number == 1) or (self.player.id_in_group == 1 and self.round_number == 2) or (self.player.id_in_group == 1 and self.round_number == 3) or (self.player.id_in_group == 2 and self.round_number == 5) or (self.player.id_in_group == 2 and self.round_number == 6) or (self.player.id_in_group == 2 and self.round_number == 7) class Everypage2(Page): def is_displayed(self): return (self.player.id_in_group == 2 and self.round_number == 1) or (self.player.id_in_group == 2 and self.round_number == 2) or (self.player.id_in_group == 2 and self.round_number == 3) or (self.player.id_in_group == 1 and self.round_number == 5) or (self.player.id_in_group == 1 and self.round_number == 6) or (self.player.id_in_group == 1 and self.round_number == 7) class Lastpage(Page): def is_displayed(self): return (self.player.id_in_group == 1 and self.round_number == 4) or (self.player.id_in_group == 2 and self.round_number == 8) class Lastpage2(Page): def is_displayed(self): return (self.player.id_in_group == 2 and self.round_number == 4) or (self.player.id_in_group == 1 and self.round_number == 8) page_sequence = [ MyWaitPage, instructions, reverse, Shock, Punishment, Basic, Fine45, #Send, WaitForP1, SendBackRandom, SendBackPunishment, SendBack, Fineback, ResultsWaitPage, #Results, #Shockresults, Everypage, Lastpage, Everypage2, Lastpage2, ]