from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants import random class InstructionsEsp(Page): def is_displayed(self): return self.round_number==1 class InstructionsGen(Page): def is_displayed(self): return self.round_number==1 class Offer(Page): form_model = 'group' form_fields = ['sent_amount'] def is_displayed(self): return self.player.id_in_group == 1 def vars_for_template(self): mostrar_ronda = True if self.subsession.round_number == 1: mostrar_ronda = False return dict(mostrar=mostrar_ronda) class ExpectationsB(Page): form_model = 'group' form_fields = ['expectation_sent'] def is_displayed(self): return self.player.id_in_group == 2 def vars_for_template(self): mostrar_ronda = True if self.subsession.round_number == 1: mostrar_ronda = False return dict(mostrar=mostrar_ronda) class RoundResults(Page): def before_next_page(self): self.group.choice_player_A = self.group.sent_amount self.group.choice_player_B= self.group.expectation_sent def vars_for_template(self): mostrar_ronda = True if self.subsession.round_number == 1: mostrar_ronda = False return dict(round_paymentA=Constants.endowmentA-self.group.sent_amount,mostrar=mostrar_ronda) class DespuesRondaUno(Page): def is_displayed(self): return self.round_number==1 class ResultsWaitPage(WaitPage): def is_displayed(self): return self.round_number == Constants.num_rounds def after_all_players_arrive(self): num_round = self.session.vars['paying_round'] group = self.group player_A = group.get_player_by_id(1) player_B = group.get_player_by_id(2) player_C = group.get_player_by_id(3) player_A.payoff = Constants.endowmentA - group.in_round(num_round).choice_sent player_B.payoff = group.in_round(num_round).choice_sent player_C.payoff = Constants.endowmentC # método para coger el vector de los valores de mensaje para la ronda escogida Groups = self.subsession.get_groups() ##Creencias para la cantidad enviada por A. values_sent_ammount = [] for g in Groups: values_sent_ammount.append(g.in_round(num_round).choice_sent) # Vector de modas repetitions_1 = 0 for i in values_sent_ammount: aparitions = values_sent_ammount.count(i) if aparitions > repetitions_1: repetitions_1 = aparitions modes_sent_ammount = [] for i in values_sent_ammount: aparitions = values_sent_ammount.count(i) if aparitions == repetitions_1 and i not in modes_sent_ammount: modes_sent_ammount.append(i) if group.in_round(num_round).choice_expected_return in modes_sent_ammount: player_B.payoff += c(3) ##Creencias para B en la última ronda (normas sociales) matching = random.randint(0, len(Groups) - 2) ##pregunta 1 norms_B_s1 = [] for g in Groups: norms_B_s1.append(g.expectation_social_norm_s1_B) norms_B_s1.remove(group.expectation_social_norm_s1_B) if norms_B_s1[matching] == group.expectation_social_norm_s1_B: player_B.payoff += c(1) ##Creencias para C en la última ronda (normas sociales) ##pregunta 1 norms_C_s1 = [] for g in Groups: norms_C_s1.append(g.expectation_social_norm_s1_C) norms_C_s1.remove(group.expectation_social_norm_s1_C) if norms_C_s1[matching] == group.expectation_social_norm_s1_C: player_C.payoff += c(1) class Survey(Page): form_model = 'player' form_fields = ["survey_1","survey_2","survey_3","survey_4","survey_5","survey_6"] def is_displayed(self): return self.round_number==1 class AfterSurvey(Page): def vars_for_template(self): total_correct = 0 correct_1 = "No" if self.player.survey_1 == 100: total_correct += 1 correct_1 = "Sí" correct_2 = "No" if self.player.survey_2 == 0: correct_2 = "Si" total_correct += 1 correct_3 = "No" if self.player.survey_3 == 50: correct_3 = "Si" total_correct += 1 correct_4 = "No" if self.player.survey_4 == 60: correct_4 = "Si" total_correct += 1 correct_5 = "No" if self.player.survey_5 == 40: correct_5 = "Si" total_correct += 1 correct_6 = "No" if self.player.survey_6 == 50: correct_6 = "Si" total_correct += 1 show = False if total_correct < 6: show = True return dict( correct_1=correct_1, correct_2=correct_2, correct_3=correct_3, correct_4=correct_4, correct_5=correct_5, correct_6=correct_6, total_correct=total_correct, show=show ) def is_displayed(self): return self.round_number == 1 class Results(Page): def is_displayed(self): return self.round_number == Constants.num_rounds def vars_for_template(self): num_round = self.session.vars['paying_round'] payoff_B= self.group.in_round(num_round).choice_sent # método para coger el vector de los valores de mensaje para la ronda escogida Groups = self.subsession.get_groups() ##Creencias para la cantidad enviada por A. payment_message_deduction = c(0) values_sent_ammount = [] for g in Groups: values_sent_ammount.append(g.in_round(num_round).choice_sent) # Vector de modas repetitions_1 = 0 for i in values_sent_ammount: aparitions = values_sent_ammount.count(i) if aparitions > repetitions_1: repetitions_1 = aparitions modes_sent_ammount = [] for i in values_sent_ammount: aparitions = values_sent_ammount.count(i) if aparitions == repetitions_1 and i not in modes_sent_ammount: modes_sent_ammount.append(i) if self.group.in_round(num_round).choice_expected_return in modes_sent_ammount: payment_message_deduction += c(3) else: payment_message_deduction+=c(0) ##Creencias para B en la última ronda (normas sociales) matching = random.randint(0, len(Groups) - 2) social_norms_B = c(0) ##pregunta 1 norms_B_s1 = [] correct_1_B = "no" for g in Groups: norms_B_s1.append(g.expectation_social_norm_s1_B) norms_B_s1.remove(self.group.expectation_social_norm_s1_B) if norms_B_s1[matching] == self.group.expectation_social_norm_s1_B: social_norms_B = +c(1) correct_1_B = "Sí" ##Creencias para C en la última ronda (normas sociales) social_norms_C = c(0) ##pregunta 1 norms_C_s1 = [] correct_1_C = "No" for g in Groups: norms_C_s1.append(g.expectation_social_norm_s1_C) norms_C_s1.remove(self.group.expectation_social_norm_s1_C) if norms_C_s1[matching] == self.group.expectation_social_norm_s1_C: social_norms_C += c(1) correct_1_C = "Sí" ##Organización en Labels para la interfaz del jugador. # Normas sociales en la pregunta 1 para B if self.group.expectation_social_norm_s1_B == 0: belief_sn_B1 = "Muy socialmente inapropiada" elif self.group.expectation_social_norm_s1_B == 1: belief_sn_B1 = "Algo socialmente inapropiada" elif self.group.expectation_social_norm_s1_B == 2: belief_sn_B1 = "Algo socialmente apropiada" else: belief_sn_B1 = "Muy socialmente apropiada" # Normas sociales en la pregunta 1 para C if self.group.expectation_social_norm_s1_C == 0: belief_sn_C1 = "Muy socialmente inapropiada" elif self.group.expectation_social_norm_s1_C == 1: belief_sn_C1 = "Algo socialmente inapropiada" elif self.group.expectation_social_norm_s1_C == 2: belief_sn_C1 = "Algo socialmente apropiada" else: belief_sn_C1 = "Muy socialmente apropiada" # Invocamos al "grupo" en la ronda aleatoria. group = self.group.in_round(num_round) # Sobre las expectativas de B de los puntos envíados por A. if group.choice_player_B == c(0): belief_sent = "0 puntos" elif group.choice_player_B == c(10): belief_sent = "10 puntos" elif group.choice_player_B == c(20): belief_sent = "20 puntos" elif group.choice_player_B == c(30): belief_sent = "30 puntos" elif group.choice_player_B == c(40): belief_sent = "40 puntos" else: belief_sent = "50 puntos" # Modas de los puntos enviados por A modes_sent_message = "No" if group.choice_player_B in modes_sent_ammount: modes_sent_message= "Sí" return dict( paying_round=num_round, payoff_B=payoff_B, payment_message_deduction=payment_message_deduction, social_norms_C=social_norms_C, social_norms_B=social_norms_B, correct_1_C=correct_1_C, correct_1_B=correct_1_B, modes_sent=modes_sent_message, belief_sent=belief_sent, belief_sn_B1=belief_sn_B1, belief_sn_C1=belief_sn_C1, ) class WaitForA(WaitPage): wait_for_all_groups = True title_text="Por favor espere a que el resto de participantes tomen sus decisiones." body_text ="De vez en cuando (cada 30 segundos aproximadamente), por favor oprima el botón de teclado F5 para refrescar la conexión de su computador con el servidor del experimento, y así poder avanzar más rápidamente." class WaitForAll(WaitPage): wait_for_all_groups = True title_text="Por favor espere a que el resto de participantes tomen sus decisiones." body_text ="De vez en cuando (cada 30 segundos aproximadamente), por favor oprima el botón de teclado F5 para refrescar la conexión de su computador con el servidor del experimento, y así poder avanzar más rápidamente." class Survey2(Page): def is_displayed(self): total_correct = 0 if self.player.survey_1 == 100: total_correct += 1 if self.player.survey_2 == 0: total_correct += 1 if self.player.survey_3 == 50: total_correct += 1 if self.player.survey_4 == 60: total_correct += 1 if self.player.survey_5 == 40: total_correct += 1 if self.player.survey_6 == 50: total_correct += 1 show = False if total_correct < 6: show = True return show and self.round_number==1 form_model = "player" form_fields = ["survey_7","survey_8"] def error_message(self, values): if values["survey_7"]!=90 or values["survey_8"]!=65: return "Tiene un error en por lo menos una respuesta." class InstructionsLastRoundB(Page): def is_displayed(self): return self.round_number==Constants.num_rounds and self.player.id_in_group==2 class InstructionsLastRoundC(Page): def is_displayed(self): return self.round_number == Constants.num_rounds and self.player.id_in_group == 3 class PcProcedure(Page): def is_displayed(self): return self.round_number==1 class SocialNormsB(Page): form_model='group' form_fields=["expectation_social_norm_s1_B"] def is_displayed(self): return self.round_number==Constants.num_rounds and self.player.id_in_group==2 class SocialNormsC(Page): form_model = 'group' form_fields = ["expectation_social_norm_s1_C"] def is_displayed(self): return self.round_number==Constants.num_rounds and self.player.id_in_group==3 class Payment(Page): def vars_for_template(self): group = self.group player_A = group.get_player_by_id(1) player_B = group.get_player_by_id(2) player_C = group.get_player_by_id(3) player_A_payoff= player_A.payoff player_B_payoff=player_B.payoff player_C_payoff=player_C.payoff payment=self.participant.payoff.to_real_world_currency(self.session) total=self.participant.payoff_plus_participation_fee() return dict(player_A_payoff=player_A_payoff, player_B_payoff=player_B_payoff, player_C_payoff=player_C_payoff, payment=payment, total=total) def is_displayed(self): return self.round_number == Constants.num_rounds class Questionnaire_A(Page): form_model = "player" form_fields = ["q1","q2","q3","q4","q5","q6"] def is_displayed(self): return self.round_number==Constants.num_rounds class Questionnaire_B(Page): form_model = "player" form_fields = ["q7","q8","q9","q10","q11","q12","q13","q14","q15"] def is_displayed(self): return self.round_number==Constants.num_rounds class FinalMessage(Page): def is_displayed(self): return self.round_number==Constants.num_rounds class AllGroupsWaitPage(WaitPage): wait_for_all_groups = True def is_displayed(self): return self.round_number== Constants.num_rounds page_sequence = [ InstructionsGen, InstructionsEsp, PcProcedure, Survey, AfterSurvey, Survey2, WaitForAll, Offer, ExpectationsB, WaitForA, RoundResults, DespuesRondaUno, InstructionsLastRoundB, InstructionsLastRoundC, SocialNormsB, SocialNormsC, AllGroupsWaitPage, ResultsWaitPage, Results, Payment, Questionnaire_A, Questionnaire_B, FinalMessage ]