from random import random from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, ) author = 'Mark Bloxsom' doc = """ This app will conduct the Costly Participation and Preference Expression Experiment - Approval Treatment. """ class Constants(BaseConstants): name_in_url = 'Voter_Participation_02' players_per_group = 11 num_rounds = 10 red_bucket1 = 300 red_bucket2 = 200 red_bucket3 = 100 blue_bucket1 = 200 blue_bucket2 = 300 blue_bucket3 = 100 green_bucket1 = 150 green_bucket2 = 150 green_bucket3 = 300 Cost_Constant = 100 class Subsession(BaseSubsession): def creating_session(self): self.group_randomly(fixed_id_in_group=True) class Group(BaseGroup): red_payoff = models.CurrencyField() blue_payoff = models.CurrencyField() green_payoff = models.CurrencyField() bucket1 = models.IntegerField(initial=0) bucket2 = models.IntegerField(initial=0) bucket3 = models.IntegerField(initial=0) winner = models.StringField() def voting_outcome(self): players = self.get_players() votes1 = [p.vote_Bucket1 for p in players] for v in votes1: if v == 1: self.bucket1 += 1 if v == -1: self.bucket1 -= 1 votes2 = [p.vote_Bucket2 for p in players] for v in votes2: if v == 1: self.bucket2 += 1 if v == -1: self.bucket2 -= 1 votes3 = [p.vote_Bucket3 for p in players] for v in votes3: if v == 1: self.bucket3 += 1 if v == -1: self.bucket3 -= 1 if self.bucket1 >= self.bucket2: if self.bucket1 == self.bucket2: if self.bucket1 >= self.bucket3: if self.bucket1 == self.bucket3: self.red_payoff = (Constants.red_bucket1 + Constants.red_bucket2 + Constants.red_bucket3) / 3 self.blue_payoff = (Constants.blue_bucket1 + Constants.blue_bucket2 + Constants.blue_bucket3) / 3 self.green_payoff = (Constants.green_bucket1 + Constants.green_bucket2 + Constants.green_bucket3) / 3 self.winner = 'Bucket 1, Bucket 2, and Bucket 3 Tied' else: self.red_payoff = (Constants.red_bucket1 + Constants.red_bucket2) / 2 self.blue_payoff = (Constants.blue_bucket1 + Constants.blue_bucket2) / 2 self.green_payoff = (Constants.green_bucket1 + Constants.green_bucket2) / 2 self.winner = 'Bucket 1 and Bucket 2 Tied' else: self.red_payoff = Constants.red_bucket3 self.blue_payoff = Constants.blue_bucket3 self.green_payoff = Constants.green_bucket3 self.winner = 'Bucket 3 Wins' elif self.bucket1 >= self.bucket3: if self.bucket1 == self.bucket3: self.red_payoff = (Constants.red_bucket1 + Constants.red_bucket3) / 2 self.blue_payoff = (Constants.blue_bucket1 + Constants.blue_bucket3) / 2 self.green_payoff = (Constants.green_bucket1 + Constants.green_bucket3) / 2 self.winner = 'Bucket 1 and Bucket 3 Tied' else: self.red_payoff = Constants.red_bucket1 self.blue_payoff = Constants.blue_bucket1 self.green_payoff = Constants.green_bucket1 self.winner = 'Bucket 1 Wins' else: self.red_payoff = Constants.red_bucket3 self.blue_payoff = Constants.blue_bucket3 self.green_payoff = Constants.green_bucket3 self.winner = 'Bucket 3 Wins' elif self.bucket2 >= self.bucket3: if self.bucket2 == self.bucket3: self.red_payoff = (Constants.red_bucket2 + Constants.red_bucket3) / 2 self.blue_payoff = (Constants.blue_bucket2 + Constants.blue_bucket3) / 2 self.green_payoff = (Constants.green_bucket2 + Constants.green_bucket3) / 2 self.winner = 'Bucket 2 and Bucket 3 Tied' else: self.red_payoff = Constants.red_bucket2 self.blue_payoff = Constants.blue_bucket2 self.green_payoff = Constants.green_bucket2 self.winner = 'Bucket 2 Wins' else: self.red_payoff = Constants.red_bucket3 self.blue_payoff = Constants.blue_bucket3 self.green_payoff = Constants.green_bucket3 self.winner = 'Bucket 3 Wins' def calculate_payoff(self): for r in self.get_players(): if r.role() == 'Red': r.payoff = self.red_payoff if r.role() == 'Blue': r.payoff = self.blue_payoff if r.role() == 'Green': r.payoff = self.green_payoff if r.participate == 1: r.payoff = r.payoff - r.individual_cost class Player(BasePlayer): individual_cost = models.FloatField() round_select = models.FloatField() payoff_select = models.CurrencyField() dollar_select = models.IntegerField() participate = models.IntegerField( choices=[ [1, 'YES'], [0, 'NO'], ], ) vote_Bucket1 = models.IntegerField( choices=[ [1, 'Add Token'], [-1, 'Remove Token'], [0, 'Do Nothing'], ], ) vote_Bucket2 = models.IntegerField( choices=[ [1, 'Add Token'], [-1, 'Remove Token'], [0, 'Do Nothing'], ], ) vote_Bucket3 = models.IntegerField( choices=[ [1, 'Add Token'], [-1, 'Remove Token'], [0, 'Do Nothing'], ], ) def role(self): if self.id_in_group == 1: return 'Red' if self.id_in_group == 2: return 'Blue' if self.id_in_group == 3: return 'Green' if self.id_in_group == 4: return 'Red' if self.id_in_group == 5: return 'Blue' if self.id_in_group == 6: return 'Green' if self.id_in_group == 7: return 'Red' if self.id_in_group == 8: return 'Blue' if self.id_in_group == 9: return 'Green' if self.id_in_group == 10: return 'Green' if self.id_in_group == 11: return 'Green' if self.id_in_group == 12: return 'Green'