from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, Page, WaitPage ) cu = c doc = '\nIn a common value auction game, players simultaneously bid on the item being\nauctioned.
\nPrior to bidding, they are given an estimate of the actual value of the item.\nThis actual value is revealed after the bidding.
\nBids are private. The player with the highest bid wins the auction, but\npayoff depends on the bid amount and the actual value.
\n' class Constants(BaseConstants): name_in_url = 'auction_asset_two_realized' players_per_group = None num_rounds = 1 min_allowable_bid = c(0) max_allowable_bid = c(12.5) instructions_template = 'auction_asset_two_realized/instructions.html' def creating_session(subsession): pass class Subsession(BaseSubsession): creating_session = creating_session def set_winner_Type2(group): import random players = group.get_players() playerbidnumber = max([p.id_in_group for p in players]) allbids = [] firstcount = 0 othercount = 0 while firstcount < playerbidnumber: freshplayer = firstcount + 1 currentperson = group.get_player_by_id(freshplayer) while othercount < currentperson.number_Type2: allbids.append(currentperson.bid_amount_type2) othercount = othercount + 1 firstcount = firstcount + 1 othercount = 0 bidsinorder = sorted(allbids, reverse=True) counter = 0 bidslots = 0 endcheck = 0 totalbids = 0 for p in players: if p.bid_amount_type2 > 0: totalbids = totalbids + p.number_Type2 if totalbids < playerbidnumber*2: for p in players: if p.bid_amount_type2 > 0 and p.number_Type2 > 0: p.owned_type2 = p.number_Type2 counter = counter + p.number_Type2 else: p.owned_type2 = 1 counter = counter + 1 players_with_marginal_bid = [p for p in players if p.bid_amount_type2 == 0 or p.number_Type2 == 0] while counter < playerbidnumber*2: receiver = random.choice(players) if receiver.owned_type2 < 4: receiver.owned_type2 = receiver.owned_type2 + 1 counter = counter + 1 endcheck = 3 if totalbids >= playerbidnumber*2: for p in players: if p.bid_amount_type2 > bidsinorder[playerbidnumber*2-1]: p.owned_type2 = p.number_Type2 counter = counter + p.number_Type2 elif p.bid_amount_type2 == bidsinorder[playerbidnumber*2-1]: p.owned_type2 = p.number_Type2 counter = counter + p.number_Type2 players_with_marginal_bid = [ p for p in players if p.bid_amount_type2 == bidsinorder[playerbidnumber*2-1] ] else: p.owned_type2 = 0 endcheck = 1 if counter > playerbidnumber*2: while counter > playerbidnumber*2: winner = random.choice( players_with_marginal_bid ) # if tie, winner is chosen at random winner.owned_type2 = winner.owned_type2 - 1 if winner.owned_type2 > - 1: counter = counter - 1 else: winner.owned_type2 = 0 for p in players: if endcheck == 1: p.auction_spending2 = p.owned_type2*bidsinorder[playerbidnumber*2-1] p.asset2auctionprice = bidsinorder[playerbidnumber*2-1] if endcheck == 2: p.auction_spending2 = p.owned_type2*bidsinorder[bidslots-1] p.asset2auctionprice = bidsinorder[bidslots-1] if endcheck == 3: p.auction_spending2 = 0 p.asset2auctionprice = 0 p.initial_spending = p.auction_spending2 p.available_funds = p.available_funds - p.initial_spending def my_function(group): players = group.get_players() for p in players: set_this_data(p) def create_outcome(group): import random players = group.get_players() asset2gen = random.random() if asset2gen < .1: group.asset2outcome = "Asset 2 gained 90 cents." for p in players: p.available_funds = p.available_funds + .9*p.owned_type2 p.asset2earningschange = .9*p.owned_type2 p.asset2endvalue = 2.5 else: group.asset2outcome = "Asset 2 lost 10 cents." for p in players: p.available_funds = p.available_funds + -.1*p.owned_type2 p.asset2earningschange = -.1*p.owned_type2 p.asset2endvalue = 2.5 def round1display(group): players = group.get_players() for p in players: pull_round1data(p) class Group(BaseGroup): item_value = models.CurrencyField(doc='Common value of the item to be auctioned random for treatment') highest_bid = models.CurrencyField() u = models.IntegerField() asset2outcome = models.StringField() set_winner_Type2 = set_winner_Type2 my_function = my_function create_outcome = create_outcome round1display = round1display def set_this_data(player): participant = player.participant participant.vars['type2'] = player.owned_type2 participant.vars['funds'] = 12.50 participant.vars['bankedaccount'] = player.available_funds participant.vars['asset2value'] = player.asset2endvalue participant.vars['asset2auctionprice'] = player.asset2auctionprice participant.vars['purchasehistory2'] = player.purchasehistory2 def pull_round1data(player): participant = player.participant player.previousearnings = participant.vars['round1earnings'] player.bankedaccountprev = participant.vars['round1bankedaccount'] player.available_fundsprev = participant.vars['round1availablefunds'] player.owned_type1prev = participant.vars['round1ownedtype1'] player.asset1valueprev = participant.vars['round1asset1value'] class Player(BasePlayer): bid_amount_type2 = models.CurrencyField(label='Bid amount for assets', max=Constants.max_allowable_bid, min=0) number_Type2 = models.IntegerField(label='Number of assets to purchase (maximum)', max=4, min=0) initial_spending = models.CurrencyField() owned_type2 = models.IntegerField(initial=0) auction_spending2 = models.CurrencyField() available_funds = models.CurrencyField(initial=12.5) asset2endvalue = models.CurrencyField() asset2auctionprice = models.CurrencyField() purchasehistory2 = models.LongStringField(initial='Nothing') previousearnings = models.CurrencyField(initial=0) bankedaccountprev = models.CurrencyField() available_fundsprev = models.CurrencyField() owned_type1prev = models.IntegerField() asset1valueprev = models.CurrencyField() asset2earningschange = models.CurrencyField(initial=0) set_this_data = set_this_data pull_round1data = pull_round1data