from otree.api import * import random doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'GameTheoryProject' players_per_group = 2 num_rounds = 6 ENDOWMENT = cu(5) ENDOWMENT2 = cu(10) applicant_ROLE = 'applicant' agent_ROLE = 'employer' round class Subsession(BaseSubsession): pass '''def creating_session(self): if self.round_number == 1: self.group_randomly(fixed_id_in_group=True) else: self.group_like_round(1) print("== Round " , self.round_number, " == ") print(" Matching: ", self.get_group_matrix()) if self.round_number == Constants.num_rounds: print("\n\n")''' class Group(BaseGroup): typing = models.CharField() SignalCost = models.IntegerField() doc = models.CharField() cost = models.IntegerField() choice1 = models.CharField(initial=None, choices=["Good","Actual"], doc="""choice by P1""", lable = "Do you want to signal good typeing or show your actual?" ) choice2 = models.CharField(initial=None, choices=["hire","reject"], doc="""choice by P2""", lable = "Do you want to hire or reject the applicant" ) class Player(BasePlayer): age = models.PositiveIntegerField(label='What is your age?', choices=range(13, 125), initial=None) gender = models.CharField(initial=None, choices=['Male', 'Female', 'Nonbinary'], label='What is your gender?', widget=widgets.RadioSelect()) major = models.CharField(initial=None, choices=['STEM','Fine Arts','Environment','Business',' Social Science','Language','Engineering '], label = 'What is your major?', ) # FUNCTIONS def set_payoffs(group: Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if group.choice1 == "Good" and group.choice2 == "hire" and group.typing == "good": p1.payoff += (Constants.ENDOWMENT - group.SignalCost)+5 p2.payoff += (Constants.ENDOWMENT2 - 5) +9 elif group.choice1 == "Good" and group.choice2 == "reject" and group.typing == "good": p1.payoff += (Constants.ENDOWMENT - group.SignalCost) p2.payoff += Constants.ENDOWMENT2+0 elif group.choice1 == "Actual" and group.choice2 == "reject" and group.typing == "good": p1.payoff += Constants.ENDOWMENT p2.payoff += Constants.ENDOWMENT2 elif group.choice1 == "Actual" and group.choice2 == "hire" and group.typing == "good": p1.payoff += (Constants.ENDOWMENT)+5 p2.payoff += (Constants.ENDOWMENT2-5)+9 elif group.choice1 == "Good" and group.choice2 == "hire" and group.typing == "bad": p1.payoff += (Constants.ENDOWMENT - group.SignalCost)+5 p2.payoff += Constants.ENDOWMENT2 - 5 elif group.choice1 == "Good" and group.choice2 == "reject" and group.typing == "bad": p1.payoff += Constants.ENDOWMENT - group.SignalCost p2.payoff += Constants.ENDOWMENT2 + 0 elif group.choice1 == "Actual" and group.choice2 == "reject" and group.typing == "bad": p1.payoff += Constants.ENDOWMENT p2.payoff += Constants.ENDOWMENT2+0 elif group.choice1 == "Actual" and group.choice2 == "hire" and group.typing == "bad": p1.payoff += Constants.ENDOWMENT+5 p2.payoff += Constants.ENDOWMENT2-5 payoff = p1.payoff def random(group: Group): import random Appstat = ["good","bad"] group.typing = random.choice(Appstat) group.SignalCost =random.randint(0,5) def actualType(group:Group): if group.choice1 == "Actual": group.doc = group.typing elif group.choice1 == "Good": group.doc = "Improved" def actualCost(group:Group): if group.choice1 == "Actual": group.cost = 0 elif group.choice1 == "Good": group.cost = group.SignalCost # PAGES class Demographics(Page): form_model = 'player' form_fields = ['age', 'gender','major'] @staticmethod def is_displayed(player): if player.round_number==1: return True class applicant(Page): form_model = 'player' form_model='group' form_fields = ['choice1'] @staticmethod def is_displayed(player): return player.id_in_group == 1 class employer(Page): form_model = 'player' form_model = 'group' form_fields = ['choice2'] @staticmethod def is_displayed(player): return player.id_in_group == 2 class waitpage(WaitPage): after_all_players_arrive = random class WaitPage4(WaitPage): after_all_players_arrive = actualCost class WaitPage3(WaitPage): after_all_players_arrive = actualType class WaitForP1(WaitPage): pass class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): pass class instructions(Page): @staticmethod def is_displayed(player): if player.round_number==1: return True shuffled = [instructions,Demographics,waitpage,applicant,WaitForP1,WaitPage3,WaitPage4,employer,ResultsWaitPage,Results] page_sequence = shuffled