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 = 'SamplePGG' players_per_group = 4 num_rounds = 4 instructions_template = 'dictator/instructions.html' # """Amount allocated to each player""" endowment = c(100) multiplier = 2 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 class Player(BasePlayer): member1con = models.CurrencyField() member2con = models.CurrencyField() member3con = models.CurrencyField() practice = models.CurrencyField() 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] s1q2attempt = models.IntegerField(initial=0) newcheck3 = models.CharField(choices=['Red', 'Purple', 'Yellow', 'Green', 'None of the above' ], widget=widgets.RadioSelect) gender = models.CharField(choices=['Male', 'Female', 'Non-binary', 'Refuse to disclose', ], widget=widgets.RadioSelect) age = models.IntegerField() subjectid = models.CharField(initial='') payoff2 = models.CurrencyField() payoffpractice = models.CurrencyField() p1_payoff2 = models.CurrencyField() p2_payoff2 = models.CurrencyField() p3_payoff2 = models.CurrencyField() contribution = models.CurrencyField( min=0, max=Constants.endowment, doc="""The amount contributed by the player""", ) total_contribution = models.CurrencyField() individual_share = models.CurrencyField() def set_payoffs(self): self.total_contribution = self.practice + 90 self.individual_share = self.total_contribution * Constants.multiplier / 4 self.payoffpractice = Constants.endowment - self.practice + self.individual_share self.p1_payoff2 = sum([+56, +self.individual_share, ]) self.p2_payoff2 = sum([+93, +self.individual_share, ]) self.p3_payoff2 = sum([+61, +self.individual_share, ]) self.payoffpractice = Constants.endowment - self.practice + self.individual_share