from otree.api import * c = cu doc = '.\n\nUn juego de bienes publicos (take-something)' class Constants(BaseConstants): name_in_url = 'ExtraccionSV2' players_per_group = 3 num_rounds = 3 endowment1 = cu(12) endowment2 = cu(9) endowment3 = cu(6) ext = 5 RenA = 17 RenB = 5 admin_report_template = 'ExtraccionSV2/admin_report.html' instructiones_template = 'ExtraccionSV2/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_app3 = models.LongStringField() role = role payoff_app = payoff_app class Instrucciones(Page): form_model = 'player' timeout_seconds = 20 @staticmethod def is_displayed(player): return player.round_number == 1 @staticmethod def vars_for_template(player): return dict(rol =player.role()) 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 = 12 @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["app3"]= player.payoff_app() player.payoff_app3 = str (participant.vars["app3"]) page_sequence = [Instrucciones, Contribute1, Contribute2, Contribute3, ResultsWaitPage, Resultspage]