# -*- coding: utf-8 -*- # from __future__ import division from otree.db import models from otree.constants import BaseConstants from otree.models import BaseSubsession, BaseGroup, BasePlayer from otree import widgets from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) # doc = """ Each player decides if to free ride or to volunteer from which all will benefit. """ bibliography = ( ( "Diekmann, A. (1985). Volunteer's dilemma. Journal of Conflict " "Resolution, 605-610." ), ) class Constants(BaseConstants): name_in_url = 'bank_run_new' players_per_group = None num_rounds = 9 instructions_file = 'bank_run/Instructions.html' # """Payoff for each player if they get their deposit back""" deposit = c(10) # """Additional interest if they don't withdraw and no bank run""" interest = c(10) threshold1 = c(100) threshold9 = c(0) threshold2 = c(85) threshold8 = c(15) threshold3 = c(75) threshold7 = c(25) threshold4 = c(60) threshold6 = c(40) threshold5 = c(50) class Subsession(BaseSubsession): pass class Group(BaseGroup): total_runs = models.CurrencyField() run_payoff = models.CurrencyField() bank_holdings = models.CurrencyField() bank_run = models.CurrencyField() total_deposits = models.CurrencyField() def set_payoffs(self): num_other_players = len(self.get_players()) - 1 self.total_deposits = Constants.deposit*len(self.get_players()) self.total_runs = len([p.withdraw for p in self.get_players() if p.withdraw]) run_percentage=(self.total_runs * 100) / len(self.get_players()) if self.subsession.round_number == 1: self.bank_holdings = self.total_deposits assert self.bank_holdings != None assert self.total_runs != None if run_percentage > Constants.threshold1: self.bank_run = c(1) else: self.bank_run = c(0) if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > len(self.get_players()): for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if self.subsession.round_number == 9: self.bank_holdings = self.total_deposits*0 assert self.bank_holdings != None assert self.total_runs != None if run_percentage > Constants.threshold9: self.bank_run = c(1) else: self.bank_run = c(0) if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > 0*len(self.get_players()): for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if self.subsession.round_number == 2: self.bank_holdings = self.total_deposits*(85/100) assert self.bank_holdings != None assert self.total_runs != None if run_percentage > Constants.threshold2: self.bank_run = c(1) else: self.bank_run = c(0) if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (85/100)*len(self.get_players()): for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if self.subsession.round_number == 8: self.bank_holdings = self.total_deposits*(15/100) assert self.bank_holdings != None assert self.total_runs != None if run_percentage > Constants.threshold8: self.bank_run = c(1) else: self.bank_run = c(0) if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (15/100)*len(self.get_players()): for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if self.subsession.round_number == 3: self.bank_holdings = self.total_deposits*(75/100) assert self.bank_holdings != None assert self.total_runs != None if run_percentage > Constants.threshold3: self.bank_run = c(1) else: self.bank_run = c(0) if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (75/100)*len(self.get_players()): for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if self.subsession.round_number == 7: self.bank_holdings = self.total_deposits*(25/100) assert self.bank_holdings != None assert self.total_runs != None if run_percentage > Constants.threshold7: self.bank_run = c(1) else: self.bank_run = c(0) if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (25/100)*len(self.get_players()): for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if self.subsession.round_number == 4: self.bank_holdings = self.total_deposits*(60/100) assert self.bank_holdings != None assert self.total_runs != None if run_percentage > Constants.threshold4: self.bank_run = c(1) else: self.bank_run = c(0) if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (60/100)*len(self.get_players()): for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if self.subsession.round_number == 6: self.bank_holdings = self.total_deposits*(40/100) assert self.bank_holdings != None assert self.total_runs != None if run_percentage > Constants.threshold6: self.bank_run = c(1) else: self.bank_run = c(0) if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (40/100)*len(self.get_players()): for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if self.subsession.round_number == 5: self.bank_holdings = self.total_deposits*(50/100) assert self.bank_holdings != None assert self.total_runs != None if run_percentage > Constants.threshold5: self.bank_run = c(1) else: self.bank_run = c(0) if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (50/100)*len(self.get_players()): for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit class Player(BasePlayer): withdraw = models.BooleanField( doc="""Whether player withdraws""", )