from otree.api import * c = cu doc = '.\n\nUn juego de bienes publicos (take-something)' class Constants(BaseConstants): name_in_url = 'ExtraccionSV4' 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 = 'ExtraccionSV4/admin_report.html' instructiones_template = 'ExtraccionSV4/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_app7 = models.LongStringField() amb_1 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='Estamos aproximándonos al número límite de personas que la tierra puede soportar o mantener.', widget=widgets.RadioSelect) amb_2 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='Los seres humanos tienen derecho a modificar el medio ambiente natural para satisfacer sus necesidades.', widget=widgets.RadioSelect) amb_3 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='Cuando los seres humanos interfieren con la naturaleza, las consecuencias son a menudo desastrosas.', widget=widgets.RadioSelect) amb_4 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='La inventiva humana asegurará que no convirtamos la Tierra en inhabitable.', widget=widgets.RadioSelect) amb_5 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='Los seres humanos están abusando severamente del medio ambiente.', widget=widgets.RadioSelect) amb_6 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='La tierra tiene recursos naturales en abundancia y sólo tenemos que aprender cómo desarrollarlos.', widget=widgets.RadioSelect) amb_7 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='Las plantas y los animales tienen tanto derecho a existir como los seres humanos. ', widget=widgets.RadioSelect) amb_8 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='El equilibrio de la naturaleza es lo bastante fuerte como para ajustarse a los impactos de los países industriales modernos.', widget=widgets.RadioSelect) amb_9 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='Pese a nuestras especiales capacidades, los seres humanos seguimos estando sujetos a las leyes de la naturaleza.', widget=widgets.RadioSelect) amb_10 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='La llamada “crisis ecológica” de la humanidad ha sido muy exagerada. ', widget=widgets.RadioSelect) amb_11 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='La tierra es como una nave espacial con espacio y recursos muy limitados.', widget=widgets.RadioSelect) amb_12 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='Los seres humanos fueron creados para dominar sobre el resto del mundo natural.', widget=widgets.RadioSelect) amb_13 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='El equilibrio de la naturaleza es muy delicado y fácil de perturbar. ', widget=widgets.RadioSelect) amb_14 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='Los seres humanos aprenderán lo suficiente sobre el funcionamiento de la naturaleza para ser capaces de controlarla. ', widget=widgets.RadioSelect) amb_15 = models.StringField(choices=[['1', 'Fuertemente en desacuerdo'], ['2', 'En desacuerdo'], ['3', 'Ni de acuerdo ni en desacuerdo'], ['4', 'De acuerdo'], ['5', 'Fuertemente de acuerdo']], label='Si las cosas continúan como hasta ahora, pronto experimentaremos una gran catástrofe ecológica', widget=widgets.RadioSelect) coop_1 = 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']], label='Cuando alguien me hace un favor, estoy dispuesto a devolverlo. ') coop_2 = 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']], label='Si me tratan muy injustamente, tomaré revancha en la primera ocasión, incluso aunque deba pagar un costo por ello. ') coop_5 = 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']], label='¿Qué tan dispuesto esta usted a castigar a alguien que lo(a) trata a usted injustamente, incluso cuando existan riesgos para usted de sufrir consecuencias personales?') coop_3 = models.StringField(choices=[['SI', 'SI'], ['NO', 'NO']], label='¿Le daría al extraño uno de los obsequios como agradecimiento? ') coop_4 = models.IntegerField(choices=[[1, 'No, no le entregaría ningún obsequio '], [2, 'El obsequio que cuesta 1.500 Pesos '], [3, 'El obsequio que cuesta 3.000 Pesos '], [4, 'El obsequio que cuesta 4.500 Pesos '], [5, 'El obsequio que cuesta 6.000 Pesos '], [6, 'El obsequio que cuesta 7.500 Pesos '], [7, 'El obsequio que cuesta 9.000 Pesos ']], label='¿Qué obsequio le entregaría?') coop_6 = 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']], label='¿Qué tan dispuesto(a) esta usted a castigar a alguien que trata a los demás injustamente, incluso cuando existan riesgos para usted de sufrir consecuencias personales?') Estrato = models.IntegerField(label='¿En cuál estrato está ubicada su casa?') Genero = models.IntegerField(blank=True, choices=[[1, 'Mujer'], [0, 'Hombre']], label='¿Cuál es su género?') Exp = models.StringField(choices=[['SI', 'SI'], ['NO', 'NO']], label='¿Ha participado en actividades similares a ésta (experimentos económicos)? ') carrera = models.StringField(label='¿De cuál carrera (pregrado) se graduó o cuál está cursando?') Daviplata = models.StringField(label='Daviplata o Nequi') Neq_Dav = models.StringField(choices=[['Nequi', 'Nequi'], ['Daviplata', 'Daviplata']], label='¿Prefiere que el pago se realice por Nequi o por Daviplata?') correo = models.LongStringField(label='¿Cuál es su correo institucional?') identificador = models.StringField(label='Etiqueta') 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["app7"]= player.payoff_app() player.payoff_app7 = str (participant.vars["app7"]) class Finalpayoff(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.round_number == 3 @staticmethod def before_next_page(player, timeout_happened): participant = player.participant pagos= [participant.vars["app1"],participant.vars["app2"],participant.vars["app3"],participant.vars["app4"],participant.vars["app5"],participant.vars["app6"],participant.vars["app7"]] import random participant.payoff = random.choice (pagos) class Ambiental(Page): form_model = 'player' form_fields = ['amb_1', 'amb_2', 'amb_3', 'amb_4', 'amb_5', 'amb_6', 'amb_7', 'amb_8', 'amb_9', 'amb_10', 'amb_11', 'amb_12', 'amb_13', 'amb_14', 'amb_15'] @staticmethod def is_displayed(player): return player.round_number == 3 class Cooperacion(Page): form_model = 'player' form_fields = ['coop_1', 'coop_2', 'coop_3', 'coop_4', 'coop_5', 'coop_6'] @staticmethod def is_displayed(player): return player.round_number == 3 class Cuestionario(Page): form_model = 'player' form_fields = ['Estrato', 'Genero', 'Exp', 'carrera', 'correo', 'identificador'] @staticmethod def is_displayed(player): return player.round_number == 3 class Gananciasfinales(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.round_number == 3 page_sequence = [Instrucciones, Contribute1, Contribute2, Contribute3, ResultsWaitPage, Resultspage, Finalpayoff, Ambiental, Cooperacion, Cuestionario, Gananciasfinales]