from otree.api import * c = cu doc = 'A public goods game\n' class Constants(BaseConstants): name_in_url = 'Groudwater_Game' players_per_group = None num_rounds = 1 num_practice_rounds = 2 crop_A_water_use = 1 crop_B_water_use = 2 crop_A_income = 2 crop_B_income = 5 community_use = 2 instructions_template = 'Groudwater_Game/instructions.html' def creating_session(subsession): session = subsession.session subsession.group_randomly() class Subsession(BaseSubsession): pass def set_water_level(group): players = group.get_players() water_uses = [p.water_use for p in players] group.total_water_use = sum(water_uses) group.water_level = group.water_level - group.total_water_use def set_practice_water_level_and_payoffs(group): session = group.session players = group.get_players() practice_water_uses = [p.water_use for p in players] group.practice_total_water_use = sum(practice_water_uses) group.practice_water_level = 20 + 6 * session.num_participants - group.practice_total_water_use for p in players(): set_practice_payoff(p) set_water_use(p) def set_payoffs(group): for p in group.get_players(): set_payoff(p) class Group(BaseGroup): water_level = models.IntegerField(initial=0) total_water_use = models.IntegerField(initial=0) practice_total_water_use = models.IntegerField(initial=0) practice_water_level = models.IntegerField(initial=0) def set_payoff(player): if player.decision == "Crop A": player.payoff = player.payoff + Constants.crop_A_income else: player.payoff = player.payoff + Constants.crop_B_income def set_water_use(player): if player.decision == "Crop A": player.water_use = Constants.crop_A_water_use else: player.water_use = Constants.crop_A_water_use def set_practice_payoff(player): if player.decision == "Crop A": player.practice_payoff = Constants.crop_A_income else: player.practice_payoff = Constants.crop_B_income class Player(BasePlayer): decision = models.StringField(choices=[['Crop A', 'Crop A'], ['Crop B', 'Crop B']], label='Which Crop Do You Choose?', widget=widgets.RadioSelect) water_use = models.IntegerField() practice_payoff = models.IntegerField() class Introduction(Page): form_model = 'player' timeout_seconds = 100 @staticmethod def is_displayed(player): return player.round_number == 1 @staticmethod def vars_for_template(player): session = player.session participant = player.participant intitial_groundwater = 20 + 6 * session.num_participants recharge_rate = 2 + session.num_participants return dict( intitial_groundwater = intitial_groundwater, recharge_rate = recharge_rate ) class Practice(Page): form_model = 'player' form_fields = ['decision'] @staticmethod def is_displayed(player): return player.round_number == 1 class Practice_Waitpage_1(WaitPage): after_all_players_arrive = set_practice_water_level_and_payoffs class Practice_Results(Page): form_model = 'player' page_sequence = [Introduction, Practice, Practice_Waitpage_1, Practice_Results]