from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ This anticommons game is based on a paradigm used by Glockner et al. (2015) and involves 3 Sellers and 1 Buyer (i.e., the experimenter). Each Seller demands a price (WTA) for his/her lottery ticket. If the sum of demands is no larger than the WTP, all players get demanded portions. Otherwise, they keep their tickets. """ class Constants(BaseConstants): name_in_url = 'anticommons_glockner' players_per_group = 3 num_rounds = 3 instructions_template = 'anticommons_glockner/Instructions.html' WTP_certainty = c(200) min_WTP_lowuncertainty = c(150) max_WTP_lowuncertainty = c(250) min_WTP_highuncertainty = c(100) max_WTP_highuncertainty = c(300) class Subsession(BaseSubsession): def creating_session(self): import itertools treatmentfirst = random.choice([1, 2]) if (treatmentfirst % 2) == 0: accountability = itertools.cycle([True, False]) if (treatmentfirst % 2) == 1: accountability = itertools.cycle([False, True]) if self.round_number == 1: for g in self.get_groups(): p1 = g.get_player_by_id(1) p2 = g.get_player_by_id(2) p3 = g.get_player_by_id(3) p1.participant.vars['WTP_certainty'] = p2.participant.vars['WTP_certainty'] = p3.participant.vars['WTP_certainty'] = Constants.WTP_certainty p1.participant.vars['WTP_lowuncertainty'] = p2.participant.vars['WTP_lowuncertainty'] = p3.participant.vars['WTP_lowuncertainty'] = random.randint(Constants.min_WTP_lowuncertainty, Constants.max_WTP_lowuncertainty) p1.participant.vars['WTP_highuncertainty'] = p2.participant.vars['WTP_highuncertainty'] = p3.participant.vars['WTP_highuncertainty'] = random.randint(Constants.min_WTP_highuncertainty, Constants.max_WTP_highuncertainty) order = random.choice([1, 2, 3, 4, 5, 6]) p1.participant.vars['order'] = p2.participant.vars['order'] = p3.participant.vars['order'] = order g.order = order g.WTP_certainty = Constants.WTP_certainty g.WTP_lowuncertainty = p1.participant.vars['WTP_lowuncertainty'] g.WTP_highuncertainty = p1.participant.vars['WTP_highuncertainty'] p1.participant.vars['accountability'] = p2.participant.vars['accountability'] = p3.participant.vars['accountability'] = next(accountability) g.accountability = p1.participant.vars['accountability'] if g.order == 1 or g.order == 2: g.treatment = "certainty" if g.order == 3 or g.order == 4: g.treatment = "lowuncertainty" if g.order == 5 or g.order == 6: g.treatment = "highuncertainty" if g.treatment == "certainty": g.WTP = g.WTP_certainty if g.treatment == "lowuncertainty": g.WTP = g.WTP_lowuncertainty if g.treatment == "highuncertainty": g.WTP = g.WTP_highuncertainty if self.round_number == 2: for g in self.get_groups(): p1 = g.get_player_by_id(1) p2 = g.get_player_by_id(2) p3 = g.get_player_by_id(3) g.order = p1.participant.vars['order'] g.WTP_certainty = Constants.WTP_certainty g.WTP_lowuncertainty = p1.participant.vars['WTP_lowuncertainty'] g.WTP_highuncertainty = p1.participant.vars['WTP_highuncertainty'] g.accountability = p1.participant.vars['accountability'] if g.order == 3 or g.order == 5: g.treatment = "certainty" if g.order == 1 or g.order == 6: g.treatment = "lowuncertainty" if g.order == 2 or g.order == 4: g.treatment = "highuncertainty" if g.treatment == "certainty": g.WTP = g.WTP_certainty if g.treatment == "lowuncertainty": g.WTP = g.WTP_lowuncertainty if g.treatment == "highuncertainty": g.WTP = g.WTP_highuncertainty if self.round_number == 3: for g in self.get_groups(): p1 = g.get_player_by_id(1) p2 = g.get_player_by_id(2) p3 = g.get_player_by_id(3) g.order = p1.participant.vars['order'] g.WTP_certainty = Constants.WTP_certainty g.WTP_lowuncertainty = p1.participant.vars['WTP_lowuncertainty'] g.WTP_highuncertainty = p1.participant.vars['WTP_highuncertainty'] g.accountability = p1.participant.vars['accountability'] if g.order == 4 or g.order == 6: g.treatment = "certainty" if g.order == 2 or g.order == 5: g.treatment = "lowuncertainty" if g.order == 1 or g.order == 3: g.treatment = "highuncertainty" if g.treatment == "certainty": g.WTP = g.WTP_certainty if g.treatment == "lowuncertainty": g.WTP = g.WTP_lowuncertainty if g.treatment == "highuncertainty": g.WTP = g.WTP_highuncertainty class Group(BaseGroup): def set_payoffs(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p3 = self.get_player_by_id(3) self.sum_WTA = (p1.WTA + p2.WTA + p3.WTA) self.winningticket = random.randrange(0,37,1) if self.sum_WTA <= self.WTP: p1.payoff = p1.WTA p2.payoff = p2.WTA p3.payoff = p3.WTA self.deal = 1 p1.ticketnumber = p2.ticketnumber = p3.ticketnumber = 0 else: p1.payoff = p2.payoff = p3.payoff = c(0) self.deal = 0 p1.ticketnumber = random.randrange(0,37,1) p2.ticketnumber = random.randrange(0,37,1) p3.ticketnumber = random.randrange(0,37,1) if p1.ticketnumber == self.winningticket: p1.prize = 1 p1.payoff = p1.payoff + c(2000) if p2.ticketnumber == self.winningticket: p2.prize = 1 p2.payoff = p2.payoff + c(2000) if p3.ticketnumber == self.winningticket: p3.prize = 1 p3.payoff = p3.payoff + c(2000) order = models.IntegerField() treatment = models.StringField() deal = models.IntegerField() accountability = models.BooleanField() sum_WTA = models.CurrencyField() WTP = models.CurrencyField() WTP_certainty = models.CurrencyField() WTP_lowuncertainty = models.CurrencyField() WTP_highuncertainty = models.CurrencyField() ticketssold = models.IntegerField() ticketskept = models.IntegerField() winningticket = models.IntegerField() class Player(BasePlayer): def role(self): if self.id_in_group == 1: return 'Seller 1' if self.id_in_group == 2: return 'Seller 2' if self.id_in_group == 3: return 'Seller 3' WTA = models.CurrencyField( doc=""" Amount requested by this player. """, min=0, max=300 ) ticketnumber = models.IntegerField() prize = models.IntegerField(initial=0) numberofprizes = models.IntegerField() accountabilitycheck_1 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) accountabilitycheck_2 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) accountabilitycheck_3 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) uncertaintycheck = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) quiz_1 = models.CharField( choices=["1 Seller", "2 Sellers", "3 Sellers", "4 Sellers"], widget=widgets.RadioSelect) quiz_2 = models.CharField( choices=["1 round", "2 rounds", "3 rounds", "4 rounds"], widget=widgets.RadioSelect) quiz_3 = models.CharField( choices=["The Buyer will then buy all three lottery tickets.", "The Buyer will then NOT buy any lottery tickets.", "I have not been informed about what will happen then."], widget=widgets.RadioSelect) quiz_4 = models.CharField( choices=["The Buyer will then buy all three lottery tickets.", "The Buyer will then NOT buy any lottery tickets.", "I have not been informed about what will happen then."], widget=widgets.RadioSelect)