from . import models from ._builtin import Page, WaitPage from otree.api import Currency as c, currency_range from .models import Constants import random def vars_for_all_templates(self): return { 'maximum_price': self.session.config['maximum_price'], 'marginal_cost': self.session.config['marginal_cost'], } class Introduction(Page): timeout_seconds = 45 def is_displayed(self): return self.subsession.round_number == 1 class Decide(Page): timeout_seconds = 30 form_model = models.Player form_fields = ['price'] def price_max(self): return self.session.config['maximum_price'] def price_min(self): return self.session.config['marginal_cost'] def before_next_page(self): if self.timeout_happened: if self.round_number != 1: previous_round = self.player.in_round(self.round_number - 1) print("Going to best response: {}".format(previous_round.id_in_group)) self.player.price = self.group.best_response(previous_round.price, previous_round.is_a_winner) else: self.player.price = random.randint(self.price_min(), self.price_max()) self.session.vars["Player {}".format(self.player.id_in_group)] = self.player.price class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): self.group.set_payoffs() # self.group.average_per_player() class Results(Page): timeout_seconds = 15 def vars_for_template(self): return { 'table': [ ('Your price', self.player.price), ('Lowest price', min( p.price for p in self.group.get_players())), ('Was your product sold?', 'Yes' if self.player.is_a_winner else 'No'), ('Your profit', self.player.payoff), ] } class FinalResults(Page): def is_displayed(self): return self.subsession.round_number == Constants.num_rounds def vars_for_template(self): group = self.group player_data = [] player_average = [float(g.average_price) for g in group.in_all_rounds()] player_data.append({ 'name':'Average Price', 'data':player_average }) #for player in group.get_players(): # player_units = [p.units for p in player.in_all_rounds()] # player_data.append({ # 'name':'Units Produced for Player %s' % str(player.id_in_group), # 'data':player_units # }) return { 'price':player_data, 'categories': list(range(1, Constants.num_rounds, 1)) } page_sequence = [Introduction, Decide, ResultsWaitPage, Results, FinalResults]