from otree.api import * c = cu doc = '.\n\nUn juego de bienes publicos (take-something)' class Constants(BaseConstants): name_in_url = 'ExtraccionSVB' players_per_group = 3 num_rounds = 3 endowment1 = cu(12) endowment2 = cu(9) endowment3 = cu(6) ext = 5 RenA = 17 RenB = 5 Answer1 = 114 Answer2 = 99 admin_report_template = 'ExtraccionSVB/admin_report.html' instructiones_template = 'ExtraccionSVB/instructiones.html' def creating_session(subsession): session = subsession.session if subsession.round_number ==1: subsession.group_randomly(fixed_id_in_group = True) else: subsession.group_like_round(1) class Subsession(BaseSubsession): creating_session = creating_session def set_payoffs(group): group.total_contribution = sum([group.contribution1, group.contribution2, group.contribution3]) group.individual_share = (group.total_contribution * Constants.ext) p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p3 = group.get_player_by_id(3) p1.payoff = Constants.RenB*(Constants.endowment1 -group.contribution1) + (Constants.RenA*group.contribution1) - group.individual_share + 80 p2.payoff = Constants.RenB*(Constants.endowment2 - group.contribution2) + (Constants.RenA*group.contribution2) - group.individual_share + 80 p3.payoff = Constants.RenB*(Constants.endowment3 - group.contribution3) + (Constants.RenA*group.contribution3) - group.individual_share + 80 class Group(BaseGroup): total_contribution = models.CurrencyField() individual_share = models.CurrencyField() contribution1 = models.CurrencyField(choices=[[0, '0 fichas'], [1, '1 ficha'], [2, '2 fichas'], [3, '3 fichas'], [4, '4 fichas'], [5, '5 fichas'], [6, '6 fichas'], [7, '7 fichas'], [8, '8 fichas'], [9, '9 fichas'], [10, '10 fichas'], [11, '11 fichas'], [12, '12 fichas']], initial=Constants.endowment1, label='Fichas en la actividad extractiva:', max=Constants.endowment1, min=0) contribution2 = models.CurrencyField(choices=[[0, '0 fichas'], [1, '1 ficha'], [2, '2 fichas'], [3, '3 fichas'], [4, '4 fichas'], [5, '5 fichas'], [6, '6 fichas'], [7, '7 fichas'], [8, '8 fichas'], [9, '9 fichas']], initial=Constants.endowment2, label='Fichas en la actividad extractiva:', max=Constants.endowment2, min=0) contribution3 = models.CurrencyField(choices=[[0, '0 fichas'], [1, '1 ficha'], [2, '2 fichas'], [3, '3 fichas'], [4, '4 fichas'], [5, '5 fichas'], [6, '6 fichas']], initial=Constants.endowment3, label='Fichas en la actividad extractiva:', max=Constants.endowment3, min=0) set_payoffs = set_payoffs def role(player): group = player.group if player.id_in_group == 1: return "Jugador X" if player.id_in_group == 2: return "Jugador Y" if player.id_in_group == 3: return "Jugador Z" def payoff_app(player): return sum([player.in_round(player.round_number - 1).payoff]+[player.in_round(player.round_number-2).payoff]+[player.in_round(player.round_number).payoff]) class Player(BasePlayer): payoff_app1 = models.LongStringField() Comprension1 = models.IntegerField(choices=[[129, '129 puntos'], [114, '114 puntos'], [149, '149 puntos']], label='¿Cuál sería su pago en esta ronda?') Comprension2 = models.IntegerField(choices=[[119, '119 puntos'], [64, '64 puntos'], [99, '99 puntos']], label='¿Cuál sería su pago en esta ronda?') Rol = models.LongStringField() Nombre = models.StringField() Cedula = models.IntegerField() role = role payoff_app = payoff_app class Bienvenida(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.round_number == 1 class Consentimiento(Page): form_model = 'player' form_fields = ['Nombre', 'Cedula'] @staticmethod def is_displayed(player): return player.round_number == 1 class Instrucciones(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.round_number == 1 class Ejemplos(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.round_number == 1 class Desarrollo(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.round_number == 1 class Compresion(Page): form_model = 'player' form_fields = ['Comprension1', 'Comprension2'] @staticmethod def is_displayed(player): return player.round_number == 1 @staticmethod def error_message(player, values): print('values is', values) if values["Comprension1"] != Constants.Answer1: return 'Respuesta a la pregunta 1: 114 puntos ' \ '(+) 12 x 2 = 24 puntos por su inversión en la actividad extractiva. ' \ '(+) 5 x 7 = 35 puntos por las fichas que permanecen en el banco. ' \ '(-) 5 x 5 = 25 puntos menos por la inversión en la actividad extractiva de los demás jugadores. ' \ 'Pago = 80 + 24 + 35 -25 = 114 puntos.' if values["Comprension2"] != Constants.Answer2: return 'Respuesta a la pregunta 2: 99 puntos ' \ '(+) 12 x 7 = 84 puntos por su inversión en la actividad extractiva. ' \ '(+) 5 x 2 = 10 puntos por las fichas que permanecen en el banco. ' \ '(-) 5 x 15 = 75 puntos menos por la inversión en la actividad extractiva de los demás jugadores. ' \ 'Pago = 80 + 84 + 10 -75 = 99 puntos.' class Resultscompre(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.round_number == 1 class Contribute1(Page): form_model = 'group' form_fields = ['contribution1'] timeout_seconds = 20 @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class Contribute2(Page): form_model = 'group' form_fields = ['contribution2'] timeout_seconds = 20 @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 2 class Contribute3(Page): form_model = 'group' form_fields = ['contribution3'] timeout_seconds = 20 @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 3 class ResultsWaitPage(WaitPage): after_all_players_arrive = 'set_payoffs' body_text = 'Waiting for other participants to contribute.' class Resultspage(Page): form_model = 'player' timeout_seconds = 10 @staticmethod def vars_for_template(player): group = player.group if player.id_in_group == 1: return { "PagoA": group.contribution1 * 12, "PagoB": (12 - group.contribution1) * 5, "Banco": (12 - group.contribution1), "Ext": (group.contribution2 + group.contribution3), "Costo" : (group.contribution2 + group.contribution3) * 5 } if player.id_in_group == 2: return { "PagoA": group.contribution2 * 12, "PagoB": (9 - group.contribution2) * 5, "Banco": (9 - group.contribution2), "Ext": (group.contribution1 + group.contribution3), "Costo" : (group.contribution1 + group.contribution3) * 5 } if player.id_in_group == 3: return { "PagoA": group.contribution3 * 12, "PagoB": (6 - group.contribution3) * 5, "Banco":(6 - group.contribution3), "Ext": (group.contribution1 + group.contribution2), "Costo" : (group.contribution1 + group.contribution2) * 5 } @staticmethod def before_next_page(player, timeout_happened): participant = player.participant if player.round_number == 3: participant.vars["app1"]= player.payoff_app() player.payoff_app1 = str (participant.vars["app1"]) participant.vars["rol"]= player.role() player.Rol = str (participant.vars["rol"]) page_sequence = [Bienvenida, Consentimiento, Instrucciones, Ejemplos, Desarrollo, Compresion, Resultscompre, Contribute1, Contribute2, Contribute3, ResultsWaitPage, Resultspage]