#1 by txb000
I cannot manage to set the timer for 20 secs in the waitpage, do not really know how to solve, can anyone help me,
from otree.api import models, BaseConstants, BasePlayer, BaseSubsession, BaseGroup, Page, WaitPage
import random
import time
class Constants(BaseConstants):
name_in_url = 'contest_game'
players_per_group = 2
num_rounds = 5
WINNER_PAYOFF = 240
LOSER_PAYOFF = 120
class Player(BasePlayer):
endowment = models.IntegerField(initial=120)
cost = models.FloatField()
investment = models.IntegerField(min=0, max=120)
payoff_new = models.CurrencyField()
class Subsession(BaseSubsession):
def creating_session(self):
self.group_randomly(fixed_id_in_group=True)
for group in self.get_groups():
players = group.get_players()
for player in players:
player.cost = random.choice([0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5])
class Group(BaseGroup):
arrival_time = models.FloatField()
investment_p1 = models.IntegerField()
investment_p2 = models.IntegerField()
def calculate_payoffs(self):
p1, p2 = self.get_players()
total_investment = self.investment_p1 + self.investment_p2
if total_investment > 0:
p1_likelihood = self.investment_p1 / total_investment
p2_likelihood = self.investment_p2 / total_investment
winner = p1 if p1_likelihood > p2_likelihood else p2
else:
winner = random.choice([p1, p2])
if winner == p1:
p1.payoff_new = Constants.WINNER_PAYOFF - p1.cost * p1.investment
p2.payoff_new = Constants.LOSER_PAYOFF - p2.cost * p2.investment
else:
p1.payoff_new = Constants.LOSER_PAYOFF - p1.cost * p1.investment
p2.payoff_new = Constants.WINNER_PAYOFF - p2.cost * p2.investment
class Results(Page):
@staticmethod
def vars_for_template(player):
return {
'player_payoff': player.payoff_new
}
class InvestmentDecision(Page):
form_model = 'player'
form_fields = ['investment']
@staticmethod
def vars_for_template(player):
player.cost = random.choice([0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5])
return {
'player_cost': player.cost,
}
@staticmethod
def before_next_page(player, timeout_happened):
group = player.group
if player.id_in_group == 1:
group.investment_p1 = player.investment
elif player.id_in_group == 2:
group.investment_p2 = player.investment
class WaitForSecondParticipant(WaitPage):
wait_for_all_groups = True
@staticmethod
def after_all_players_arrive(group):
group.arrival_time = time.time()
@staticmethod
def group_by_arrival_time_method(subsession, waiting_players):
player = waiting_players[0]
group = player.group
if time.time() - group.arrival_time > 20:
return waiting_players
@staticmethod
def before_next_page(group, timeout_happened):
if timeout_happened:
group.calculate_payoffs()
page_sequence = [InvestmentDecision, WaitForSecondParticipant, Results]