from otree.api import * class C(BaseConstants): NAME_IN_URL = 'treatment_1.1' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 INSTRUCTIONS_TEMPLATE = 'Instructions_Pages/instructions_round1.html' ENDOWMENT = 100 TXN_COST = 0.05 PRICE = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): initial_bid_quantity = models.IntegerField( min=0, max=100, label="Initial Bid for Good A" ) second_bid = models.IntegerField( min=0, label="Second Bid for Good A" ) # FUNCTIONS def calculate_money_balance(player): beginning_fiat_balance = C.ENDOWMENT return beginning_fiat_balance def second_bid_max(player): import math fiat_balance = C.ENDOWMENT max_quantity = math.floor((fiat_balance) / (C.PRICE + C.TXN_COST)) return max_quantity # PAGES class Introduction(Page): @staticmethod def before_next_page(player, timeout_happened): player.initial_bid_quantity = None player.second_bid = None class Bid1(Page): form_model = 'player' form_fields = ['initial_bid_quantity'] @staticmethod def vars_for_template(player): fiat_money_balance = calculate_money_balance(player) fiat_money_balance = round(float(fiat_money_balance), 2) return dict(fiat_money_balance=fiat_money_balance) class BidWaitPage(WaitPage): pass class Bid2(Page): form_model = 'player' form_fields = ['second_bid'] @staticmethod def vars_for_template(player): import math money_balance_fiat = calculate_money_balance(player) money_balance_private = 0 maximum_quantity = ((money_balance_fiat) / (C.PRICE + C.TXN_COST)) maximum_quantity = math.floor(maximum_quantity) if maximum_quantity <= 0: maximum_quantity = 0 elif maximum_quantity >= 100: maximum_quantity = 100 else: maximum_quantity = maximum_quantity money_balance_fiat = round(float(money_balance_fiat), 2) money_balance_private = round(float(money_balance_private), 2) return dict(maximum_quantity=maximum_quantity, money_balance_fiat=money_balance_fiat, money_balance_private=money_balance_private) class ResultsWaitPage(WaitPage): pass class Results(Page): @staticmethod def vars_for_template(player): participant = player.participant txn_cost_in_round = player.second_bid * C.TXN_COST participant.total_txn_cost_fiat = txn_cost_in_round participant.sum_total_quantity = player.second_bid money_balance = calculate_money_balance(player) money_balance = money_balance - ((player.second_bid)*(C.PRICE+C.TXN_COST)) money_balance = round(float(money_balance), 2) participant.money_balance_fiat = money_balance group = player.group allplayers = group.get_players() num_players = len(allplayers) money_supply = num_players * C.ENDOWMENT participant.fiat_money_supply = money_supply txn_cost_in_round = round(float(txn_cost_in_round), 2) money_supply = round(float(money_supply), 2) participant.total_txn_cost_fiat = round(float(participant.total_txn_cost_fiat), 2) return dict(txn_cost_in_round=txn_cost_in_round, money_supply=money_supply) page_sequence = [Introduction, Bid1, BidWaitPage, Bid2, ResultsWaitPage, Results]