from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random from django import forms from django.forms.widgets import NumberInput from django.db import models as djmodels from django.core.exceptions import ValidationError doc = """ this is demo of public goods stage 2 second part """ class Constants(BaseConstants): name_in_url = 's2btest' players_per_group = 4 num_rounds = 2 instructions_template = 's2btest/Instructions.html' initial_endowment = c(90) tax = c(10) take_away_endo = float(60) pool_multiplier = c(1.6) take_away_multiplier = c(3) answer_increment = c(3) leader_decision = currency_range(0, take_away_endo, answer_increment) leader_decision_count = len(leader_decision) keep_give_amounts = [] for answer in leader_decision: keep_give_amounts.append((answer, take_away_endo - answer)) test = ['0','3','6','9'] class Subsession(BaseSubsession): def creating_session(self): players = self.get_players() self.group_randomly() class Group(BaseGroup, djmodels.Model): total_contribution = models.CurrencyField() individual_share = models.CurrencyField() decision_member1 = models.CurrencyField(choices=Constants.leader_decision, label='') decision_member2 = models.CurrencyField(choices=Constants.leader_decision, label='') decision_member3 = models.CurrencyField(choices=Constants.leader_decision, label='') def set_payoffs(self): self.total_contribution= sum([p.contribution for p in self.get_players() if p.contribution != None]) self.individual_share = self.total_contribution * Constants.pool_multiplier / Constants.players_per_group print(self.individual_share) for p in self.get_players(): if 'member' in p.role(): p.contribution = p.member_contribute if p.member_id()==1: if self.subsession.round_number == 1: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) p.pointremoved = self.decision_member1 p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.leadercon = self.get_players()[0].contribution p.member1pun = self.decision_member2 p.member2pun = self.decision_member3 p.participant.vars['twoone'] = p.payoff2 elif self.subsession.round_number == 2: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) p.pointremoved = self.decision_member1 p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.leadercon = self.get_players()[0].contribution p.member1pun = self.decision_member2 p.member2pun = self.decision_member3 p.participant.vars['twotwo'] = p.payoff2 elif self.subsession.round_number == 3: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.pointremoved = self.decision_member1 p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['twothree'] = p.payoff2 elif self.subsession.round_number == 4: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.pointremoved = self.decision_member1 p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['twofour'] = p.payoff2 elif self.subsession.round_number == 5: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) p.pointremoved = self.decision_member1 p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['twofive'] = p.payoff2 elif self.subsession.round_number == 6: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) p.pointremoved = self.decision_member1 p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['twosix'] = p.payoff2 elif self.subsession.round_number == 7: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.pointremoved = self.decision_member1 p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['twoseven'] = p.payoff2 elif self.subsession.round_number == 8: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.pointremoved = self.decision_member1 p.member1con = self.get_players()[2].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['twoeight'] = p.payoff2 elif p.member_id()==2: if self.subsession.round_number == 1: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) p.pointremoved = self.decision_member2 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.leadercon = self.get_players()[0].contribution p.member1pun = self.decision_member1 p.member2pun = self.decision_member3 p.participant.vars['twoone'] = p.payoff2 elif self.subsession.round_number == 2: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) p.pointremoved = self.decision_member2 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.leadercon = self.get_players()[0].contribution p.member1pun = self.decision_member1 p.member2pun = self.decision_member3 p.participant.vars['twotwo'] = p.payoff2 elif self.subsession.round_number == 3: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.pointremoved = self.decision_member2 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['twothree'] = p.payoff2 elif self.subsession.round_number == 4: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.pointremoved = self.decision_member2 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['twofour'] = p.payoff2 elif self.subsession.round_number == 5: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['twofive'] = p.payoff2 elif self.subsession.round_number == 6: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) p.pointremoved = self.decision_member2 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['twosix'] = p.payoff2 elif self.subsession.round_number == 7: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.pointremoved = self.decision_member2 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.participant.vars['twoseven'] = p.payoff2 elif self.subsession.round_number == 8: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member2, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[3].contribution p.pointremoved = self.decision_member2 p.participant.vars['twoeight'] = p.payoff2 elif p.member_id()==3: if self.subsession.round_number == 1: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member1, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) p.pointremoved = self.decision_member3 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.leadercon = self.get_players()[0].contribution p.member1pun = self.decision_member1 p.member2pun = self.decision_member2 p.participant.vars['twoone'] = p.payoff2 elif self.subsession.round_number == 2: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) p.pointremoved = self.decision_member3 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.leadercon = self.get_players()[0].contribution p.member1pun = self.decision_member1 p.member2pun = self.decision_member2 p.participant.vars['twotwo'] = p.payoff2 elif self.subsession.round_number == 3: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.pointremoved = self.decision_member3 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['twothree'] = p.payoff2 elif self.subsession.round_number == 4: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.pointremoved = self.decision_member3 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['twofour'] = p.payoff2 elif self.subsession.round_number == 5: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) p.pointremoved = self.decision_member3 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['twofive'] = p.payoff2 elif self.subsession.round_number == 6: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) p.pointremoved = self.decision_member3 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['twosix'] = p.payoff2 elif self.subsession.round_number == 7: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.pointremoved = self.decision_member3 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['twoseven'] = p.payoff2 elif self.subsession.round_number == 8: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) if p.payoff2 > 0: p.payoff2 = sum([+Constants.initial_endowment, -p.member_contribute, -self.decision_member3, +self.individual_share, ]) else: p.payoff2 = 0 p.payoff = 0 p.pointremoved = self.decision_member3 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.participant.vars['twoeight'] = p.payoff2 else: leader = self.get_player_by_role('leader') p.contribution = p.leader_contribute if self.subsession.round_number == 1: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) p.pointremoved = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.member1pun = self.decision_member1 p.member2pun = self.decision_member2 p.member3pun = self.decision_member3 p.participant.vars['twoone'] = leader.payoff2 if self.subsession.round_number == 2: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) p.pointremoved = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['twotwo'] = leader.payoff2 if self.subsession.round_number == 3: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = 0 p.pointremoved = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['twothree'] = leader.payoff2 if self.subsession.round_number == 4: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = 0 p.pointremoved = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['twofour'] = leader.payoff2 if self.subsession.round_number == 5: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) p.pointremoved = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['twofive'] = leader.payoff2 if self.subsession.round_number == 6: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) p.pointremoved = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['twosix'] = leader.payoff2 if self.subsession.round_number == 7: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = 0 p.pointremoved = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['twoseven'] = leader.payoff2 if self.subsession.round_number == 8: leader.payoff2 = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) leader.payoff = 0 p.pointremoved = 0 p.member1con = self.get_players()[1].contribution p.member2con = self.get_players()[2].contribution p.member3con = self.get_players()[3].contribution p.participant.vars['twoeight'] = leader.payoff2 def current(self): self.total_contribution= sum([p.contribution for p in self.get_players() if p.contribution != None]) self.individual_share = self.total_contribution * Constants.pool_multiplier / Constants.players_per_group print(self.individual_share) for p in self.get_players(): if 'member' in p.role(): p.contribution = p.member_contribute if p.member_id()==1: p.current = float(sum([+Constants.initial_endowment, -p.member_contribute, +self.individual_share, ])) elif p.member_id()==2: p.current = float(sum([+Constants.initial_endowment, -p.member_contribute, +self.individual_share, ])) elif p.member_id()==3: p.current = float(sum([+Constants.initial_endowment, -p.member_contribute, +self.individual_share, ])) else: leader = self.get_player_by_role('leader') p.contribution = p.leader_contribute leader.current = sum([+Constants.initial_endowment, -p.leader_contribute, +self.individual_share, ]) def get_member(self): for p in self.get_players(): if 'member' in p.role() and p.member_id() == 1: return 1 if 'member' in p.role() and p.member_id() == 2: return 2 if 'member' in p.role() and p.member_id() == 3: return 3 class Player(BasePlayer,djmodels.Model): member1pun = models.CurrencyField() member2pun = models.CurrencyField() member3pun = models.CurrencyField() leadercon = models.CurrencyField() member1con = models.CurrencyField() member2con = models.CurrencyField() member3con = models.CurrencyField() pointremoved = models.CurrencyField() payoff2 = models.CurrencyField() current = models.CurrencyField() # member member_contribute = models.CurrencyField( min=0, max=Constants.initial_endowment ) leader_contribute = models.CurrencyField( min=0, max=Constants.initial_endowment ) def leftover(self): self.member_leftover = Constants.initial_endowment - self.member_contribute return contribution = models.CurrencyField() def member_id(self): # player 1 is the leader, so member 1 is actually player 2 return (self.id_in_group - 1) def role(self): if self.id_in_group == 1: return 'leader' return 'member {}'.format(self.member_id()) password = models.CharField(initial='') 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] def player1(self): return self.group.get_players()[0] def player2(self): return self.group.get_players()[1] def player3(self): return self.group.get_players()[2] def player4(self): return self.group.get_players()[3]