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 Shock(Page): form_model = 'group' form_fields = ['sent_amount'] def is_displayed(self): return self.player.id_in_group == 1 and self.round_number == 2 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 will receive ' def is_displayed(self): return self.player.id_in_group == 1 and self.round_number == 1 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 def vars_for_template(self): participant = self.participant return { 'redemption_code': participant.label, } class SendBackRandom(Page): form_model = 'group' form_fields = ['sent_back_amount'] def is_displayed(self): return self.player.id_in_group == 2 and self.round_number == 2 def vars_for_template(self): participant = self.participant return { 'random_amount': self.group.sent_amount * Constants.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.random_return, c(1) ) class SendBackPunishment(Page): form_model = 'group' form_fields = ['sent_back_amount'] def is_displayed(self): return self.player.id_in_group == 2 and self.round_number == 1 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 SendBack(Page): form_model = 'group' form_fields = ['sent_back_amount'] def is_displayed(self): return self.player.id_in_group == 2 and self.round_number == 3 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) ) #def sent_back_amount_choices(self): # return currency_range( # c(0), # self.group.sent_amount * Constants.multiplication_factor, # c(1) #) #def sent_back_amount_choices(self): #return range(min=0, max=300) 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 == 2: p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p1.payoff = Constants.endowment - group.sent_amount + group.sent_back_amount p2.payoff = Constants.endowment + group.sent_amount * Constants.random_return - group.sent_back_amount else: p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p1.payoff = Constants.endowment - group.sent_amount + group.sent_back_amount p2.payoff = Constants.endowment + group.sent_amount * Constants.multiplication_factor - group.sent_back_amount #class MyWaitPage(WaitPage): # group_by_arrival_time = True # def is_displayed(self): # return self.round_number == 1 class Results(Page): def is_displayed(self): return self.round_number == 1 or self.round_number == 3 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, } class final(Page): def is_displayed(self): return self.round_number == 3 def vars_for_template(self): return{ 'table': self.player.summary_table() } class Shockresults(Page): def is_displayed(self): return self.round_number == 2 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, 'random_return': self.group.sent_amount * Constants.random_return, } page_sequence = [ #MyWaitPage, instructions, Shock, Punishment, Basic, #Send, WaitForP1, SendBackRandom, SendBackPunishment, SendBack, ResultsWaitPage, Results, Shockresults, final ]