from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ Each player decides if to free ride or to volunteer from which all will benefit. See: Diekmann, A. (1985). Volunteer's dilemma. Journal of Conflict Resolution, 605-610. """ class Constants(BaseConstants): name_in_url = 'volunteer_dilemma' players_per_group = 6 num_rounds = 1 instructions_template = 'volunteer_dilemma/Instructions.html' num_other_players = players_per_group - 1 # """Payoff for each player if at least one volunteers""" general_benefit = c(10) # """Cost incurred by volunteering player""" volunteer_cost = c(6) class Subsession(BaseSubsession): def group_by_arrival_time_method(self, waiting_players): print('in group_by_arrival_time_method') treatment1_players = [p for p in waiting_players if p.participant.vars['treatment'] == '1'] # not dependent, observed treatment2_players = [p for p in waiting_players if p.participant.vars['treatment'] == '2'] # dependent, observed treatment3_players = [p for p in waiting_players if p.participant.vars['treatment'] == '3'] # not dependent, not observed (control condition) treatment4_players = [p for p in waiting_players if p.participant.vars['treatment'] == '4'] # dependent, not observed if len(treatment1_players) >= 3 and len(treatment3_players) >= 3: print('about to create a group') return [treatment1_players[0], treatment1_players[1], treatment1_players[2], treatment3_players[0], treatment3_players[1], treatment3_players[2]] print('not enough players yet to create a group') if len(treatment2_players) >= 3 and len(treatment4_players) >= 3: print('about to create a group') return [treatment2_players[0], treatment2_players[1], treatment2_players[2], treatment4_players[0], treatment4_players[1], treatment4_players[2]] print('not enough players yet to create a group') class Group(BaseGroup): def set_payoffs(self): for p in self.get_players(): if p.participant.vars['treatment'] == '1': p.subgroup = 1 if p.participant.vars['treatment'] == '2': p.subgroup = 1 if p.participant.vars['treatment'] == '3': p.subgroup = 2 if p.participant.vars['treatment'] == '4': p.subgroup = 2 # payoffs subgroup 1 players = self.get_players() self.num_volunteers_subgroup1 = sum([p.volunteer_subgroup1 for p in players]) if self.num_volunteers_subgroup1 > 0: baseline_amount_subgroup1 = Constants.general_benefit else: baseline_amount_subgroup1 = c(0) for p in players: if p.subgroup == 1: p.payoff = baseline_amount_subgroup1 if p.volunteer_subgroup1: p.payoff -= Constants.volunteer_cost # payoffs subgroup 2 players = self.get_players() self.num_volunteers_subgroup2 = sum([p.volunteer_subgroup2 for p in players]) if self.num_volunteers_subgroup2 > 0: baseline_amount_subgroup2 = Constants.general_benefit else: baseline_amount_subgroup2 = c(0) for p in players: if p.subgroup == 2: p.payoff = baseline_amount_subgroup2 if p.volunteer_subgroup2: p.payoff -= Constants.volunteer_cost # calculate extra income from other subgroup if p.dependence == True: if self.num_volunteers_subgroup1 > 0: p.payoff += baseline_amount_subgroup1 if p.subgroup == 1: if p.dependence == True: if self.num_volunteers_subgroup2 > 0: p.payoff += baseline_amount_subgroup2 class Player(BasePlayer): ppnr = models.IntegerField(verbose_name='What is your participant number (= participant nummer dat op het papiertje staat)?') name = models.StringField(verbose_name='What is your first name?') age = models.PositiveIntegerField( verbose_name='What is your age (in years)?', min=18, max=125) gender = models.CharField(verbose_name='What is your gender?') study = models.CharField(verbose_name='What do you study?') baseline_amount = models.CurrencyField() volunteer_subgroup1 = models.BooleanField( doc="""Whether player volunteers""", ) volunteer_subgroup2 = models.BooleanField( doc="""Whether player volunteers""", ) subgroup = models.IntegerField() observability = models.BooleanField() dependence = models.BooleanField() motive_1 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) motive_2 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) motive_3 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) motive_4 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) condition = models.CharField() role_saved = models.StringField() quiz_1 = models.CharField( choices=["1 Person", "2 Persons", "3 Persons", "4 Persons"], widget=widgets.RadioSelect) quiz_2 = models.CharField( choices=["5 point", "10 points", "15 points", "20 points"], widget=widgets.RadioSelect) quiz_3 = models.CharField( choices=["Then no one will keep any points.", "Then all group members will keep their points.", "I have not been informed about what will happen then."], widget=widgets.RadioSelect) quiz_4 = models.CharField( choices=["Then no one will keep any points.", "Then all group members will keep their points.", "I have not been informed about what will happen then."], widget=widgets.RadioSelect)