from otree.api import * from part1 import ( Constants as Part1Constants, live_roll, set_automatic_report, set_payoff_for_this_part, P4 ) c = Currency doc = """ Your app description """ class Constants(Part1Constants): name_in_url = 'part4' max_seconds_on_page = dict(next_part_intro=90, dice_page=20, results=120) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): dropout = models.BooleanField(initial=False) timeout = models.BooleanField(initial=False) rolled = models.BooleanField(initial=False) num = models.IntegerField(initial=0) report = models.IntegerField( label="Please report the result of the die roll here:", min=Constants.dice[0], max=Constants.dice[1] ) round_to_pay = models.IntegerField() # PAGES class NextPartIntro(Page): timeout_seconds = Constants.max_seconds_on_page['next_part_intro'] timer_text = Constants.timer_text @staticmethod def vars_for_template(player: Player): const = Constants _vars = const.vars_for_templates.copy() _vars.update(earnings_ex_1=const.exchange_rate_ex_1.to_real_world_currency(player.session), part_n=4) return _vars @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def before_next_page(player: Player, timeout_happened): if timeout_happened: player.dropout = True player.participant.vars['dropout'] = True @staticmethod def app_after_this_page(player: Player, upcoming_apps): if player.participant.vars.get('dropout'): return upcoming_apps[-1] class DiceRoll(P4): template_name = 'part1/templates/part1/P4.html' @staticmethod def vars_for_template(player: Player): const = Constants _vars = const.vars_for_templates.copy() _vars.update(earnings_ex_1=const.exchange_rate_ex_1.to_real_world_currency(player.session), part_n=4) return _vars @staticmethod def before_next_page(player: Player, timeout_happened): set_automatic_report(player, timeout_happened) set_payoff_for_this_part(player, 4) class Results(Page): timeout_seconds = Constants.max_seconds_on_page['results'] timer_text = Constants.timer_text @staticmethod def vars_for_template(player: Player): participant = player.participant previous_earnings = participant.vars.get('payoff_part_1', 0) + \ participant.vars.get('payoff_part_2', 0) + participant.vars.get('payoff_part_3', 0) participant.payoff = previous_earnings + participant.vars['payoff_part_4'] const = Constants _vars = const.vars_for_templates.copy() _vars.update( part_n=4, earnings_ex_1=const.exchange_rate_ex_1.to_real_world_currency(player.session), report=player.participant.vars['payoff_part_4'], previous_earnings=previous_earnings ) return _vars @staticmethod def is_displayed(player: Player): return player.round_number == Constants.num_rounds @staticmethod def before_next_page(player: Player, timeout_happened): if timeout_happened: player.dropout = True player.participant.vars['dropout'] = True @staticmethod def app_after_this_page(player: Player, upcoming_apps): if player.participant.vars.get('dropout'): return upcoming_apps[-1] page_sequence = [NextPartIntro, DiceRoll, Results]