from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) #from otree_tools.models.fields import OtherModelField import random import itertools author = 'Celine Zhang' doc = """ This is a one-period public goods game with 32 players and 4 per group. """ class Constants(BaseConstants): name_in_url = 's1test' players_per_group = 4 num_rounds = 1 instructions_template = 's1test/Instructions.html' # """Amount allocated to each player""" endowment = c(100) multiplier = 1.6 check1=['0','100','160','240'] check2=['0','100','160','220'] check3=['0','40','100','160'] class Subsession(BaseSubsession): # group players randomly each round, but keep id_in_group fixed def creating_session(self): players = self.get_players() self.group_randomly() class Group(BaseGroup): total_contribution = models.CurrencyField() individual_share = models.CurrencyField() def set_payoffs(self): self.total_contribution = sum([p.contribution for p in self.get_players()]) self.individual_share = self.total_contribution * Constants.multiplier / Constants.players_per_group for p in self.get_players(): p.payoff2 = Constants.endowment - p.contribution + self.individual_share if self.subsession.round_number == 1: if p.id_in_group == 1: p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 2: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 3: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[1].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 4: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[1].contribution p.member3con = self.get_players()[2].contribution p.payoff = Constants.endowment - p.contribution + self.individual_share p.participant.vars['earning1'] = p.payoff2 elif self.subsession.round_number == 2: if p.id_in_group == 1: p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 2: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 3: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[1].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 4: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[1].contribution p.member3con = self.get_players()[2].contribution p.payoff = 0 p.participant.vars['earning2'] = p.payoff2 elif self.subsession.round_number == 3: if p.id_in_group == 1: p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 2: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 3: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[1].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 4: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[1].contribution p.member3con = self.get_players()[2].contribution p.payoff = 0 p.participant.vars['earning3'] = p.payoff2 elif self.subsession.round_number ==4: if p.id_in_group == 1: p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 2: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 3: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[1].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 4: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[1].contribution p.member3con = self.get_players()[2].contribution p.payoff = Constants.endowment - p.contribution + self.individual_share p.participant.vars['earning4'] = p.payoff2 elif self.subsession.round_number == 5: if p.id_in_group == 1: p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 2: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 3: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[1].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 4: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[1].contribution p.member3con = self.get_players()[2].contribution p.payoff = 0 p.participant.vars['earning5'] = p.payoff2 elif self.subsession.round_number == 6: if p.id_in_group == 1: p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 2: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 3: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[1].contribution p.member3con = self.get_players()[3].contribution elif p.id_in_group == 4: p.member1con = self.get_players()[0].contribution p.member2con = self.get_players()[1].contribution p.member3con = self.get_players()[2].contribution p.payoff = Constants.endowment - p.contribution + self.individual_share p.participant.vars['earning6'] = p.payoff2 class Player(BasePlayer): member1con = models.CurrencyField() member2con = models.CurrencyField() member3con = models.CurrencyField() display1 = models.CurrencyField() display2 = models.CurrencyField() display3 = models.CurrencyField() display4 = models.CurrencyField() payoff2 = models.CurrencyField() contribution = models.CurrencyField( min=0, max=Constants.endowment, doc="""The amount contributed by the player""", ) password = models.CharField(initial='') check1 = models.CharField(choices=Constants.check1) check2 = models.CharField(choices=Constants.check2) check3 = models.CharField(choices=Constants.check3) def member_id(self): # player 1 is the leader, so member 1 is actually player 2 return (self.id_in_group) def other_player1(self): return self.get_others_in_group()[0] def other_player2(self): return self.get_others_in_group()[1] def other_player3(self): return self.get_others_in_group()[2] password_video1 = models.CharField(initial='') new_check = models.CharField(choices=['Multiplied by 1.6', 'Remain unchanged', 'Gone and never come back' ], widget=widgets.RadioSelect) new_check2 = models.CharField(choices=['Contribution to the group always increases my payouts', 'Contribution to the group always increases payouts of others', 'Contribution will not affect the payouts of anybody' ], widget=widgets.RadioSelect) s1q1attempt = models.IntegerField(initial=0) s1q2attempt = models.IntegerField(initial=0)