from ._builtin import Page, WaitPage from .models import Constants from operator import attrgetter import datetime class DisplayPlayer(Page): def before_next_page(self): self.participant.vars['id'] = self.player.id_in_group class Send(Page): """This page is only for P1 P1 sends amount (all, some, or none) to P2 This amount is tripled by experimenter, i.e if sent amount by P1 is 5, amount received by P2 is 15""" form_model = 'group' form_fields = ['sent_amount'] def before_next_page(self): self.session.vars['transactions'].append({'sender': self.group.get_player_by_id(1).participant.vars['names'], 'receiver': self.group.get_player_by_id(2).participant.vars['names'], 'amount': self.group.sent_amount, 'time': datetime.datetime.now()}) def is_displayed(self): return self.player.id_in_group == 1 class SendBackWaitPage(WaitPage): pass class SendBack(Page): """This page is only for P2 P2 sends back some amount (of the tripled amount received) to P1""" form_model = 'group' form_fields = ['sent_back_amount'] def is_displayed(self): return self.player.id_in_group == 2 def vars_for_template(self): tripled_amount = self.group.sent_amount * Constants.multiplier return { 'tripled_amount': tripled_amount, 'prompt': 'Please enter an amount from 0 to {}'.format(tripled_amount), 'transactions': self.session.vars['transactions'] } def before_next_page(self): self.session.vars['transactions'].append({'sender': self.group.get_player_by_id(2).participant.vars['names'], 'receiver': self.group.get_player_by_id(1).participant.vars['names'], 'amount': self.group.sent_back_amount, 'time': datetime.datetime.now()}) def sent_back_amount_max(self): return self.group.sent_amount * Constants.multiplier class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): self.group.set_payoffs() class Results(Page): """This page displays the earnings of each player""" def before_next_page(self): try: self.participant.vars['payoffs'].append({'round': self.round_number, 'payoff': self.player.payoff}) except: self.participant.vars['payoffs'] = [{'round': self.round_number, 'payoff': self.player.payoff}] def vars_for_template(self): return { 'tripled_amount': self.group.sent_amount * Constants.multiplier } class Transparency(Page): def vars_for_template(self): return { 'transactions': self.session.vars['transactions'] } class WelcomeWaitPage(WaitPage): title_text = "Please wait" body_text = "Waiting for the other participant." group_by_arrival_time = True page_sequence = [ WelcomeWaitPage, DisplayPlayer, Send, SendBackWaitPage, SendBack, ResultsWaitPage, Results, Transparency, ]