from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = 'Lucia Savadori -- Gaia Da Rugna' doc = """ Public good game with punishment """ # treatment=1 Player Contribuisce, Player pesca, Player decide punizione # treatment=2 Player Contribuisce, Player decide punizione, Computer pesca # treatment=3 Computer Contribuisce, Player pesca , Player decide punizione # treatment=4 Computer Contribuisce, Player decide punizione, Computer pesca class Constants(BaseConstants): name_in_url = 'savadori_darugna' players_per_group = 3 num_rounds = 1 endowment = 5 cost_punish = 0.20 efficiency_factor = 2.5 class Subsession(BaseSubsession): def creating_session(self): self.session.config['participation_fee'] = 3 self.session.config['real_world_currency_per_point'] = 1.00 # Togliere questa linea serve per debug # self.session.config['treatment'] = 2 # # Togliere le seguenti linee e mettere pagina con inserimento code # v = list(range(1,5)) # random.shuffle(v) # k = 0 # for player in self.get_players(): # player.code = v[k] # k = k+1 def set_payoff(self): for group in self.get_groups(): group.set_payoffs() class Group(BaseGroup): total_contribution = models.IntegerField() individual_share = models.FloatField() num_players_contribution = models.IntegerField() def set_who_punish(self): player_contributed = [] player_notcontributed = [] for p in self.get_players(): if p.contribute: player_contributed.append(p.id_in_group) else: player_notcontributed.append(p.id_in_group) print('ID in group contributed',player_contributed) print('ID in group NOT contributed',player_notcontributed) random.shuffle(player_contributed) random.shuffle(player_notcontributed) k = 0 for p_id in player_contributed: p = self.get_player_by_id(p_id) if len(player_notcontributed) > 0 : p.punish_id = player_notcontributed[k] k = k + 1 if k >= len(player_notcontributed) : random.shuffle(player_notcontributed) k = 0 def set_payoffs(self): self.num_players_contribution = sum([p.contribute for p in self.get_players()]) self.total_contribution = sum([5 * p.contribute for p in self.get_players()]) self.individual_share = round(self.total_contribution * Constants.efficiency_factor / Constants.players_per_group,2) for p in self.get_players(): # p.point_payoff = round((Constants.endowment - 5 * p.contribute) - (p.punish_received * 0.2) + self.individual_share - (p.punish_value * 0.2),2) p.share_received_other = (self.num_players_contribution - p.contribute) * 1.25 p.point_payoff = round((Constants.endowment - 5 * p.contribute) - (p.punish_received * 1) + p.share_received_other - (p.punish_value * 0.2),2) p.payoff = p.point_payoff class Player(BasePlayer): code = models.IntegerField(initial=0,min=0,max=20) contribute = models.BooleanField() punish_id = models.IntegerField(initial=-1) punish_value = models.FloatField(initial=0) punish_value_ipo = models.FloatField(initial=0) point_payoff = models.FloatField(initial=0) punish_received = models.FloatField(initial=0) share_received_other = models.FloatField(initial=0) sex = models.StringField(widget=widgets.RadioSelectHorizontal(),choices=['Maschile', 'Femminile']) age = models.IntegerField(choices = range(18,60,1)) num_experiments = models.IntegerField(choices = range(1,50,1)) faculty = models.PositiveIntegerField(choices=[[1, 'Economia'],[2, 'Giurisprudenza'],[3, 'Ingegneria'],[4,'Lettere'],[5,'Sociologia'],[6,'Psicologia'],[7,'Matematica/Fisica'],[8,'Informatica'],[9,'Altro'],[10,'Non sono studente/studentessa'],]) degree = models.PositiveIntegerField(choices=[[1, 'laurea magistrale'],[2, 'laurea triennale'],[3, 'diploma di scuola media superiore'],[4,'diploma di scuola media inferiore']]) q_1 = models.IntegerField(label='Il governo interferisce troppo nella nostra vita quotidiana') q_2 = models.IntegerField(label='La nostra società starebbe meglio se la distribuzione della ricchezza fosse più equa') q_3 = models.IntegerField(label='La società nel suo complesso è diventata troppo morbida e femminile') q_4 = models.IntegerField(label='Dobbiamo ridurre drasticamente le disuguaglianze tra ricchi e poveri, bianchi e persone di colore, uomini e donne') q_5 = models.IntegerField(label='Siamo andati troppo oltre nel promuovere uguali diritti in questo paese') q_6 = models.IntegerField(label='La discriminazione contro le minoranze è ancora un problema molto serio nella nostra società') q_7 = models.IntegerField(label='A volte il governo ha bisogno di fare leggi che impediscano alle persone di farsi del male') q_8 = models.IntegerField(label='Il governo dovrebbe fare di più per portare avanti gli obiettivi della società, anche se questo significa limitare la libertà e le scelte degli individui') q_9 = models.IntegerField(label='Il governo dovrebbe smettere di dire alla gente come vivere la propria vita') q_10 = models.IntegerField(label='Sembra che neri, donne, omosessuali e altri gruppi non vogliano diritti uguali, vogliono diritti speciali solo per loro') q_11 = models.IntegerField(label='Il governo dovrebbe porre dei limiti alle scelte che gli individui possono fare in modo che essi non intralcino ciò che è bene per la società') q_12 = models.IntegerField(label='Non è compito del governo cercare di proteggere le persone da loro stesse') anger = models.IntegerField(label='Rabbia') blame = models.IntegerField(label='Ti senti in colpa') sympathy = models.IntegerField(label='Simpatia') def get_code(self): return self.code def find_code(self,code_to_find): for player in self.get_others_in_group(): print(player.get_code(),code_to_find,player.id_in_group) if player.get_code() == code_to_find: print(str(code_to_find),str(player.id_in_group),str(player.participant.id_in_session)) return player.id_in_group def set_payoff(self): if self.contribute: self.payoff = 0