from otree.api import * c = cu doc = 'Buffat & Senn (baseline)' class C(BaseConstants): NAME_IN_URL = 'BG_FULL_C' PLAYERS_PER_GROUP = 4 NUM_ROUNDS = 14 ENDOWMENT = cu(20) INSTRUCTIONSSLIM1_TEMPLATE = 'BG_FULL_C/instructionsslim1.html' class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): session = subsession.session if subsession.round_number == 1: subsession.group_randomly() else: subsession.group_like_round(1) class Group(BaseGroup): total_contribution = models.CurrencyField() individual_share = models.CurrencyField() sum_contributions = models.CurrencyField() def after_all_players_arrive(group: Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p3 = group.get_player_by_id(3) p4 = group.get_player_by_id(4) for p in group.get_players(): # variables creaded 4 feedback in html pages try: p.bribeplayer2 = 0 p1.bribeplayer2 = p2.bribe except TypeError: p2.bribe = None try: p.bribeplayer3 = 0 p1.bribeplayer3 = p3.bribe except TypeError: p3.bribe = None try: p.bribeplayer4 = 0 p1.bribeplayer4 = p4.bribe except TypeError: p4.bribe = None #i created the variable progettocomune for when we will have the exit option (when player exit, contribution = 99 and i need to show in the feedback page "exit"); i think that for now this could be removed for p in group.get_players(): try: p2.progettocomune = p2.contribution except TypeError: p2.contribution = None try: p3.progettocomune = p3.contribution except TypeError: p3.contribution = None try: p4.progettocomune = p4.contribution except TypeError: p4.contribution = None #variables for giving feedback about other players contribution try: p2.progettocomunepl3 = p3.progettocomune p1.progettocomunepl3 = p3.progettocomune p4.progettocomunepl3 = p3.progettocomune except TypeError: p3.progettocomune = None try: p2.progettocomunepl4 = p4.progettocomune p1.progettocomunepl4 = p4.progettocomune p3.progettocomunepl4 = p4.progettocomune except TypeError: p4.progettocomune = None try: p1.progettocomunepl2 = p2.progettocomune p3.progettocomunepl2 = p2.progettocomune p4.progettocomunepl2 = p2.progettocomune except TypeError: p2.progettocomune = None def set_payoff1(group: Group): contributions = 0 bribe = 0 for p in group.get_players(): try: contributions = contributions + p.contribution bribe = bribe + p.bribe except TypeError: p.contribution = None p.bribe = None for p in group.get_players(): group.individual_share = contributions * 0.4 group.sum_contributions = contributions #modifica variabile punizione ai fini del calcolo payoff (la variabile punishment è al livello del player, ma l'arbitro punisce con ogni variabile un solo giocatore: devo perciò "cancellare" i casi vuoti for p in group.get_players(): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p3 = group.get_player_by_id(3) p4 = group.get_player_by_id(4) #mazzetta = sum of bribes offered p1.mazzetta = bribe #punizione = point removed by Participant B * 3 p.punizione2 = p1.punishment2 * 3 p.punizione3 = p1.punishment3 * 3 p.punizione4 = p1.punishment4 * 3 p2.punizione = p4.punizione2 p3.punizione = p4.punizione3 p4.punizione = p4.punizione4 p1.punizione2 = p4.punizione2 p2.punizione2 = p4.punizione2 p3.punizione2 = p4.punizione2 p4.punizione2 = p4.punizione2 p1.punizione3 = p4.punizione3 p2.punizione3 = p4.punizione3 p3.punizione3 = p4.punizione3 p4.punizione3 = p4.punizione3 p1.punizione4 = p4.punizione4 p2.punizione4 = p4.punizione4 p3.punizione4 = p4.punizione4 p4.punizione4 = p4.punizione4 p2.bribeplayer2 = p1.bribeplayer2 p3.bribeplayer2 = p1.bribeplayer2 p4.bribeplayer2 = p1.bribeplayer2 p2.bribeplayer3 = p1.bribeplayer3 p3.bribeplayer3 = p1.bribeplayer3 p4.bribeplayer3 = p1.bribeplayer3 p2.bribeplayer4 = p1.bribeplayer4 p3.bribeplayer4 = p1.bribeplayer4 p4.bribeplayer4 = p1.bribeplayer4 #payoff participants for p in group.get_players(): if p1.bribe2 == 0: #umpire refused the bribe p2.payoff = C.ENDOWMENT - p2.contribution + 5 + group.individual_share - p2.punizione if p1.bribe2 == 1: #umpire accepted the bribe p2.payoff = C.ENDOWMENT - p2.contribution + (5 - p2.bribe) + group.individual_share - p2.punizione if p1.bribe3 == 1: #umpire accepted the bribe p3.payoff = C.ENDOWMENT - p3.contribution + (5 - p3.bribe) + group.individual_share - p3.punizione if p1.bribe3 == 0: #umpire refused the bribe p3.payoff = C.ENDOWMENT - p3.contribution + 5 + group.individual_share - p3.punizione if p1.bribe4 == 0: #umpire refused the bribe p4.payoff = C.ENDOWMENT - p4.contribution + 5 + group.individual_share - p4.punizione if p1.bribe4 == 1: #umpire accepted the bribe p4.payoff = C.ENDOWMENT - p4.contribution + (5 - p4.bribe) + group.individual_share - p4.punizione if p1.bribe2 == 1: p.bribepl2 = p1.bribeplayer2 p2.bribe2 = p1.bribe2 else: p.bribepl2 = 0 p2.bribe2 = p1.bribe2 if p1.bribe3 == 1: p.bribepl3 = p1.bribeplayer3 p3.bribe3 = p1.bribe3 else: p.bribepl3 = 0 p3.bribe3 = p1.bribe3 if p1.bribe4 == 1: p.bribepl4 = p1.bribeplayer4 p4.bribe4 = p1.bribe4 else: p.bribepl4 = 0 p4.bribe4 = p1.bribe4 p1.bribepl2 = p4.bribepl2 #check p1.bribepl3 = p4.bribepl3 p1.bribepl4 = p4.bribepl4 p2.bribe3 = p1.bribe3 p2.bribe4 = p1.bribe4 p3.bribe2 = p1.bribe2 p3.bribe4 = p1.bribe4 p4.bribe2 = p1.bribe2 p4.bribe3 = p1.bribe3 p.valoremazzetta = p1.bribepl2 + p1.bribepl3 + p1.bribepl4 p1.valoremazzetta = p4.valoremazzetta #payoff arbitro p1.payoff = 20 + group.individual_share + 15 - (p1.punishment2 + p1.punishment3 + p1.punishment4) + p.valoremazzetta p2.punizione_fb_umpire = p1.punishment2 p3.punizione_fb_umpire = p1.punishment3 p4.punizione_fb_umpire = p1.punishment4 def fase_uno(group: Group): for p in group.get_players(): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p3 = group.get_player_by_id(3) p4 = group.get_player_by_id(4) contributions = 0 for p in group.get_players(): try: contributions = contributions + p.contribution except TypeError: p.contribution = None for p in group.get_players(): group.total_contribution = contributions * 1.6 group.individual_share = contributions * 0.4 #payoff participants for p in group.get_players(): p2.faseuno = 20 - p2.contribution + group.individual_share p3.faseuno = 20 - p3.contribution + group.individual_share p4.faseuno = 20 - p4.contribution + group.individual_share p1.faseuno = 0 for p in group.get_players(): p2.redditoprivato = C.ENDOWMENT - p2.contribution p3.redditoprivato = C.ENDOWMENT - p3.contribution p4.redditoprivato = C.ENDOWMENT - p4.contribution p1.redditoprivato = 0 Group.after_all_players_arrive = after_all_players_arrive Group.set_payoff1 = set_payoff1 class Player(BasePlayer): Questionbribe = models.IntegerField(choices=[[25, '20 - 10 + 12 + 5 - 2 = 25'], [20, '20 - 10 + 12 - 2 = 20']], label='3) Quanti punti ottieni se trasferisci 2 punti al partecipante B?', widget=widgets.RadioSelect) Questionme = models.IntegerField(choices=[[32, '30 x 1.6 = 48. 48: 4 = 12. 20 + 12 = 32'], [27, '30 x 1.6 = 48. 48 : 4 = 12. 20 - 10 + 12 + 5 = 27']], label='1) Quanti punti ottieni alla fine del periodo, se il partecipante B non ti toglie nessun punto?', widget=widgets.RadioSelect) Question3 = models.IntegerField(choices=[[23, '20 + 12 - 9 = 23'], [18, '20 - 10 + 12 + 5 - 9 = 18']], label='2) Quanti punti ottieni alla fine del periodo, se il partecipante B ti toglie 9 punti?', widget=widgets.RadioSelect) contribution = models.IntegerField(choices=[[0, '0'], [1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7'], [8, '8'], [9, '9'], [10, '10'], [11, '11'], [12, '12'], [13, '13'], [14, '14'], [15, '15'], [16, '16'], [17, '17'], [18, '18'], [19, '19'], [20, '20']], label='Quanto vuoi mettere nel progetto comune?') redditoprivato = models.CurrencyField() faseuno = models.CurrencyField() bribe = models.IntegerField(choices=[[0, 'Nessun punto'], [1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5']], label='Hai a disposizione 5 punti. Indica se e quanti punti vuoi trasferire al Partecipante B') bribe2 = models.IntegerField(choices=[[1, 'Si'], [0, 'No']], initial=700, label='Vuoi accettare i punti che ti ha trasferito il partecipante? ', widget=widgets.RadioSelectHorizontal) bribe3 = models.IntegerField(choices=[[1, 'Si'], [0, 'No']], initial=700, label='Vuoi accettare i punti che ti ha trasferito il partecipante?', widget=widgets.RadioSelectHorizontal) bribe4 = models.IntegerField(choices=[[1, 'Si'], [0, 'No']], initial=700, label='Vuoi accettare i punti che ti ha trasferito il partecipante?', widget=widgets.RadioSelectHorizontal) punishment2 = models.IntegerField(choices=[[0, 'Nessun punto'], [1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7'], [8, '8'], [9, '9'], [10, '10']], label='Indica se e quanti punti vuoi togliere al partecipante ') punishment3 = models.IntegerField(choices=[[0, 'Nessun punto'], [1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7'], [8, '8'], [9, '9'], [10, '10']], label='Indica se e quanti punti vuoi togliere al partecipante ') punishment4 = models.IntegerField(choices=[[0, 'Nessun punto'], [1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7'], [8, '8'], [9, '9'], [10, '10']], label='Indica se e quanti punti vuoi togliere al partecipante ') mazzetta = models.IntegerField() valoremazzetta = models.IntegerField() bribepl2 = models.IntegerField(choices=[], initial=0) bribepl3 = models.IntegerField(initial=0) bribepl4 = models.IntegerField(initial=0) punizione2 = models.IntegerField(choices=[]) punizione3 = models.IntegerField(choices=[]) punizione4 = models.IntegerField(choices=[]) punizione = models.IntegerField() punizione_fb_umpire = models.IntegerField() progettocomune = models.IntegerField() progettocomunepl2 = models.IntegerField() progettocomunepl3 = models.IntegerField() progettocomunepl4 = models.IntegerField() bribeplayer2 = models.IntegerField() bribeplayer3 = models.IntegerField() bribeplayer4 = models.IntegerField() def setglobals(player: Player): participant = player.participant participant.vars['BG_payoff'] = participant.payoff return(participant.vars) def other_player(player: Player): group = player.group return player.get_others_in_group() Player.setglobals = setglobals class Attesagruppixpartire(WaitPage): wait_for_all_groups = True @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Instructions(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Instruction_II(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Instruction_III(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Istruzioni_IV(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Questions(Page): form_model = 'player' form_fields = ['Questionme', 'Question3', 'Questionbribe'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def error_message(player: Player, values): print ('values is', values) if values['Questionme'] != 27 or values['Questionbribe'] !=25 or values['Question3'] != 18: return 'Attenzione: Per procedere è necessario rispondere correttamente a tutte le domande. Per favore controlla le tue risposte.' class Role(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Start(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Contribuzione(Page): form_model = 'player' form_fields = ['contribution'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group != 1 class Fase1(WaitPage): after_all_players_arrive = fase_uno @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group != 1 class Fase1Risultati(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group != 1 class Bribe_Fase2(Page): form_model = 'player' form_fields = ['bribe'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group != 1 class Giocatori(WaitPage): after_all_players_arrive = after_all_players_arrive @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group != 1 class WaitingUmpire(WaitPage): after_all_players_arrive = after_all_players_arrive body_text = 'Attendi che i partecipanti A facciano le loro scelte' @staticmethod def is_displayed(player: Player): group = player.group return group.get_player_by_id(1) class Punishment2bribe(Page): form_model = 'player' form_fields = ['bribe2', 'punishment2', 'punishment3', 'punishment4', 'bribe3', 'bribe4'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 @staticmethod def vars_for_template(player: Player): other = other_player(player) if player.round_number == 1 or player.round_number == 2 or player.round_number == 7 or player.round_number == 9 or player.round_number == 12: return dict( other_ordered = [other[0],other[1], other[2]] ) elif player.round_number == 3 or player.round_number == 6 or player.round_number == 10 or player.round_number == 13 or player.round_number == 15: return dict( other_ordered = [other[1],other[2], other[0]] ) else: return dict( other_ordered = [other[2],other[0], other[1]] ) @staticmethod def error_message(player: Player, values): print ('values is', values) if values['punishment2'] + values['punishment3'] + values['punishment4'] > 15: return 'Attenzione: Puoi rimuovere in totale 15 punti e non più di 10 punti a ciascun giocatore. Per favore effettua nuovamente la tua scelta.' class Attesagiocatori(WaitPage): after_all_players_arrive = after_all_players_arrive @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group != 1 class ExecutingPayoffRound1(WaitPage): after_all_players_arrive = set_payoff1 @staticmethod def is_displayed(player: Player): return player.round_number class PayoffRound1(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 or player.round_number == 3 or player.round_number == 4 or player.round_number == 6 or player.round_number == 8 or player.round_number == 9 or player.round_number == 11 or player.round_number == 13 or player.round_number == 14 @staticmethod def vars_for_template(player: Player): other = other_player(player) if player.round_number == 1 or player.round_number == 2 or player.round_number == 7 or player.round_number == 9 or player.round_number == 12: return dict( other_ordered = [other[0],other[1], other[2]] ) elif player.round_number == 3 or player.round_number == 6 or player.round_number == 10 or player.round_number == 13 or player.round_number == 15: return dict( other_ordered = [other[1],other[2], other[0]] ) else: return dict( other_ordered = [other[2],other[0], other[1]] ) @staticmethod def before_next_page(player: Player, timeout_happened): player.setglobals() player.setglobals class PayoffReshuffle(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 2 or player.round_number == 5 or player.round_number == 7 or player.round_number == 10 or player.round_number == 12 or player.round_number == 15 @staticmethod def vars_for_template(player: Player): other = other_player(player) if player.round_number == 1 or player.round_number == 2 or player.round_number == 7 or player.round_number == 9 or player.round_number == 12: return dict( other_ordered = [other[0],other[1], other[2]] ) elif player.round_number == 3 or player.round_number == 6 or player.round_number == 10 or player.round_number == 13 or player.round_number == 15: return dict( other_ordered = [other[1],other[2], other[0]] ) else: return dict( other_ordered = [other[2],other[0], other[1]] ) @staticmethod def before_next_page(player: Player, timeout_happened): player.setglobals() player.setglobals class Ringraziamento(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 14 page_sequence = [Attesagruppixpartire, Instructions, Instruction_II, Instruction_III, Istruzioni_IV, Questions, Role, Start, Contribuzione, Fase1, Fase1Risultati, Bribe_Fase2, Giocatori, WaitingUmpire, Punishment2bribe, Attesagiocatori, ExecutingPayoffRound1, PayoffRound1, PayoffReshuffle, Ringraziamento]