from otree.api import ( Page, WaitPage, models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) doc = """ Trial for Treatment 1 """ class Constants(BaseConstants): name_in_url = 'project_treat2' players_per_group = 2 num_rounds = 5 min_allowable_bid = c(0) max_allowable_bid = c(10) # Error margin for the value estimates shown to the players # estimate_error_margin = c(1) class Subsession(BaseSubsession): pass class Group(BaseGroup): item_value = models.CurrencyField( doc="""Common value of the item to be auctioned, random for treatment""" ) highest_bid = models.CurrencyField() benefits = models.CurrencyField() total_benefits = models.CurrencyField() good_doctors_best_rate = models.CurrencyField() bad_doctors_best_rate = models.CurrencyField() num_winner = models.CurrencyField() lower_rate = models.CurrencyField() higher_rate = models.CurrencyField() total_bid = models.CurrencyField() other_bid = models.CurrencyField() class Player(BasePlayer): #item_value_estimate = models.CurrencyField( #doc="""Estimate of the common value, may be different for each player""" #) bid_amount = models.IntegerField( min=Constants.min_allowable_bid, max=Constants.max_allowable_bid, doc="""Amount prescribed by the player""", label="Treatment amount", ) bid_amount_trial = models.IntegerField( min=Constants.min_allowable_bid, max=Constants.max_allowable_bid, doc="""Amount prescribed by the player""", label="Treatment amount", ) is_winner = models.BooleanField( initial=False, doc="""Indicates whether the player is the winner""" ) benefits = models.CurrencyField() total_benefits = models.CurrencyField() money = models.CurrencyField() total_money = models.CurrencyField() good_doctors_best_rate = models.CurrencyField() bad_doctors_best_rate = models.CurrencyField() # FUNCTIONS def creating_session(subsession: Subsession): pass def set_winner(group: Group): import random players = group.get_players() good_doctors = [p for p in players if p.bid_amount > 4] bad_doctors = [p for p in players if p.bid_amount < 5] if len(good_doctors)>0: group.good_doctors_best_rate = min([p.bid_amount for p in good_doctors]) best_doctors = [p for p in players if p.bid_amount == group.good_doctors_best_rate] #winner = [best_doctors] group.num_winner = len(best_doctors) #winner.is_winner = True if len(good_doctors)==0: group.good_doctors_best_rate = 0 group.bad_doctors_best_rate = max([p.bid_amount for p in bad_doctors]) best_bad_doctors = [p for p in players if p.bid_amount == group.bad_doctors_best_rate] group.num_winner = len(best_bad_doctors) #winner = best_bad_doctors #winner.is_winner = True for p in players: set_payoff(p) def generate_value_estimate(group: Group): pass def set_payoff(player: Player): group = player.group if group.good_doctors_best_rate>0: if player.bid_amount == group.good_doctors_best_rate: if group.num_winner > 1: player.payoff = 10 * (player.bid_amount + player.bid_amount) - player.bid_amount * player.bid_amount else: player.payoff = 2 * (10 * (player.bid_amount + player.bid_amount) - player.bid_amount * player.bid_amount) else: player.payoff = 0 else: if player.bid_amount == group.bad_doctors_best_rate: if group.num_winner > 1: player.payoff = 10 * (player.bid_amount + player.bid_amount) - player.bid_amount * player.bid_amount else: player.payoff = 2 * (10 * (player.bid_amount + player.bid_amount) - player.bid_amount * player.bid_amount) else: player.payoff = 0 #if player.is_winner: #if group.num_winner>1: #player.payoff = 10 * (player.bid_amount + player.bid_amount) - player.bid_amount * player.bid_amount #else: #player.payoff = 2 * (10 * (player.bid_amount + player.bid_amount) - player.bid_amount * player.bid_amount) #else: #player.payoff = 0 # PAGES class Introduction(Page): pass class Bid(Page): form_model = 'player' form_fields = ['bid_amount_trial'] class ResultsWaitPage1(WaitPage): pass class Preview(Page): def vars_for_template(player: Player): group = player.group players = group.get_players() trial_amounts = [p.bid_amount_trial for p in players] group.total_bid = sum(trial_amounts) group.other_bid = ( group.total_bid - player.bid_amount_trial ) class Bid2(Page): form_model = 'player' form_fields = ['bid_amount'] class ResultsWaitPage2(WaitPage): after_all_players_arrive = 'set_winner' class Results(Page): #@staticmethod def vars_for_template(player: Player): group = player.group if player.payoff>0: if group.num_winner == 1: player.benefits = 2 * (10 * player.bid_amount + 50) if player.benefits > 200: player.benefits = 200 else: player.benefits = 10 * player.bid_amount + 50 if player.benefits > 100: player.benefits = 100 else: player.benefits = 0 player.total_benefits = player.benefits if player.round_number>1: player.total_benefits = player.benefits + sum([p.benefits for p in player.in_previous_rounds()]) player.money = player.payoff player.total_money = player.money if player.round_number > 1: player.total_money = player.money + sum([p.money for p in player.in_previous_rounds()]) page_sequence = [Bid, ResultsWaitPage1, Preview, Bid2, ResultsWaitPage2, Results]