from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = 'Siyu' doc = """ Co-creation Effort """ class Constants(BaseConstants): name_in_url = 'conduct_cocreation_t1' players_per_group = 2 num_rounds = 2 Task1_template = 'conduct_cocreation_t1/Instructions.html' cost=0.01 theta=30 # risk_random = random.randint(1, 10) "n=1, delta=1" class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: self.group_randomly(fixed_id_in_group=True) else: self.group_like_round(1) for player in self.get_players(): player.random_n = random.randint(-30, 30) player.risk_random = random.randint(1, 10) print('player random number is', player.random_n) def do_my_shuffle(self): self.group_randomly() class Group(BaseGroup): firm_effort=models.IntegerField(min=0, max=120, doc="""Firm's Effort""",) firm_price=models.IntegerField(min=0, max=120, doc="""Firm's Price""",) student_effort=models.IntegerField(min=0, max=120, doc="""Student's Effort""") student_buy= models.BooleanField() def set_payoffs(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) if self.student_buy: p1.payoff = self.firm_price - self.firm_effort*self.firm_effort*Constants.cost p2.payoff = self.firm_effort + self.student_effort - self.firm_price - self.student_effort*self.student_effort*Constants.cost+p2.random_n else: p1.payoff = - self.firm_effort*self.firm_effort*Constants.cost p2.payoff = - self.student_effort*self.student_effort*Constants.cost class Player(BasePlayer): random_n = models.IntegerField() risk_random = models.IntegerField() share = models.CurrencyField(min=0,max=10) post_questinnaire_payoff = models.CurrencyField() r1 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[[1, 'Option A: 1/10 of 20 points, 9/10 of 16 points'], [2, 'Option B: 1/10 of 38.5 points, 9/10 of 1 point'], ]) r2 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[[1, 'Option A: 2/10 of 20 points, 8/10 of 16 points'], [2, 'Option B: 2/10 of 38.5 points, 8/10 of 1 point'], ]) r3 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[[1, 'Option A: 3/10 of 20 points, 7/10 of 16 points'], [2, 'Option B: 3/10 of 38.5 points, 7/10 of 1 point'], ]) r4 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[[1, 'Option A: 4/10 of 20 points, 6/10 of 16 points'], [2, 'Option B: 4/10 of 38.5 points, 6/10 of 1 point'], ]) r5 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[[1, 'Option A: 5/10 of 20 points, 5/10 of 16 points'], [2, 'Option B: 5/10 of 38.5 points, 5/10 of 1 point'], ]) r6 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[[1, 'Option A: 6/10 of 20 points, 4/10 of 16 points'], [2, 'Option B: 6/10 of 38.5 points, 4/10 of 1 point'], ]) r7 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[[1, 'Option A: 7/10 of 20 points, 3/10 of 16 points'], [2, 'Option B: 7/10 of 38.5 points, 3/10 of 1 point'], ]) r8 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[[1, 'Option A: 8/10 of 20 points, 2/10 of 16 points'], [2, 'Option B: 8/10 of 38.5 points, 2/10 of 1 point'], ]) r9 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[[1, 'Option A: 9/10 of 20 points, 1/10 of 16 points'], [2, 'Option B: 9/10 of 38.5 points, 1/10 of 1 point'], ]) r10 = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[[1, 'Option A: 10/10 of 20 points, 0/10 of 16 points'], [2, 'Option B: 10/10 of 38.5 points, 0/10 of 1 point'], ]) age = models.IntegerField(min=16, max=70) gender = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, 'Female'], [2, 'Male'], [3, 'I prefer not to say'],]) major=models.StringField() gpa = models.FloatField(min=0, max=5) ethnicity = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, 'African Americans'], [2, 'Asian / Pacific Islander'], [3, 'Caucasian'],[4, 'Hispanic or Latino'],[5, 'Native American'],[6, 'I prefer not to say'],]) def other_player(self): return self.get_others_in_group()[0] def set_payoff(self): if self.r3 == 1 and self.risk_random <= 3: self.post_questinnaire_payoff = self.other_player().share - self.share + c(10)+c(20) elif self.r3 == 1 and self.risk_random >= 4: self.post_questinnaire_payoff = self.other_player().share - self.share + c(10)+c(16) elif self.r3 == 2 and self.risk_random <= 3: self.post_questinnaire_payoff = self.other_player().share - self.share + c(10)+c(38.5) elif self.r3 == 2 and self.risk_random >= 4: self.post_questinnaire_payoff = self.other_player().share - self.share + c(10)+c(1)