import random from collections import Counter from otree.api import * doc = """ The principal offers a contract to the agent, who can decide if to reject or accept. The agent then chooses an effort level. The implementation is based on Gaechter and Koenigstein (2006) . """ # """Define shuffling method""" class Subsession(BaseSubsession): pass # """Define constants""" class C(BaseConstants): NAME_IN_URL = "shareholder_manager_DE_after" PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 class Group(BaseGroup): most_chosen_charity = models.StringField() def creating_session(subsession): for p in subsession.get_players(): if not p.participant.vars.get("total_spillover"): p.participant.vars["total_spillover"] = 0 p.participant.vars["svo_result"] = 0 p.participant.vars["bret_result"] = 0 p.participant.vars["main_result"] = 0 class Player(BasePlayer): charity_choice = models.StringField( choices=[ ["Proje 1: Çöpüne sahip çık", "Proje 1"], ["Proje 2: Köy Okulları Gelişim Derneği", "Proje 2"], ["Proje 3: HAÇİKO (Hayvanları Çaresizlik ve İlgisizlikten Koruma Derneği)", "Proje 3"], ["Proje 4: Çorbada Tuzun Olsun Derneği", "Proje 4"], ["Proje 5: SistersLab | Bilim ve Teknolojide Kadın Derneği", "Proje 5"], ["Proje 6: İZEV (İstanbul Zihinsel Engelliler İçin Eğitim ve Dayanışma Vakfı)", "Proje 6"], ], widget=widgets.RadioSelect, verbose_name="", ) sex = models.StringField( choices=[["f", "Kadın"], ["m", "Erkek"], ["o", "Diğer"]], # edited widget=widgets.RadioSelect, verbose_name="Cinsiyetiniz?", ) age = models.IntegerField( verbose_name="Yaşınız?", min=0, max=100, ) country = models.StringField(verbose_name="Hangi ülkenin vatandaşısınız?") studies = models.StringField(verbose_name="Bölümünüz/ branşınız nedir?") donor = models.BooleanField( choices=[[True, "Evet"], [False, "Hayır"]], widget=widgets.RadioSelect, verbose_name="Daha önce sivil toplum kuruluşlarına bağış yaptınız mı?", ) future_donor = models.BooleanField( choices=[[True, "Evet"], [False, "Hayır"]], widget=widgets.RadioSelect, verbose_name="İlerde sivil toplum kuruluşlarına bağış yapmayı planlıyor musunuz?", ) # FUNCTIONS # PAGES class CharityChoice(Page): @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS timeout_seconds = 2 * 60 form_model = "player" form_fields = ["charity_choice"] class Demographics(Page): timeout_seconds = 60 @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS form_model = "player" form_fields = ["sex", "age", "country", "studies", "donor", "future_donor"] class WaitPageForCharityChoice(WaitPage): @staticmethod def after_all_players_arrive(group: Group): chosen_charities = [] for p in group.get_players(): chosen_charities.append(p.charity_choice) c = Counter(chosen_charities) chosen_charity = c.most_common(1)[0][0] if not chosen_charity: chosen_charity = "Project 1: Çöpüne sahip çık" group.most_chosen_charity = chosen_charity class FinalResults(Page): @staticmethod def vars_for_template(player: Player): return { "total_spillover": cu(player.participant.vars["total_spillover"]), "svo_result": player.participant.vars["svo_result"], "bret_result": player.participant.vars["bret_result"], "main_result": cu(player.participant.vars["main_result"]), "sum_of_spillover_and_payoff": player.participant.payoff + player.participant.vars["total_spillover"], } page_sequence = [CharityChoice, Demographics, WaitPageForCharityChoice, FinalResults]